Захист баз mdb, Мова запитів SQL, Бази даних, статті

Юрій Шерман

Як захистити базу даних у форматі mdb.
 

Мова піде не про захист секретів фірми, записаних в базі даних, а про модулях, формах і т.д.

Отже, як захистити?
Досвідчений акцессіст відповість відразу – ніяк. І буде правий.
Майже. Від нього захисту немає, а від менш досвідчених – є.
Інший досвідчений скаже: про це все відомо. І то ж буде правий. Майже.
Дещо новеньке є.

Вступ. Проблем захисту ще немає.

Звичайна ситуація: Ви взялися зробити базу даних швидко, дешево і якісно. Хоча, як відомо, це неможливо. Зірковий програміст може вирішити одночасно тільки два завдання. Хороший – одну. Але Ви взялися …
Проблем захисту – ні. На трьох компах будуть працювати жінки, ще не бачили Access, а ще на одному – шеф, то ж його не знає. Загалом, все в порядку.

Ви швидкісним способом за … тижнів створюєте базу.
Звичайно, ставите автозапуск бази за допомогою макро Autoexec або зазначенням першої форми. До речі, Autoexec – більш універсально. Ви можете запустити програму, яка не тільки відкриє першу форму, але й може зробити різні настроювальні операції.
Далі ставите базу на компи, і починаєте боротьбу з незадоволеними жінками, не знаючими як, а головне навіщо, вводити дані, які у них і так вже десь є. І з власними помилками, які мають властивість вилазити в самий невідповідний момент.
Але проходить якийсь час, і цей період закінчується. Користувачі та шеф бачать перші результати, помилки майже перестають вискакувати … Жінки вже просять для себе змінити написи, шрифти, кольори.
І Ви у них на очах це робите з почуттям взаємної радості. У шефа з’являються нові побажання, і Ви розвиваєте завдання далі.
І раптом … І раптом вас викликають, і ви бачите спотворену форму (Варіанти: зіпсований модуль, віддалену таблицю і т.д.). Звичайно це добре, так як це означає, що жінки полюбили вашу задачу, хочуть в ній розібратися і дещо поліпшити. Це також означає, що користувачі з початківців юзерів перейшли в розряд цікавих. Але у вас з’явилася головний біль – адже шеф звинувачує вас за все збої завдання. Адже ви програміст – З вас і попит. Тепер ви чітко відчуваєте, що сидите на бочці з порохом. Хочете ви чи не хочете, але вас з’явилася завдання:

Захист від цікавого юзера.

Звичайно, хочеться вирішити цю задачу просто і швидко. Наприклад, взагалі заховати вікно Access з усіма його шкідливими кнопками. Як це зробити? – Таке питання ставилося неодноразово.

Отже, рішення 1. Сховати вікно
Access.

Відповідаючи на питання “Як?”, Юрій Прус дав повне відкрите опис цього рішення в статті “Запуск програми без вікна Access і відключення кнопки закриття вікна Access “
(HiProg.com/access/article.asp?id=28).

Уявімо, що ви це зробили. І тут же виявляється, що разом із шкідливими кнопками зникли і цілком корисні типу: копіювати, вставити, сортувати, фільтрувати, знайти … До яких ваші жінки звикли від Word і Excel. Їх тепер що – вішати на форми? Або вчити жінок виконувати їх з клавіатури? Те й інше дуже накладно. До того ж тепер не можна просто згорнути завдання, а на великих моніторах не можна зрушити в сторону всі форми відразу – потрібно поштучно. При цьому всі форми необхідно стали спливаючими. А програмування таких форм має свої неприємні особливості. Наприклад, більше не працюють події “Включення” та “Відключення” (Activate, Deactivate).
Підводячи підсумки, можна сказати, що це “просте і швидке” рішення тягне за собою досить довгі і неприємні наслідки. Так що не будемо ховати вікно Access. Давайте

Рішення 2. Сховати “шкідливі” кнопки.

Шкідливі це ті, які дають доступ до вікна бази даних і переводять об’єкти в режим конструктора.
Отже, вікно бази даних. Перш все треба подбати про виключенні клавіші Shift, що зупиняє запуск програми і тим самим дає доступ до вікна бази даних. Потім відключити гарячі клавіші виклику вікна бази даних (Ctrl + F1, F11). І, нарешті, замінити стандартні панелі інструментів на свої.
Як це зробити описано і в Help, і майже в будь-якій книжці по Access, і в оригінальних розробках.
Приклади: “Захист від Shift”
(HiProg.com/access/article.asp?id=128)
                
“Захист від Shift-а “(nsa.chat.ru/UserInterfase_Sas_Shift.html).

                 Треба відзначити, що в другій статті дається багато більше, ніж просто захист від Shift-а.
Замінивши панелі інструментів на свої, ви майже вирішили і друге завдання – заборона виклику конструкторів.
Майже – тому, що часто забувають відключити виклик контекстного меню у формах правою клавішею миші. А воно дає можливість перейти в режим конструктора. Для відключення виклику слід встановити в формах в стан “ні” властивість “Контекстні меню”
(ShortcutMenu = No).
Виконавши цю більш копітку роботу, ви, нарешті, полегшено зітхаєте. Цікавий юзер більше нічого не зіпсує, а всі корисні кнопки є. Це дійсно так. Але …
Але знову вискочила ваша помилка. У юзера. Ви дивіться на повідомлення Access, і нічого не можете зробити. Ні подивитися стан таблиць, ні значень змінних, ні … Ви ж самі все заборонили.
І ця заборона тепер б’є по вам. Нічого зробити на місці більше не можна. Доведеться спочатку розпитувати, що робив юзер перед цим, потім йти до свого відкритого варіанту бази та намагатися імітувати послідовність дій, що викликали помилку. Зазвичай це вдається. Рідше – ні, тому що юзер розповів не те чи не все. Але буває набагато гірше. У юзера помилка рідко, але з’являється, а у вас – ні. Загальна схема появи такої помилки: виникає вона при рідкісному поєднанні даних в момент їх зміни. Після скидання помилки хитрий Access поправляє збій в даних. І ви її не бачите. Самому побудувати це поєднання даних важко через її рідкості. Як боротися з такою помилкою? Добре б все-таки провести її аналіз прямо на місці. І не розпитуючи юзера.
Але зробити це не дає обрана система захисту. А чи можна зробити такий захист, що б цікавий юзер нікуди влізти не міг, а ви в той же момент – могли? Відповідь – так!

Рішення 3. Стежить система. Ось це і є нове.

Знову у вас повністю не захищена база. Юзер зробив якесь шкідлива дія: викликав вікно бази даних, перевів форму в режим конструктора, відкрив вікно налагодження … Але ж це можна визначити програмним способом і схопити юзера за руку! І не дати йому нічого зробити.
А якщо у комп’ютера сидите ви, то ви програмі скажете – “це я! “. І вона повинна зняти весь захист.
Далі ви розбираєтеся в помилково, виправляєте і т.д. Потім ви перевантажуєте базу та безпека знову автоматично включається. В цьому загальна ідея стежить системи.

Тепер техніка виконання. Захист від Shift-а звичайно потрібно поставити – що стежить систему треба запустити. Стежить систему (програму визначення типу активного вікна) слід викликати по таймеру. Текст програми дається нижче. Програма працює дуже швидко. Навіть при інтервалі таймера в 0,01 сек. процесор практично не завантажується. З практики (Перший варіант програми був написаний в 1998 р.) достатній інтервал таймера в 2 сек. Юзер за цей час нічого поганого зробити не встигає. В разі виявлення шкідливого вікна треба відкрити захисну форму.
Приклад захисної форми можна взяти за адресою: nsa.chat.ru/Secur_FormNoEnter.html
До цьому прикладу два зауваження: не обов’язково форму розкривати на весь екран монітора – достатньо зробити її монопольної. І друге: зняти в ній можливість виклику контекстного меню. В даному конкретному прикладі це не заважає, але при його модифікації можливість виклику може виявитися дірою в захисту.

Запуск по таймеру найкраще робити з прихованою форми, відкривається першою і завжди завантаженою.
Цю ж форму я використовую для зберігання загальних змінних. Є дві переваги у порівнянні з використанням Public змінних в загальному модулі: вони не скидаються при Reset, що полегшує налагодження, і можуть прямо використовуватися в запитах як параметри відбору.
Якщо юзер спробує зробити цю форму видимої (у нас ж є всі стандартні меню), то слід у формі на подію активізації поставити виклик все тієї ж захисної форми за умови, що TimerInterval
> 0.
Тепер майже все. Залишається зробити в захисній формі секретний вхід для себе. Це можна виконати багатьма способами. Наприклад, кліком небудь кнопки миші з одночасним натисканням комбінації клавіш Shift, Ctrl, Alt. Можна знімати захист при послідовній комбінації таких кліків.
Можна реагувати і на введення символів з клавіатури. Загалом, це справа смаку.
Само зняття захисту зводиться до обнуління інтервалу таймера (відключення стежить системи) і закриття захисної форми. Тепер і перша (прихована) форма стає доступною.

Функція визначення типу активного вікна. Наводиться версія для А-97.
Вихід: = True, якщо вікно шкідливе, і False в протилежному випадку.


Public Function rpProtect() As Boolean
Static S As String, n As Long, TypeWindow As Long
On Error Resume Next
Err.Clear
n =
Screen.Application.CurrentObjectType
If Err
> 0 Then Exit Function ‘Про всяк випадок
S = Screen.Application.CurrentObjectName
‘Тип не визначено або діалогова форма
If n = -1 Then Exit Function
‘Тип визначено
TypeWindow = n
n = SysCmd(acSysCmdGetObjectState,
TypeWindow, S)
If n = 0 Then GoTo TruEnd ‘Об’єкт не відкрито – вікно бази
Select Case TypeWindow
Case acTable, acQuery, acMacro, acModule
GoTo TruEnd ‘Доступ завжди заборонений
Case acForm
S =
Screen.ActiveForm.Name
If Err > 0 Then GoTo TruEnd ‘Форма у вікні бази даних
If
Forms(S).CurrentView = 0 Then GoTo TruEnd ‘Форма в конструкторі
Case acReport
S =
Screen.ActiveReport.Name
If Err > 0 Then GoTo TruEnd ‘Звіт у вікні бази даних
n =
Reports(S).HasData
If Err > 0 Then GoTo TruEnd ‘Звіт в конструкторі
End
Select
Exit Function
TruEnd:
rpProtect = True
End Function


Для А-2000 функція складніше.

Практика застосування стежить системи показує, що юзер швидко і добре запам’ятовує те, що робити не потрібно. І не робить. Останнє зауваження. Система зовсім не скасовує використання своїх панелей інструментів. Вони можуть бути якими завгодно.

Про захист від цікавого юзера сказано все. І, будемо вважати, вона зроблена. Бочка з порохом прибрана.
Однак розвинемо ситуацію далі. В вашу фірму приходить новий співробітник, і через деякий час просить у вас пояснення, чому ви функцію таку-то в такому-то модулі написали так, а не інакше.
Впоравшись зі своїм здивуванням, ви розумієте, що перед вами НЕ юзер, а, як мінімум, ламер (початківець програміст). І він зняв вашу захист. Тепер перед вами постає нове завдання:

Захист від ламера.

Як же ламер зняв ваш захист? Взагалі, є багато способів. Так як ця стаття не ставить за мету опис методів злому баз Access, то викладу найпростіший і самий відомий.
Всі три методи захисту, зазначені вище, мають в своїй основі захист від Shift-а. Якщо її зняти, то доступ до бази вільний. Найпростішим методом зняття захисту від Shift-а, не вимагає програмування, є імпорт бази. Тобто ламер створює порожню базу і стандартною операцією Access імпортує в неї вашу базу. При імпорті переписуються не всі властивості бази. Зокрема, не переписується властивість AllowBypassKey, що управляє захистом від Shift-а. Отримана база нічим не захищена.
Так як під час імпорту ніякі ваші програми не працюють, то захиститися від нього можна тільки засобами самого Access. Вони є. Це створення власного файлу робочих груп, створення груп, призначення їм прав доступу, Доступ під вхід для кожного користувача і т.д.
Все це багаторазово описано в книгах по Access і викладати їх зміст не має сенсу.
Можна тільки рекомендувати хорошу програму Юрія Пруса “AdmTools”
(am.rusimport.ru/MsAccess/pgAccDownload.htm), спрощує роботу з налаштування та ведення вбудованої системи захисту
Access.
У методах захисту від юзера нічого не говорилося про захист бази з таблицями у випадку, якщо ви відокремили програми (клієнтська частина) від власне даних. Вважається, що юзер просто не здогадається викликати Access і відкрити базу з даними. А якщо здогадається, то буде … Ох, як недобре буде …
Для захисту бази з даними єдино, що можна зробити – це застосувати вбудований захист Access.

Якщо ви вирішите поєднати захист від ламера зі стежить системою (а саме так я і роблю), то слід добре продумати рівень прав (дозволів), які ви надаєте юзеру.
Не забувайте, що в момент аналізу помилки у комп’ютера будете ви, але з правами юзера.
Зауваження для більш досвідчених. Можна зробити програмку, яка динамічно змінює права юзера на адміністратора у всіх об’єктів бази при використанні секретного входу. Тобто для вас. Тоді не треба сильно думати над призначенням прав. І, звичайно, не забути про програму, відновлює вихідні призначення прав, якщо вони були змінені.

Виклик цієї програми я розміщую блок стартових налаштувань, що викликаються макро Autoеxec. Програми зміни прав досить прості, але індивідуальні. Тому не наводяться. Для їх написання Help достатній.

Завершення. Захист від досвідченого акцессіста.

Як сказав на форумі SSY: “Хренова ситуація … Захист як-би є, але ламається з пів-стусана.
Проблема в тому, що ім’я і код власника БД можна визначити з пом. спец. програм, наприклад
msa.polarcom.ru/

Можу додати ще посилання на зарубіжний джерело:
www.lostpassword.com/access.htm.

Така поточна ситуація. Такий вона повинна бути? Відповідь, звичайно, немає. Є добре відомі методи, що перетворює завдання злому пароля в NP-важке завдання. Тобто, час вирішення такого завдання росте швидше за будь-полінома від довжини пароля (наприклад, експотенціальной). Відомі алгоритми та відкриті програми такого шифрування, наприклад RSA. (Більш детально дізнатися про це алгоритмі можна за адресою: www.leadersoft.ru/subscribe/sub/sub32.htm). Просто для прикладу, якщо ви вирішите підібрати пароль методом повного перебору, то, якщо в паролі будуть застосовуватися тільки латинські букви і цифри, оцінка часу підбору = C * 62 ^ n, де C – константа, а n – довжина пароля. Це тільки кіношні герої ламають паролі, три рази натиснувши на
Enter.
Чому Microsoft не застосовує більш потужні алгоритми шифрування? Мені щось не приходить в голову ніяких розумних пояснень. І листи Гейтсу писати марно – про ці алгоритмах він напевно знає …
На цій песимістичній ноті доведеться статтю закінчити.

PS. Найпотужнішою захистом бази є переведення її у формат mde. Але це тема вже іншої статті.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*