Прикріплення до сайту бази даних
- Прикріплення до сайту бази даних
Якщо Ви плануєте
створювати свій динамічний сайт на платформі
Windows, то у Вас швидше за все виникне завдання
вибору СУБД для зберігання інформації
(з мовою, на якому Ви будете його програмувати,
судячи з усього, питань не виникає). Одним
з варіантів її вирішення, може виявитися
використання MS Access в якості SQL-сервера.
Далі буде описано, як у скрипті, написаному
на PHP, звернутися до бази даних MS Access.
На жаль, в PHP немає вбудованих засобів
для роботи з цією СУБД, що, однак не виключає
спільної їх роботи - для підключення до
бази ми будемо використовувати ODBC.
Насамперед ми повинні створити так званий
DSN Source. Для цього (розглядається варіант,
коли у користувача встановлена ОС
Windows 2000 Rus) в панелі управління ми повинні
вибрати пункт Администрирование,
а потім Источники
данных (ODBC). Далі, у вікні (мал.1)
мал. 1
вибираємо вкладку системный DSN, натискаємо кнопку добавить, вибираємо драйвер MS Access (мал.2)
мал. 2
натискаємо кнопку
готово. У полі введення
имя источника данных пишемо ім'я, за
яким згодом ми зможемо звернутися до
нашої бази даних, наприклад, test, потім
натискаємо кнопку выбрать і вказуємо,
де у нас на диску знаходиться наш файл
з БД (мал. 3)
мал. 3
Потім, якщо в цьому є необхідність, можемо задати ім'я користувача та пароль для доступу до БД через ODBC, натиснувши на кнопку дополнительно (мал. 4)
мал. 4
Тепер, коли у нас є джерело даних ODBC, ми можемо скористатися функцією odbc_connect для підключення до нашої бази:
<?
$x=odbc_connect("test","test"
?>
Щоб передати запит
до СУБД, ми можемо скористатися функцією
odbc_exec:
<?
$res=odbc_exec($x,"create table test (f1 integer, f2 varchar(10))");
$res=odbc_exec($x,"insert into test (f1,f2) values(1,'qwerty')");
$res=odbc_exec($x,"insert into test (f1,f2) values(2,'asdfgh')");
?>
Якщо після виконання
цього прикладу відкрити базу test в MS Access,
то ми виявимо, що там з'явилася нова таблиця
test з полями f1 і f2 цілочисельного і строкового
типів відповідно; в таблиці будуть два
записи з даними, які були вказані в запиті.
На жаль, не всі функції для роботи з ODBC
коректно працюють з MS Access, наприклад,
це функції odbc_num_rows и odbc_fetch_array.
Але ці проблеми вирішуються, якщо описати
дві наступні функції і використовувати
їх замість раніше згадуваних:
<?
function xodbc_num_rows($sql_id, $CurrRow = 0)
{
$NumRecords = 0;
odbc_fetch_row($sql_id, 0);
while (odbc_fetch_row($sql_id))
{
$NumRecords++;
}
odbc_fetch_row($sql_id, $CurrRow);
return $NumRecords;
}
function xodbc_fetch_array($result, $rownumber=-1) {
if ($rownumber < 0) {
odbc_fetch_into($result, &$rs);
} else {
odbc_fetch_into($result, &$rs, $rownumber);
}
foreach ($rs as $key => $value) {
$rs_assoc[odbc_field_name($
}
return $rs_assoc;
}
$res=odbc_exec($x,"select * from test");
$cnt=xodbc_num_rows($res);
?>
<table border=1 cellspacing=0 cellpadding=4>
<tr><td>f1</td><td>f2</td></
<?
for ($i=0;$i<$cnt;$i++) {
$row=xodbc_fetch_array($res,$i
echo '<tr><td>'.$row['f1'].'</td><
}
?>
</table>
Результат виконання цього прикладу наведено нижче:
|
Таким чином, тепер,
якщо у Вас виникне завдання підключення
до бази MS Access з PHP, Ви зможете сміливо її
вирішити в найкоротші терміни.
PHP - найбільш поширена мова програмування,
застосовуваний при розробці CMS.
- Захист і взлом баз даних Access
•
Стандартні способи
захисту
o Захист
за допомогою пароля БД
o Захист за допомогою пароля
користувача
•
Нестандартні способи
захисту
o Зміна
розширення файлу
o Захист за допомогою пароля
БД, що містить нецензурні символи
o Захист з модифікацією файлу
o Захист зміною версії БД
o Захист з використанням електронного
ключа
o Шифрування значень таблиць
Стандартні способи захисту
Захист
за допомогою пароля
БД
Даний
спосіб захисту дозволяє встановити пароль
на відкриття БД, для всіх користувачів.
Для його створення необхідно відкрити
файл БД в "монопольному" режимі і
вибрати пункт меню Сервіс / Захист / Визначити
пароль бази даних. Для роботи з такою
базою даних в MS Access буде потрібно вводити
пароль. Ось приклад роботи з файлом БД,
використовуючи DAO або ADO.
Public Sub TestDAO()
Dim mWS As DAO.Workspace
Dim mDB As DAO.Database
Set mWS = DBEngine.
Set mDB = mWS.OpenDatabase ("C:\a97.mdb", True, True, ";
End Sub
Public Sub TestADO()
Dim CnDB As New ADODB.
CnDB.Open "Provider=
End Sub
Це теж не
самий надійний спосіб захисту баз
даних. Існує достатня кількість
безкоштовних і платних утиліт, що
відображають пароль. У тому числі
доступні вихідні коди коду на VB дозволяють
прочитати такий пароль. В іншому
не все так погано.
Справа в тому, що деякі розробники вважають,
що крім англійської мови, інших мов не
існує. Досить включити в пароль російські
літери, щоб привести в ступор користувача,
який використовує такі програми. Так,
вони начебто й розкривають пароль, але
те, що вони видають в якості пароля, розібрати
неможливо.
Продовжимо ігри з паролем бази даних.
Наприклад, можна використовувати в паролі
недруковані символи. В першу чергу цей
спосіб націлений на протидію визначення
паролів за допомогою спеціальних програм.
Стандартний спосіб встановлення і використання
пароля БД передбачає його введення з
клавіатури в діалоговому вікні. Якщо
стоку пароля містить нецензурні символи,
то вони не будуть коректно відображені
програмою відкриває паролі БД. З іншого
боку цей пароль можна ввести в діалоговому
вікні при відкритті БД в MS Access.
Якби пароль містив символи табуляції,
Esc або Enter, то стандартним чином Ви б не
змогли їх ввести у віконце введення пароля.
Спосіб заснований на тому, що пароль БД
формату Access 2000 і 2002-2003 - текстовий рядок
у форматі Unicode (в Access 97 - ANSI). При цьому немає
ні яких обмежень на її вміст. У специфікації
баз даних і в довідці по DAO 3.60 зазначено,
що максимальна кількість символів в паролі
- 14. Але насправді їх може бути 20. При цьому
і сам Access 97 не допускає введення рядків
пароля більше 14 символів. У специфікації
Access 2003 також сказано про 14 символів, але
програма допускає введення всіх 20. Також
можливе використання недрукованих символів,
що приводить більшість програм зламували
паролі в ступор.
Для установки такого пароля буде потрібно
застосувати спеціальну програму, яка
використовує метод CompactDatabase бібліотек
ADOX або DAO. Але, так би мовити, проти всього
можна знайти лом. І такий захист розкривається.
- По-перше, можна скористатися програмою AccessRecovery, яка створює новий файл без захисту і переносить в нього таблиці, запити, форми, макроси, звіти і код модулів.
- По-друге, можна спробувати визначити пароль БД за допомогою спеціальних програм.
- По-третє, можна дізнатися пароль, проаналізувавши код програми в відладчик. Який би не був пароль, він все одно передається як текстовий рядок у методі відкриття БД. При наявності певного досвіду - це не дуже складне завдання.
Дізнатися або змінити пароль БД можна, не вдаючись до допомоги спеціальних програм. В Access 97 пароль виходить складанням за XOR пароля з 20 байтной послідовністю. Значення цих байт можна отримати з будь-якого не захищеного паролем mdb файлу. Починаючи з Access 2k, у зв'язку з використанням Unicode, для зберігання 20 символів пароля відведені 40 байт. При шифруванні також використовується додавання за XOR, але для отримання послідовності байт відповідної порожньому паролю необхідно створити файл з датою досліджуваної БД. Отримані байти можна вписати в досліджуваний файл і обнулити пароль, або скласти їх з аналогічними байтами досліджуваного файлу і отримати значення пароля. Але все це вже вимагає наявність певних знань і досвіду, так, що є шанси на те, що цікавому користувачеві набридне експериментувати.
Захист за допомогою пароля користувача
Даний спосіб дозволяє ввести додатковий рівень обмежень, пов'язаних з роботою БД Access. Заснований на створенні файлу робочих груп, в якому визначаються імена користувачів, їхні паролі і права на роботу з різними об'єктами БД.
Послідовність дій для створення
захищеного файлу:
- Створення
нового файлу робочих груп.
Для цього в 97-2000 Access запускається програма WRKGADM.EXE, а в 2003 Access необхідно вибрати пункт меню "Сервіс / Захист / Адміністратор робочих груп". У адміністратора тиснемо кнопку "Створити ", вказуємо ім'я, організацію та код групи. Вказуємо ім'я і розташування створюваного файлу. Наприклад:
Ім'я: test_Імя
Opгaнізaція: ~
Кoд paбoчeй гpyппи: cтpoчкa 20 cімвoлoв.
Фaйл paбoчeй гpyппи: C:\test\gr.mdw - Створення ярлика, для запуску ms Access з використанням створеного mdw файлу. Ярлик повинен містити рядок: [шлях до MSACCESS.EXE] / WrkGrp [шлях до файлу mdw]. Наприклад: "C: \ Program Files \ MSOffice2003 \ OFFICE11 \ MSACCESS.EXE" / WrkGrp C: \ test \ gr.mdw
- Запустивши Access c допомогою цього ярлика необхідно відкрити пункт меню "Сервіс / Захист / Користувачі та групи". У діалоговому вікні необхідно створити нового користувача і додати його до групи "Admins". Наприклад, був створений "test_Пользователь" з кодом "987654321"
- Тепер необхідно відкрити Access від імені створеного користувача. Для цього необхідно додати в створений ярлик рядок: / user [ім'я користувача]. Наприклад: "C: \ Program Files \ MSOffice2003 \ OFFICE11 \ MSACCESS.EXE" / WrkGrp C: \ test \ gr.mdw / User test_Пользователь
- Запускаємо Access c допомогою цього ярлика. Тепер створеному користувачеві необхідно присвоїти пароль. Це робиться в тому ж діалозі "Користувачі та групи". Припустимо користувачеві "test_Пользователь" привласнений пароль "test_Пароль". Далі, необхідно створити нову БД. При цьому власником цієї бази, а також всіх створюваних або імпортованих об'єктів (таблиць, запитів тощо) буде користувач ім'я якого було зазначено в ярлику.
- Після того, як БД буде створена бажано видалити "Admin" з групи "Admins" і відібрати у групи "Users" права на об'єкти БД і на відкриття бази.
- Додаємо в ярлик назва захищеної БД. Наприклад: "C: \ Program Files \ MSOffice2003 \ OFFICE11 \ MSACCESS.EXE" C: \ test \ db2k_test.mdb / WrkGrp C: \ test \ gr.mdw / User test_Пользователь / pwd test_Пароль
Ось приклад відкриття
БД захищеної на рівні користувачів за
допомогою DAO або ADO
Public Sub TestDAO()
Dim mWS As DAO.Workspace
Dim mDB As DAO.Database
DBEngine.SystemDB = "C:\
Set mWS = DBEngine.
("", "test_
Set mDB = mWS.
("C:\test\a97.mdb",
End Sub
Public Sub TestADO()
Dim CnDB As New ADODB.
CnDB.Open "Provider=
"Data Source=C:\
"Jet OLEDB:
"User ID=test_
"Password=test_
End Sub
Зняття такого захисту.
Створити нову БД. В ярлику прописати
шлях до цієї БД, MDW файл захищеної БД
ім'я та пароль власника. Відкрити за
допомогою цього ярлика нову БД.
Імпортувати до неї таблиці із
захищеної, після чого змінити для
всіх об'єктів БД власника на Admin. Для
того, щоб дізнатися ім'я і пароль власника
БД можна скористатися спеціалізованими
програмами, описаними в огляді Паролі
Access. За відсутності файлу робочих груп
його можна відновити. Для цього буде потрібно
дізнатися імена і ідентифікатори власників
об'єктів БД. Ця інформація міститься у
файлі бази даних і може бути залучена
за допомогою таких програм як AOPR. Використовуючи
ці дані створюється новий файл. (Послідовність
описана вище)
Зовсім не обов'язково використовувати
програми, що дозволяють визначити пароль
БД або користувача. Часто програмісти
зовсім не піклуються про приховування
пароля в тексті програми. Запустивши
програму, що працює на захищених БД необхідно
відкрити в шістнадцятковому редакторі
WinHex віртуальну пам'ять цього додатка.
Провівши пошук Unicode рядків 'User ID ='; 'Password
='; 'Database Password =' або 'pwd =' можна знайти
ім'я користувача, його пароль і пароль
бази даних.
Можна зовсім проігнорувати наявність
захисту. Для цього треба скористатися
AccessRecovery, яка створює новий файл без захисту
і переносить в нього таблиці, запити,
форми, макроси, звіти і код модулів.
Нестандартні способи захисту
Зміна
розширення файлу
Досить простий спосіб ввести в оману - зміна розширення файлу БД. Побачивши незнайому розширення, не кожен спробує з'ясувати природу цього файлу. Крім цього з'являється можливість зв'язати це розширення з вашою програмою, так щоб при кліці по файлу запускалося ваш додаток, а не Access. Бажано відкривати такий файл з монопольним доступом, так як в цьому випадку не буде створюватися ldb файл.
Захист за допомогою пароля БД, що містить нецензурні символи
В першу
чергу цей спосіб націлений на
протидію визначення паролів за допомогою
спеціальних програм. Одна база з
таким захистом добре попсувала
мені негаразди. Тепер я попсую настрій
її авторам розповівши про цю захисту.
Спосіб заснований на тому, що пароль БД
формату Access 2000 і 2002-2003 - текстовий рядок
у форматі Unicode. При цьому, немає ні
яких обмежень на її вміст. Стандартний
спосіб встановлення і використання пароля
БД передбачає його введення з клавіатури
в діалоговому вікні. Якщо стоку пароля
містить нецензурні символи, то вони не
будуть коректно відображені програмою
відкриває паролі БД. З іншого боку цей
пароль можна ввести в діалоговому вікні
при відкритті БД в MS Access.
Але й про Access 97 я не забув. Справа в тому,
що в специфікації баз даних і в довідці
по DAO 3.60 зазначено, що максимальна кількість
символів в паролі - 14. Але насправді їх
може бути 20. При цьому і сам Access 97 не допускає
введення рядків пароля більше 14 символів.
У специфікації Access 2003 також сказано про
14 символів, але програма допускає введення
всіх 20. Також можливе використання недрукованих
символів, що приводить більшість програм
зламували паролі в ступор.
Для установки такого пароля потрібно
використовувати програму, яка використовує
метод CompactDatabase бібліотек ADOX або DAO.
Злом захисту.
- По-перше, можна скористатися AccessRecovery.
- По-друге, можна спробувати визначити пароль БД за допомогою спеціальних програм. В огляді Паролі Access наводиться зведена таблиця за їх можливостям.
- По-третє, можна дізнатися пароль, проаналізувавши код програми в відладчик. Який би не був пароль, він все одно передається як текстовий рядок у методі відкриття БД. При наявності певного досвіду - це не дуже складне завдання. Коли мені вперше зустрілася подібний захист - пароль вдалося знайти, використовуючи відладчик OllyDbg, знайшовши місце створення ADODB.Connection
- Дізнатися або змінити пароль БД можна, не вдаючись до допомоги спеціальних програм. В Access 97 пароль виходить складанням за XOR пароля з 20 байтной послідовністю. Значення цих байт можна отримати з будь-якого не захищеного паролем mdb файлу. Починаючи з Access 2k, у зв'язку з використанням Unicode, для зберігання 20 символів пароля відведені 40 байт. При шифруванні також використовується додавання за XOR, але для отримання послідовності байт відповідної порожньому паролю необхідно створити файл з датою досліджуваної БД. Отримані байти можна вписати в досліджуваний файл і обнулити пароль, або скласти їх з аналогічними байтами досліджуваного файлу і отримати значення пароля.
Захист з модифікацією файлу
Спосіб
захисту заснований на модифікації перших
байт файлу. Таким чином, перед відкриттям
БД в її файл записується правильний заголовок,
що зберігається в програмі, а після закриття
повертається неправильний. При спробі
відкрити файл БД за допомогою ms Access з'являється
повідомлення про помилку. Не погано поєднати
цей спосіб зі зміною розширення файлу.
Наприклад, можна взяти заголовок dbf файлу
і записати його в початок mdb файлу. Далі
міняємо розширення файлу на dbf і насолоджуємося
результатом. БД тепер можна відкрити
в Excel, Access або іншою програмою, що дозволяє
читати dbf файли. Ось приклад такого перетворення:
'модификация заголовка
файла БД
'Ex: Call BaseProtect("C:\01.mdb", True)
Public Sub BaseProtect(sPath
Dim iFn As Integer
iFn = FreeFile()
Open sPath For Binary
Put #iFn, 5, CStr(IIf(
"ProtectDataBase", "
Close #iFn
End Sub
Метод не досить ефективний, так як програму, що працює з БД, можна перервати штучно і на диску залишиться не захищена БД. Тому варто його використовувати тільки в поєднанні з іншими способами.
Захист зміною версії БД
Цей спосіб
- подальший розвиток ідеї модифікації
заголовка файлу з метою протидії програмами,
читає паролі. Метод заснований на тому,
що для роботи з БД Access 97 та 2k програми
використовують різні алгоритми читання
пароля і при цьому намагаються самостійно
визначити версію mdb файлу.
Для визначення версії можна використовувати
послідовність з 40 байт, починаючи з 122
від початку файлу. Якщо в БД Access 97 вписати
цю послідовність від Access 2k, то отримаємо
цікавий результат. Програма ms Access, ADO і
DAO нормально працюють з цим файлом, а більшість
зламували паролі програм попадаються
на цей прийом. Аналогічний результат
може бути отриманий при пересадці байтовой
послідовності з Access 97 в Access 2k
заголовок файла Access 2k
зелёным выделен фрагмент пароля БД
синим - фрагмент характерный для версии
БД
Offset 0 1 2 3 4 5
00000000 00 01 00 00 53 74
00000010 20 44 42 00 01 00
00000020 E9 A9 67 72 40 3F
00000030 79 BA ED 30 BC DF
00000040 BC 4E 9B 6D EC 37
00000050 8A 60 49 02 7B 36
00000060 B1 33 29 F7 79 5B
00000070 98 FD DC 75 0C FF
00000080 85 67 C6 1F 27 44
00000090 78 16 0C ED E9 2D
Захист з використанням електронного ключа
Це ще одне підтвердження, того, що стандартні способи захисту, навіть від сторонніх виробників уразливі. Мова йде про ключі HASP. За допомогою утиліти HASP Envelope можна зашифрувати файл (у даному випадку БД) і дозволити до нього доступ тільки з захищеного застосування. Використовується механізм "прозорого " шифрування. Зі стартом операційної системи запускається певний процес, який відстежує всі звернення до захищеного файлу БД. Якщо це запит надає звичайного застосування, наприклад від ms Access - файл читається і виводиться повідомлення про "нерозпізнаваною форматі бази даних ". Але якщо з файлом працює вказаний при шифруванні додаток, то дані передаються йому в дешифровано вигляді. У результаті, сама програма, не підозрює про наявність захисту. Так, складність злому такої бази зростає в рази. Але при цьому треба пам'ятати, що з додатком повинен поставлятися електронний ключ, ціною N у.о. і що швидкість доступу до даних падає в два - три рази.
Взлом захисту.
Було знайдено два способи отримати БД своє повне розпорядження.
- По-перше, вразливий виявився код програми. Звернення до бази йшло з використанням запитів. З початку в відладчик був знайдений запит, що викликається у відповідь на натискання кнопки в програмі. Далі цей запит був підмінений текстом запиту на створення таблиці в іншій БД. Після натискання кнопки запит вибрав дані таблиці із захищеної БД і зберіг їх в іншому файлі.
- По-друге, була написана програмка, яка використовуючи хук впровадила свій код в адресний простір захищеного HASP'ом процесу і від його імені просто скопійована файл бази даних.
Шифрування значень таблиць
Цей спосіб не поганий. У всякому випадку з'являється реальна надія що якось врятувати. Однак є ряд обмежень. Перед відображенням даних їх необхідно дешифрувати. Немає можливості пошуку по частині рядка в зашифрованому полі. Алгоритм шифрування і ключ містяться в програмі, а значить, є потенційна вразливість. У даному випадку надійність залежить від стійкості до злому програми, що працює з БД. Можна поєднувати приємне з корисним: не шифрувати, а стискати вміст memo полів. Розбиратися з алгоритмом стиснення в коді програми заняття нудне.
Висновок
Перед
тим як ставити питання про спосіб захисту
БД варто задуматися про її необхідність.
Не варто покладатися на стандартні методи,
але це не привід для відмови від використання
Access. Спеціаліст зламає що завгодно, але
можна зробити, щоб це було не так просто.