Индивидуальный Ключ Защиты (ИКЗ)




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

64 Comments

  1. Андрей80

    опробуем спс.

    Reply
  2. wacko

    61 скачка и 3 комментария не по теме — печаль… 🙁

    Reply
  3. wacko

    Ну скажите хоть кто-нибудь использовать будет, а то как то аж грустно 🙁

    Reply
  4. a_titeev

    сгодится… тока поправь:

    Процедура ПередНачаломРаботыСистемы(Отказ)
    …
    Отказ = НЕ ДанныеКлюча.РазрешитьДоступ;
    КонецПроцедуры
    

    и

    Вычислить(Ключ.Пользователь = ДанныеДляПроверки) 

    не нада писать… просто

    Ключ.Вставить(«РазрешитьДоступ»,Ключ.Пользователь = ДанныеДляПроверки);
    Reply
  5. wacko

    100 скачек, 1 отзыв по теме, прогресс 😮

    Reply
  6. Еле

    спасибо

    Reply
  7. 4ulok

    Идея хорошая и реализовано простенько и со вкусом.А по сети это возможно пустить?

    Reply
  8. 4ulok

    Рекомендую! 🙂

    Reply
  9. MadKlop

    (15) в смысле «по сети пустить»? работает в пределах базы, неважно откуда ты заходишь

    Reply
  10. 4ulok

    (17) т.е. одна флешка,на одной машине в сети, а пользователей много,я правильно понимаю?

    Reply
  11. wacko

    (18) т.е. Индивидуальный ключ защиты 🙂 подразумевает 1 флешка в одни руки, т.е. даже зная пароль пользователя — в базу врага не пустит 🙂

    ну и соответственно — забыл флешку — день потерян 🙂

    Reply
  12. mdzen

    С изменениями (11) взлетело 😎 .

    А как ключи делать? …

    … ага вроде разобрался.

    Стоит добавить в конфу обработочку с примером использования….

    Reply
  13. 4ulok

    (18) вот теперь ясно ))

    Reply
  14. mdzen

    💡 В модуле приложения предусмотреть вывод предупреждения, иначе если нет ключа конфигурация не загружается без всяких объяснений:

    Процедура ПередНачаломРаботыСистемы(Отказ)
    …..
    …..
    ЕСли   Не ДанныеКлюча.РазрешитьДоступ Тогда
    Предупреждение(«Доступ запрещен! Ключ защиты не найден!»);
    Отказ = НЕ ДанныеКлюча.РазрешитьДоступ;
    КонецЕсли;
    КонецПроцедуры
    
    

    Показать

    Reply
  15. wacko

    (20) там комментирован код подробно, если я добавлю еще и реализацию, то буду продавать как независимое внедрение 😉

    Reply
  16. wacko

    (22) Вот так реализовано у меня (УТ, МодульУправленияПользователями, ПроверитьВозможностьРаботыПользователя(Отказ))

    ——

     Если ЗначениеЗаполнено(ПараметрыСеанса.КлючЗащиты) Тогда
    ДанныеКлюча = Новый Структура;
    Аурум.ПолучитьСформироватьДанныеКлючаЗащиты(ДанныеКлюча);
    Отказ = НЕ ДанныеКлюча.РазрешитьДоступ;
    #Если Клиент Тогда
    Если Отказ Тогда
    Предупреждение(«У текущего пользователя нет прав, для запуска информационной базы.», 10, «Неверный ключ защиты»);
    КонецЕсли;
    #КонецЕсли
    КонецЕсли; 

    Показать

    Reply
  17. mdzen

    (23) Вижу ответ в шапке новости. Спасибо. Идея класс …. 😎

    Reply
  18. wacko

    Добавил «демо» базу с реализацией.

    ВНИМАНИЕ: демо — как пример использования, а не как руководство по составлению кода 😉

    Reply
  19. provnick

    идея интересная+

    Reply
  20. Lex_Liven

    В терминале работать не будет((( Если работа идет как в терминале (географически удаленные точки), так и по сети, то надо как-то разделять их… А так — идея классная.

    А eToken так подключить можно? 😉

    Reply
  21. wacko

    (28) думаю можно и етокен, если посмотреть 😉

    а насчет терминала — нужно попробовать.

    Не понял про «по сети», это ИКЗ в 1 компе а сам на другом, так что ли?

    Это как войти в свою квартиру через дверь соседа… нет уж, у тебя есть рабочее место — сел, вставил ИКЗ — работаешь 🙂

    А то получится я «сел, вставил свой ИКЗ — работаю», а ты с другого компа под моим паролем бамс и тама? 🙂

    Reply
  22. wacko

    Добавил изменения для 7.7, может кому пригодится

    Reply
  23. sttt

    (4) а что тут комментировать! за комментировал и пользуйся дальше :0))

    Reply
  24. Lex_Liven

    (31) Закомментировать код сможет только тот, у кого есть доступ к конфигурации, а подобный доступ кому попало давать не стоит. Хотя, конечно, данный код никак не защитит Конфигуратор.

    Reply
  25. wacko

    (31) Вносить изменения в конфу как комплект поставки без исходного кода, тогда — буй там плавал а не код комментить.

    Reply
  26. wacko

    Кто-нибудь уже внедрил ? 🙂

    Reply
  27. Altair777

    (30)

    Добавил изменения для 7.7, может кому пригодится

    Куда добавил? Где можно прочитать про способы работы с 7.7?

    Reply
  28. wacko

    (35)

    Для 7.7 в шапке есть функция возврата ком по моникеру, ну а сам код под 7.7 изменить думаю займет минут 10

    Reply
  29. Altair777

    (36) т.е. каждый 7-ник должен скачать версию для 8-ки, а потом еще и поменять ее?

    А может, Вы сами сделаете такую 7-ную версию? Это же 10 минут всего 😉

    А людям будет удобно.

    Reply
  30. wacko

    (37) люди уже на 8.2 бодаются, думаю не стоит тянуть за собой то, что уже не актуально(7.7), к тому же нет возможности работать с клюшками

    Reply
  31. Altair777

    (38) вот именно, что бодаются 😀

    Reply
  32. wacko

    Добавил выгрузку для 8.2 (не конвертировано а переписано 🙂 )

    Reply
  33. 4ulok

    а что если какой-нибудь «злыдень» утащит файл с флешки и вытащит пароль?возможно ли закрыть физический доступ к флешке,но не программный?

    Reply
  34. wacko

    (41) Ну «злыдню» нужно еще серийник флешки перепрошить, защита идет в связке имя пользователя + пароль + серийник 🙂

    Reply
  35. wacko

    (41) Добавил обработку, для «скрытия» ИКЗ из списка дисков, при старте 1С «скроет» при выходе из 1С «откроет»

    почему в «»?, да потому что не видит только виндовый эксплорер, все остальные менеджеры будут видеть.

    Reply
  36. Русский

    А смысл, если ключ HASP HL Pro стоит от 700 руб. (практически как флешка)? 😉

    Reply
  37. Русский

    А если использовать сразу сетевой HASP… Так на 10 рабочих месте это получается значительно дешевле 10 флешек ❗

    Reply
  38. wacko

    (45) — > (29)

    Узнал пароль любого из 10 рыл и работай, воруй данные, сливай все врагам 🙂

    Reply
  39. Русский

    (46) там технология немного другая: 1 ключ — 1 программа… Но с помощью ключей и пароли хранить можно, половина из них имеет встроенную память 😉

    Reply
  40. wacko

    (47) Ничего не понял, но было интересно… 1 ключ — 1 программа.. ключ сетевой на 10 пользователей, ключ торчит постоянно т.к. работает хотя бы 1 из 10 пользователей, что мешает мне, как «корпоративному шпиону» войти под другими 9 (1 из 9) пользователями?

    ИКЗ создан для:

    1. Личного использования

    2. Выработки дисциплины (забрал домой после работы, сутра принес, если оставил в компе- штраф)

    3. Защиты инфы, нет ключа — нет инфы.

    Он для того и «индивидуальный», что бы всяких хитрожопыхумных отвадить от базы.

    Reply
  41. Русский

    (48) ну Вы даете… Храните все эти же данные сетевом ключе, никто не запрещает. Насмотрелись на платформу, которой любой ключ (подходящел модели) подсунул и она работает, все намного серьезнее, примерно те же маневры, что и в случае с флешкой, можно проделать и с ключом хасп, только намного надежнее, плюс по цене выходит ну ни чуть не дороже, а то и дешевле. Аппаратные ключи как раз для этого и предназначены, а то, что вместо ботинок можно надевать полиэтиленовые пакеты на ноги, ну ни чуть не выдвигает последние, как альтернативу обуви 😉

    Reply
  42. wacko

    (49) Ну так объясните мне, чем ваша система, основанная на хасп, надежнее? Тем что сам хасп защищен? Распишите принцип работы с сетевым ключом, возможно я не так все понял. У меня просто флешки на 2Гб (стоимостью 200р за шт) служат не только как ИКЗ, но и как хранилище для почты и покупать «альтернативу» за 700р. с 128 метрами на борту — считаю бредом.

    Reply
  43. Русский

    (50) вот преимущества:

    http://www.aladdin-rd.ru/catalog/hasp/hasp_srm/tech_details.php

    во всяком случае, перед флешкой это точно преимущество 😉 И Вас, уважаемый, немного понесло, считать привязку к флешке альтернативой аппаратной защите — явный перебор 😀 А то, что на ключ защиты нельзя запихать пару фильмов, это вообще не недостаток.

    Reply
  44. Abadonna

    (19)

    ну и соответственно — забыл флешку — день потерян

    Сдохла флешка — день потерян

    Сдох порт USB — день потерян

    В терминальном режиме как? 100 USB портов на теминальном сервере и все в очередь на вставку? (метод расшаривания флех на компах юзверей не предлагать!)

    Приветствую, вас, мои параноики

    В точку!

    P.S. Наш сисадмин на предложение просто разрешить юзверям использование USB-портов и втыкания ими флешек туда вообще скажет как Никулин вороватому завскладом:

    Разбить поллитру? Да я тебя!..
    Reply
  45. wacko

    (52) В одной конторе вообще сисблоки не доступны, так что тут как в анекдоте «не каждый алгоритм, разработанный программистом, подходит конечному пользователю», как быть?

    (51) На мой вопрос «чем хасп лучше усб» вы отвечаете «чем усб», так что, уважаемый, нравится хасп — привязывайтесь к хасп 😎 . И я смотрю много дала аппаратная «защита» 1С 😀

    Reply
  46. Abadonna

    (53)

    В одной конторе вообще сисблоки не доступны

    Супер-правильная контора 😀 Мы немного не доросли. Хотя у нас доступность сисблоков дает только возможность комп включить/выключить 😉

    Reply
  47. wacko

    (54) Все зависит от конторы, если ФАПСИ — то да, так и нужно, в любом случае, если человек не хочет работать — он не будет, мне вон комп выключи, так я на перекуры бегать буду… и как кто-то сказал: «90% вирусов находятся в 70см от монитора»

    Reply
  48. Abadonna

    (55) Просто у нас задача состоит в том, чтобы информацию не спёр как раз тот, у кого есть «индивидуальный ключ защиты».

    А другие у нас просто ¡No pasarán!.

    Reply
  49. wacko

    (56) в этом случае вам не поможет даже сканер сетчатки глаза и отпечатков пальцев, т.к. информацию все равно сливает тот, у кого есть доступ. В этом и заключается проблема безопасности, тот у кого нет доступа не может слить и платит тому у кого доступ есть.

    Reply
  50. Abadonna

    (57)

    , тот у кого нет доступа не может слить и платит тому у кого доступ есть.

    Во! Хоть какая-то польза, кто-то бабло получит 😀 😀

    Reply
  51. YVolohov

    Писал нечто подобное. Правда задача была другая — привязать конфигурацию к конкретной флешке, для защиты от копирования. Слабость такой защиты в том, что можно очень легко сделать образ флешки и залить на другую флешку. Получим совершенно идентичный ключ.

    http://infostart.ru/public/20040/

    Reply
  52. wacko
    YVolohov пишет:

    Писал нечто подобное. Правда задача была другая — привязать конфигурацию к конкретной флешке, для защиты от копирования. Слабость такой защиты в том, что можно очень легко сделать образ флешки и залить на другую флешку. Получим совершенно идентичный ключ.

    Даже не рядом, я привязался как минимум к 3 параметрам (файл,метка,серийник), вы же только к файлу на флешке, сдается мне если я закину файл на диск «С:» (да хоть на «Ж»), то конфа будет работать…

    Reply
  53. spy-832

    бредятина полнейшая. (29) вообще улет

    защита должна быть такая которую трудно снять, чего не скажешь в данном случае

    Reply
  54. v3rter

    Кстати, есть способ не отключать USB-порты, а запрещать съёмные носители.

    Т.е. флешка определяется, буква диска назначается, а диск «не вставлен».

    Хорошо бы предусмотреть разные параметры и возможность гибко настраивать их связки.

    Параметры, например, такие — мак-адрес сетевой карты, пользователь системы,

    пользователь 1С, серийник флешки (смарт-карты).

    Reply
  55. wacko

    (62) Ну поделись «снятием» этой защиты, без ковыряния в коде.

    (63) Никто не ограничивает доработку ИКЗ под свои нужды, код я вроде не закрывал, дерзайте, ибо мне уже не интересно, т.к. это не приносит мне ни какого дохода.

    Reply
  56. nedo

    когда-нибудь скачаю и попробую!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    Reply
  57. arjuna

    хрень!

    Reply
  58. dvim

    (54) Abadonna,

    Я понял тут важна не «доступность» блоков, а верификация.

    У нас сменные сотрудники работали под 1 паролем,убеждения не помогали. Как косяк и отвечать надо — сразу навели порядок 🙂

    PS

    Интересно было бы решение со сканерами отпечатков пальцев, они вроде недорогие

    Reply
  59. serega3333

    реализация хорошая, надо допиливать конечно

    Reply
  60. wacko

    (68) Допиливание — основная часть работы одинесников, дерзайте 🙂

    Reply
  61. ~gekK@~

    возможно кому-то и пригодится, но, думаю, не многим

    Reply
  62. zodus

    интересная затея

    Reply
  63. Naposaram

    а что имеется ввиду под серийным номером флешки? Тот номер который присваивается ОС или тот что вшит с завода?

    Reply
  64. panihinnv

    Задумка интересная

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *