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




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

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

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

<?php // Полная загрузка сервисных книжек, создан 2026-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 не будет опубликован. Обязательные поля помечены *