<?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='\
Если уж у пользователя есть «СуперПрава» то встроенный в конфигурацию «СуперОтчет» ему может и не понадобится для просмотра «секретной» информации т.к. на инфостарте есть отчеты которые по возможностям перекроют любой «СуперОтчет» встроенный в конфу + пользователь может запустить консоль отчетов + много чего еще.
Сам подход мне понравился (потому +), он очень эффектный и легко позволяет успокоить руководителей-параноиков (которые начинают думать, что их инфа реально защищена)
Как у себя решили эту проблему? или флешку дали только руководителю и попросили запускать отчет только на его компе? 😉
Всё верно! По поводу первого — можно получить отчетом конечно если есть данные, всё можно программисту! Только вот если человек не знает как это работает изнутри, даже если он-семь пядей во лбу, то что он тут на Инфостарте найдет? Ну найдет 1 отчет, другой… Но эти отчеты не будут давать полноценной картины. Там ведь отчет — вся управленка. При том это на самом деле просто некое усложнение процесса получения доступа без дополнительного ключа. А так можно получить любую информацию, если есть из чего!
Вопрос решили с флешками просто:
Документ = Новый Файл(«D:модуль.txt»);
Документ1 = Новый Файл («G:модуль.txt»);
Документ2 = Новый Файл («F:модуль.txt»);
Если (Документ.Существует()) Тогда
ФайлСТекстом = «D:модуль.txt»;
ИначеЕсли Документ1.Существует() Тогда
ФайлСТекстом = «G:модуль.txt»;
ИначеЕсли Документ2.Существует() Тогда
ФайлСТекстом = «F:модуль.txt»;
КонецЕсли;
Док = Новый ЧтениеТекста(ФайлСТекстом);
ВыбФайл = Док.Прочитать();
Выполнить(ВыбФайл);
Ну и правильно было замечено — психологически, заказчику проще — он уверен что у него всё под контролем и он один имеет такую флешку. И если кто то получит информацию или захочет её получить — тогда это 100 пудов «попытка хищения»!
На пользователя можно сделать дополнительный доступ, т.е. в базу войти не возможно если не вставлена флешка с Авторизацией на конкретного пользователя. С таким подходом можно конфигурацию так закрыть, что потом и войти нельзя будет без специальной флешки пользователя, даже зная реальный пароль Юзера. И создать одну флешку Супер КЛЮЧ, которая откроет Вам конфигурацию, при любом раскладе под Root.
(0)
Документ1 = Новый Файл («G:модуль.txt»);
Нюансик только один:
А если терминал? Тогда флеху надо расшаривать (хотя бы для терминала) и путь уже другой будет.
А руководитель, сующий флеху в терминальный сервер, мне только в кошмарном сне присниться может 😉
А может проще было создать обработку или общий модуль с закрытым кодом и в ней (нем) требовать ввода какогото суперпароля, без которого не будет крутиться отчет? Можно рассмотреть и создание внешних компонент с аналогичной функциональностью.
Лично мне, паранойя с флешкой не очень нравится.
Хотя, если вопрос стоит не об защите данных, а об оргазме клиента — тогда конечно «клиент всегда прав». Да и готов платить за паранойю, как правило, хорошо.
А теперь делаем флешку с вредоносным кодом, который, ну скажем перетрет пару справочников и регистров, вставляем флешку и вперед… Интересно, что после этого клиент скажет?
Текст кода выносить на сторону нельзя. Флешка должна быть ключом с паролем, который просто так прочитать нельзя. Перед выполнением какого-либо кода нужно прочитать пароль с флешки и если он соответствует — выполнить код. Ну или просто — проверить наличие флешки с определенным ID, который просто так подменить нельзя.
А мне понравилась идея с входом через флешку, озвученная в (3). Дешево и сердито. 😀
Ежу понятно, что для вменяемого программиста ведущего данную конфу (или имеющего на руках ее копию) такие ограничения что рыбе зонтик. Но как еще один уровень секьюрности идея в целом имеет право на жизнь. За что и плюс…
Я тоже за то что бы модуль оствался в конфигурации а не на флешке.
Лучше «Общий иодуль» — в нем весь алгоритм отчета, а в алгоритме уже можно проверить флешку на наличии на ней файла с паролем. Если на флешке есть нужный файл, а в нем пароль — работаем, иначе — ругаемся и не работаем.
А вообще за мысль +
Если у Администратора базы данных за определенную мотивацию нервы сдадут, то он скопирует секретный файл на любой носитель в сети без проблем, когда параноик вставит флешку. Защита на сейчас. Работает пока не пришел параноик.
вот примерная функция определения флешки и файла на ней
Функция СъемныйДиск() Экспорт
СъемныйДиск = «»;
Попытка
ScrptCtrl = Новый COMОбъект(«MSScriptControl.ScriptControl»);
ScrptCtrl.Language = «vbscript»;
ScrptCtrl.addcode(»
|Function GetComputers()
| Set objWMIService = GetObject(«»winmgmts:{impersonationLevel=impersonate}!\.
ootcimv2″»)
| Set colDisks = objWMIService.ExecQuery («»Select * from Win32_LogicalDisk»»)
| For Each objDisk in colDisks
| disk = disk & objDisk.DeviceID & «»;»» & objDisk.DriveType& «»;»»
| Next
| GetComputers = disk
|End Function
|»);
Текст = СокрЛП(ScrptCtrl.Run(«GetComputers»));
ScrptCtrl = Неопределено;
Исключение
Сообщить(ОписаниеОшибки());
Возврат СъемныйДиск;
КонецПопытки;
Если Найти(Текст,»2″) > 0 Тогда
//Далее создаю таблицу для дисков
ТабДисков = Новый ТаблицаЗначений;
ТабДисков.Колонки.Добавить(«Диск»);
ТабДисков.Колонки.Добавить(«Описание»);
//Разбираю полученную информацию
Пока СтрДлина (Текст) > 0 Цикл
Строка = ТабДисков.Добавить();
Строка.Диск = Лев(Текст,2);
Строка.Описание = Сред(Текст,4,1);
Текст = Сред(Текст,6,СтрДлина (Текст)-5);
КонецЦикла;
Для Каждого Элемента Из ТабДисков Цикл
Если Элемента.Описание = «2» Тогда // Это и есть сменный носитель
СъемныйДиск = Элемента.Диск; //»F:»
//Если сменных носителей несколько а нужно выбрать определенный то как вариант на нужном диске хранить файл с определенным именем к примеру .
МасивФ = НайтиФайлы(Элемента.Диск,»Transfer.fls»);
Если МасивФ.Количество() > 0 Тогда
СъемныйДиск = Элемента.Диск;
КонецЕсли;
МасивФ = Неопределено;
КонецЕсли;
КонецЦикла;
ТабДисков = Неопределено;
КонецЕсли;
Возврат СъемныйДиск;
КонецФункции // СъемныйДиск()
Я считаю так — все правы, всем спасибо за комментарии. Реально очень хорошие идеи генерировать одному сложно, но когда каждый по чуть-чуть добавить своего, затем это объединить в единое целое — получается очень мощно и универсально.
Я согласен что код выносить «стремно», но Вы тоже поймите — если отчет разрабатывался индивидуально, и открытый код отчета остался только в .cf, а для использования используется флешка — мне кажется хороший метод. При том что если код отсутвует в конфигурации впринципе, тогда есть только один вариант «злоумышленнику» — разработать свой код! Но чем больше будет ссылок на «флешку», тем гемморойней будет везеде прописать, что бы правильно работало.
Здесь каждый сам для себя должен определится как и кому будет лучше, кому по паролю, кому нет! Ведь вариантов масса здесь.
(6) Вообще то есть именоо тут масса обработок позволяющих делать автосохранение БД. И если вредоносный код перетрет пару справочников или ещё чего там — ну тогда молодец что написал такой код, хотелось бы его тоже тут увидеть. Но в нашем случае восстанавливаем последнюю копию и продолжаем работать как работали.
Если имеется ввиду что можно создать такой же текстовый файл, с таким же названием и туда «забить» что то типа очистки значениий, тогда СООБЩУ, текст с флешки не читается при отсутсвии ещё одного файла, который определяет что за флешка пытается передать тексты кода! Это и есть ситема защиты! Кстати кто то знает как получить ID устройства? 😉
(12) «Но в нашем случае восстанавливаем последнюю копию и продолжаем работать как работали…»
Поздно. Уже нечего восстанавливать. Диски C: отформатированы. Работа всех пользователей парализована. Клиент в шоке, когда очухается — выставит вам счет на недополученную за время простоя прибыль. Начальника службы безопасности завтра увольняют. Конкуренты торжествуют. 😀
Мораль: Код выносить на сторону нельзя! Все остальные идеи — здорово и есть куда развивать.
😀 (13) Ок. Придется написать как исключить возможность написание «псевдокода», хотя в ответе (10) Вам можно легко увидеть ответ.
К тому же — если отформатируют ДИСК :С — это бредятина — тогда вообще хоть код прошит, хоть не прошит — пользователь получил доступ к Диску С:, не вижу смысла в Вашем ответе. Или это банальная демогогия? К Вашему сведению — нормальный сис. админ делает образы Дисков, а выгрузки ИБ — сохраняются не на 1 диск, а иногда сразу на несколько. Но это уже зависит от того как вы обеспечиваете целостность и сохранность информации! 😀 Покажите мне код, который отформатирует Диск :С на серваке при помощи 1С- Предприятие.
А если куски кода на флешке хранить в зашифрованном виде и ключ для их расшифровки, а в 1с их перед загрузкой с помощью того-же ключа расшифровывать и после этого выполнять, тогда придется реализовать системы шифрования для разработчика, который с помощью того-же ключа их зашифровывает и передает клиенту
да можно сделать еще проще = если нужная флешка в дупле — выполняем код из закрытого модуля, если нет — отправляем программу другим путем.
А вот еще идея:
если купить токен (параноидальный защитофил пойдет на этот дорогостоящий шаг или же он у него уже есть для клиент-банка например), получить с него ID и прописать в общем модуле условие на наличие в системе этого устройства, таким образом можно убить двух зайцев:
1. весь код исполняется только в пределах базы
2. нет заморочки с буквой диска флэшки на разных компах
(это и в правду у некоторых флэха бывает и C: 🙂 а где и F и т.д…)
В 7.7 испокон веков существует #ЗагрузитьИзФайла, но никто еще не додумался его с флехи или CD грузить 😉
Так мы тут про 8х, говорим. Насколько мне известно, 7.7 открыть проще простого! Там как не шифруйся — защищеность очень низка! В 8 — всё не так! При том — здесь тоже можно использовать те же #загрузитьизфайла. В этом примере рассматривается возможность доступа к той или иной иформации, и в качестве примера приведен простой код, вы можете на своё усмотрение, использовать хоть ЗагрузитьизФайла, хоть из Строки, хоть из Узла. Если здесь расписывать где и как можно применить, можно книгу написать, при том с неопределенным количесвом редакций!
В восьмерке мне открыть — как раз проще простого, а вот 7.7, закрытую КЗК-2, хрен сломаешь.
O, ya, ya!
Еще пара дополнений:
1. файл с вынесенным кодом запаковать с паролем, записать на закриптованную флешку, флешку положить в сейф;
2. Сервер 1С8 вынести на влаго-пыле-долбоебо-вандало защищенный нетбук, работающий по Линуксом с закриптованным системным разделом.
3. Программиста и сисадмина, которые всё это настроят — напишут, посадить в камеры одиночки с толщиной свинцовой стены 3м, при отсутствии — в конфортабельные палаты ближайшей психушки
(21) Похоже ты мало знаешь про специфику бизнеса и УК РФ! Если что, люди иногда в серверной садят охранника — который закрыт изнутри — и видит в камеру всю территорию, перед ним инструкция — в случае «боевых действий», извлечь все жесткие диски с сервера, после чего взять ударный инструмент — «киянку» — точными ударами разбить все диски, аккуратно разбитые диски сложить в корзину для мусора! Данную инструкцию пропустить через Шредер! 🙂 В наше время люди готовы не только в сейф запихать базу данных… А вот какую информацию они там оберегают — только им известно. Хотя по большому счету, большинство из них просто так думают что там важная информация, но вот остальные — знают что там за информация, и что им за это будет! Потому средства защиты, дополнительные никогда лишними не бывают, это я из личного опыта знаю!
Программист — это зачастую человек отвечающий только за правильную работоспособность БД, ответственность за то что он написал неправильный код — он несет не перед государством, а перед Юридическим лицом, а вот Юридическое лицо несет всю ответственность перед государством!
Программист только по пьяни за дебош может попасть в обезъянник, а руководитель организации, бухгалтер, финансовый директор — может попасть в любой момент, не в обезъянник, а в СИЗО. Разница ощутима. Хотя если ты не был ни там ни там, тебе это ничего не скажет — просто лишний раз посмеешься, и сам себе скажешь — какие все вокруг «параноики». Так вот последние — готовы платить не только за сохранность коммерческой информации, но и за безопасность содержащейся информации! Бизнес всегда имеет Светлую и Серую сторону, а те кто пытается быть только Светлым — их включают в реестр специальный, и все их грузы проходят усиленный контроль. Почему так? Не знаю! Наверное потому что МЫ РУССКИЕ, и когда что то получаем — очень жалко отдавать назад кому то!
Бред, по моему! Исходные данные в базе остаются, при наличии желания и мозгов всегда можно их проанализировать. Пусть и не так как специализированным отчетом, универсальный подойдет.
Вообще сложность защиты должна быть прямо пропорциональна полезности программы (информации).
Конечно можно! Только иногда можно выиграть время пока твои мозги получают информацию! Для чего нужно время я тут расписывать не собираюсь! Но те кто знает понимает!
та, не кипятись. я просто пошутил 🙂
хм вы бы еще предложили шифровать данные непосредственно в базе а на флешке держать ключи расшифровки…
а для безопасности просто надо «крышу» из гос структур. остальное только ради душевного спокойствия и лишней копеечки.
а поч не весь модуль? =)
ИМХО использование метода «Выполнить» есть оооочень большая дыра, даже в рамках конфигурации!!!! Где данные лежат тут-же… Лучше придумать алгоритм аля серийного номера на основании серийника флешки (а на флешке держать текстовый файл (который и читать как текст) в котором находится ответный ключ от серийника) А модуль с алгоритмом можно закрыть! А генерилку ответного ключа держать в внешней обработке и её в сейфе или ещё где.
ЗЫ: Самый простой метод получения ключа из серийника, это делать сдвиг например идём по буквенно (кроме знака «-«) и к номеру символа добавляем позицию символа и ставим в ключ символ с получившимся числом это первая половина серийника, вторую например отнимаем позицию с конца.. Вот вам и генерилка и проверялка.
Желательно следить что получившиеся символы были «безопасными», чтоб потом считались из текстового файла
ЗЫ2: Тогда даже подсмотрят какой номер на вашей флешке и если поменяют серийный номер своего устройства на ваш номер (а это возможно) но не скопируют ключевой файл, то проверка не пройдёт!
Кстати лучше текстовый файл создавать скрытым, как защита от дурака.
А не проще что-нибудь вроде «Secret Disk Server NG» (система защиты корпоративных баз и конфиденциальных данных на серверах от несанкционированного доступа, копирования, повреждения, кражи или неправомерного изъятия) приобрести? Цена не бог весть какая даже для средней конторы.
Но в целом, за идею и творческий порыв плюсну 🙂
А если флеха погибла?
Нужен супер-пупер админ с мастер-флехой для восстановления?
В общем идея имеет право на жизнь, но как показывает практика — недостатков больше чем преимуществ. 🙁
не думаю, что в России более стремные условия ведения бизнеса, чем скажем в Белоруссии. Подход через флешку — оригинальный, но абсолютно бесполезный. Имея исходную базу данных — проанализировать ее безо всяких проблем. Что это за супер такой отчет должен быть? да и когда уже наезжают, время уже не является принципиальным. В защите информации главное правильно подойти к вопросу, что защищать нужно. Всю базу не защитишь никогда. Даже из государственных военных организаций бывает утечка… а тут открытое предприятие!
2(2): зачем быть семь пядей во лбу… или на предприятии особая секретная технология ведения учета ? 😉
ИМХО, а что если по определенному ID диску и находящемуся на флешке файлу с паролем вообще запретить запуск конфигурации, разве не защита? Ну не для мастеров, но во всяком случае от несанкционированного входа неких любопытных, а «Имея исходную базу данных» дак её нужно иметь
а у администратора баз данных нету возможности унести базу с конфой домой и поправить код ? ИМХО, защита от нечистых на руку юзеров, от админа она не спасет, если админа промотивировать, то даже отсутствие кода отчета не поможет, если он реально админ. отчеты это не данные, можно другой написать и вставить куда надо. главная проблема утечек это сами данные, мелкие фирмы чаще страдают от слива контрагентов, а утечка фин информации реализуется сливом стандартной бухгалтерской оборотки
ну что вы так набросились на автора?
о_О
он же написал, что это для заказчиков типа — «злостный параноик»
=)
Определение ID — USB диска… выводит пустое поле, флешка подключена, что не так делаю?
Всё работает нормально!
Вставьте флешку в разъем, затем проверьте определилась ли она системой, т.е. просто откройте её через «Мой Компьютер», если всё нормально, тогда откройте обработку «Poluchit id USB» из программы 1С предприятие, в режиме Предприятие, затем нажмите кнопку «Выполнить». 🙁 Ну для контрольной убедительности вставьте другую флешку и проверьте её, вдруг у Вашего экземпляра флешки нет ИД :))))))…
(37) спасибо за инструкцию, все делаю так же, пробовал на 2-х флешках, не работает.
Все скриншеты могу приложить, вот скрин основного окна:
кто-то знает, как взломать защиту РАРУС 1С Ресторан? Защита интересно организована через внешнюю компоненту V8Restoran.dll. Написана на Делфи, запускает форму проверки ключа защиты. Если нет ключа, то и не дает дальше использовать все функции и прелести, заложенные в этой компоненте. Очень хочется взломать ДЛЛ-ку, прописать, где надо, что ключ защиты и есть и использовать все функции этой компоненты. Их так просто не переписать, свои не придумаешь 🙁
А насчет поставки конфы без текста модуля или запароленного текста модуля — это очень легко решается Декомпилятором 1С. 1минута и все пароли сняты и тексты возобновлены 😉 Жаль нет такого простого и удобного декомпилятора для DLL файлов.
Это что, такая шутка юмора?
Защита, рассчитанная на семиклассника?
Это даже не серийник диска, это виндовый идентификатор тома, который вообще никак с железом не связан, присваивается при форматировании и может быть установлен для любого диска в любое значение (утилит полно в сети).
Для флешек хотя бы брали ее железный серийник, чуть понадежнее бы было.
Хотя и это обходится перепрошивкой флешки.
Да оригинально, молодец автор. Можно брать за основу.
Неужели в 1С не подумали над этим вопросом и не ввели поддержку авторизации на основе внешних считывателей/рутокенов и т.д.?