Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 04.08.2010
Сообщений: 12

Безопасность при работе с БД

14.08.2010, 14:51. Показов 2041. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет. Вообщем у меня возникла такая проблема:
например, у меня есть 2 бд. Одна из них состоит из файлов, а другая на mysql. Так вот, сам вопрос: при одновременном обращении пользователей к странице, где изменяется информация в БД, не произойдет ли сбой или ошибка (запишется только часть информации или вылезет ошибка, что файл используется другим скриптом и открыть его невозможно)???
И, если произойдет, то где? (MySQL или файлы)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.08.2010, 14:51
Ответы с готовыми решениями:

Безопасность при генерации страниц! как сделать?
Привет всем ... в общем такой вопрос по безопасности ... у меня user.php создаёт страницу с данными из mysql опираясь по id вот код ...

Безопасность при работе с базой
Добрый день. Использую Spting + Hibernate Есть баз MySql куда пользователи могут добавлять/удалять данные после того как залогинятся....

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

4
2 / 2 / 0
Регистрация: 14.08.2010
Сообщений: 6
14.08.2010, 18:26
Смотря какой у тебя код.
Вообще полезно было бы писать точный код : если что-то не так, то информация 100% не запишется в БД.

С MySQL Ошибка может произойти в случае неправильной очистки кода.
Посоветую перед записью в БД ( MySQL ) Обработать данные так :
PHP
1
$dannie = quotemeta($dannie);
А вот с файлами косяк - бывает так, что они попросту стираются. От этого помогает блокировка файлов в обычное время и разблокировка во время записи.
1
0 / 0 / 0
Регистрация: 04.08.2010
Сообщений: 12
25.08.2010, 16:44  [ТС]
Спасибо за ответ! Но меня еще интересует вот какой вопрос:
Например, бд сайта создана на файлах. Я редактирую этот файл через админку, а в этот момент к этому файлу обращается посетитель, не возникнет ли ошибка (например, "Ошибка при открытии файла! Этот файл использует другая программа!")?
По идее на MySQL такого возникнуть не должно, поэтому я выбрал его. Но все равно ответ будет полезен как и мне, так и многим новичкам!
0
2 / 2 / 0
Регистрация: 14.08.2010
Сообщений: 6
26.08.2010, 20:38
В MySQL 100% такого не будет, если я не ошибаюсь - там поддерживается многопоточность : каждое соединение подобно вновь открытому блокноту по 1 для каждого компьютера.

Насчёт файлов : существуют форумы на файлах, на них постоянно кто-то что-то пишет, кто-то просматривает темы и ниразу не было такого сообщения. Или ошибки.

Конкретно про файлы : Вот статейка блокировки, возможно она написана муторно и непонятно, но ответы на ваши вопросы найдутся : [Ссылка удалена!]
Статья с ссылки
Php блокировка
Суть проблемы такова:
Есть база данных, используемая на сайте (например, база для регистрации пользователей, куда записывается их имя и email), она лежит в текстовом файле построчно (в дальнейшем, "file_base.dat".). Два пользователя активизируют сервер через командную строку в броузере, для ввода свох имен и email. Сервер отсылает их к скрипту. Оба пользователя "начинают движение" по скриптовому потоку (тексту php файла) сверху вниз, причем, Первый "бежит" на долю секунды быстрее Второго. Когда они достигают того места, где скрипт исполняет их запрос, движение по потоку останавливается, в их броузер выводится сгенерированная скриптом страница в виде html. Чтобы из file_base.dat прочитать данные, этот файл надо открыть на чтение (функция - @file), чтобы записать что-то в него, надо открыть на запись (функция - @fopen). В скрипте это выглядит так:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<? 
…… 
// читаем данные из файла-базы 
$f = @file ("file_base.dat", "r"); // здесь находится 2 пользователь 
// здесь идет текст скрипта 
// открываем файл-базу на запись 
$fp = @fopen ("file_base.dat", "w"); // здесь находится 1 пользователь 
// записываем в файл-базу данные из выше 
// прочитанного file_base.dat - переменная $f 
// и добавляем еще одну строку с данными нового пользователя 
// закрываем файл-базу 
@fclose ($fp); 
…… 
?>
То есть, чтобы новый пользователь появился в нашей file_base.dat, мы считываем оттуда информацию, которую кладем в переменную $f, затем записываем в этот же файл эту переменную $f (при этом, file_base.dat переписываем полностью) и внизу дописываем еще одну строку с данными нашего нового пользователя. Мы видим, что на чтение и на запись file_base.dat открывается в разных местах нашего скрипта. Если оба пользователя, одновременно, достигли "своего" места в этом скрипте, но один из file_base.dat только начал читать данные, а другой уже их прочитал, продвинулся чуть ниже и, в этот момент, находится на отметке записи в файл file_base.dat своих данных. То, в этом случае, от нашего файла file_base.dat ничего не останется. В связи с этим, в Php была введена функция совместного доступа @flock, которая призвана не допускать совместный доступ к файлу на чтение и запись.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<? 
…… 
// читаем данные из файла файла-базы 
$f = @file ("file_base.dat", "r"); // здесь находится 2 пользователь 
// здесь идет текст скрипта 
// открываем файл-базу на запись 
$fp = @fopen ("file_base.dat", "w"); // здесь находится 1 пользователь 
// блокируем файл-базу на чтение 
@flock ($fp, LOCK_EX) 
// записываем в файл-базу данные из выше 
// прочитанного file_base.dat - переменная $f 
// и добавляем еще одну строку с данными нового пользователя 
// снимаем блокировку 
@flock ($fp, LOCK_UN) 
// закрываем файл-базу 
@fclose ($fp); 
…… 
?>
Теперь, вроде бы все нормально, файл блокируется на чтение, когда в него что-то пишут. Но, что произойдет в нашем случае, когда, 1 пользователь прочитал данные файла и пришел к отметке открытия file_base.dat на запись, оркыл его и заблокировал на чтение функцией @flock, а 2 пользователь, именно в этот момент пришел к точке, где данные из файла считываются функцией @file? 2 пользователь ничего не прочитает из этого файла, потому что file_base.dat блокирован 1 пользователем командой @flock на чтение. 2 пользователь просто "пробежит" дальше по потоку скрипта ничего из файла file_base.dat не прочитав, то есть наша переменная $f будет пустой. Но, дальше-то он будет записывать в этот файл, то что ранее с него считал. В итоге, в наш file_base.dat запишется только одна строка с его именем и email. То есть, file_base.dat будет потерян.
В связи с чем, была придумана функция: read_file

PHP
1
2
3
4
5
6
7
function read_file($path) 
{ 
if(!is_file($path)) {return false; } 
elseif(!filesize($path)) {return array(); } 
elseif($array=file($path)) {return $array; } 
else { while(!$array=file($path)){sleep(1);} return $array; } 
}
Суть ее такова: пока файл блокирован на чтение, пользователь, который хочет считать из него информацию, находится в цикле, то есть, как бы "стоит" на месте, не "бежит" дальше по тексту скрипта, ожидая, когда файл разблокируется на чтение. В итоге наш скрипт принимает такой вид:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<? 
function read_file($path) 
{ 
if(!is_file($path)) {return false; } 
elseif(!filesize($path)) {return array(); } 
elseif($array=file($path)) {return $array; } 
else { while(!$array=file($path)){sleep(1);} return $array; } 
} 
…… 
// проверяем заблокирован ли файл на чтение, 
// если заблокирован, назначаем цикл с остановкой, 
// пока блокировка не будет снята, после снятия блокировки, 
// читаем данные из файла файла-базы 
$f = read_file ("file_base.dat", "r"); // здесь находится 2 пользователь 
// здесь идет текст скрипта 
// открываем файл-базу на запись 
$fp = @fopen ("file_base.dat", "w"); // здесь находится 1 пользователь 
// блокируем файл-базу на чтение 
@flock ($fp, LOCK_EX) 
// записываем в файл-базу данные из выше 
// прочитанного file_base.dat - переменная $f 
// и добавляем еще одну строку с данными нового пользователя 
// снимаем блокировку 
@flock ($fp, LOCK_UN) 
// закрываем файл-базу 
@fclose ($fp); 
…… 
?>
Вроде бы все нормально. Когда 1 пользователь начал записывать свои данные в file_base.dat, 2 "спит" одну секунду, ожидая разблокировки file_base.dat, когда file_base.dat разблокирован, он считывает из него информацию и начинает движение дальше. Но, есть одно "но". Если 2 пользователь чуть быстрее 1 пользователя "добежал" до "своего" места, прочитал половину данных из нашего file_base.dat, который еще не был блокирован, и, именно, в этот момент, 1 "добежал" по тексту скрипта до @flock ($fp, LOCK_EX), то есть заблокировал наш файл, то переменная [COLOR="rgb(65, 105, 225)"][COLOR="rgb(65, 105, 225)"]$fp[/COLOR][/COLOR] будет иметь только половину данных из нашего file_base.dat, потому что, именно, в этот момент file_base.dat был заблокирован. В итоге, в наш file_base.dat будет записана половина информации из нашей базы + одна сторка нового пользователя. То есть, опять, file_base.dat мы потеряли.

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

Для чего, на сайте создадим папку для хранения текстовых строк. Например, lock. Наш файл на сайте лежит в папке database, значит в папке lock надо создать папку database. Теперь, когда пользователь обращается к file_base.dat, для чтения или записи в него, абсолютный путь http://наш_сайт.ru/database/file_base.dat, в папке http://наш_сайт.ru/lock/database/ появляется файл-строка file_base.dat.tmp, абсолютный путь - http://наш_сайт.ru/lock/database/file_base.dat.tmp, закрывая доступ к file_base.dat, как только пользователь считал или записал информацию в наш файл-базу, текстовая строка file_base.dat.tmp удаляется, открывая доступ другим пользователям к file_base.dat.

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<? 
// объявляем директорию для временных файлов 
$Lock_dir = "lock"; 
// функция для создания временных текстовых файлов 
function touchString($file) { 
global $Lock_dir; 
$tmp = "$Lock_dir/".$file.".tmp"; 
while(1) { 
if (is_file($tmp)) 
{ 
while(file_exists($tmp)) 
{ 
$file_exist++; 
if($file_exist > 10){break;} 
clearstatcache(); 
sleep(1); 
} 
} 
return touch($tmp); 
} 
} 
// функция удаляющая временные текстовые файлы 
function delString($file) { 
global $Lock_dir; 
$tmp = "$Lock_dir/".$file.".tmp"; 
return unlink($tmp); 
} 
// альтернатива функци @file 
function FileArray($file) { 
if (!is_readable($file)) return FALSE; 
touchString($file); 
$bufer = file($file); 
delString($file); 
return $bufer; 
} 
// альтернатива функци @fopen 
function OpenFile($file, $mode) { 
touchString($file); 
return fopen($file, $mode); 
} 
// альтернатива функци @fclose 
function CloseFile($fido, $file) { 
$sito = fclose($fido); 
delString($file); 
return $sito; 
} 
…… 
// проверяем есть ли временный файл, запрещающий 
// чтение и запись в файл-базу, если он есть, останавливаем 
// пользователя в цикле, где он ожидает пока временный файл 
// исчезнет, как толко он исчезает, сами создаем такой же временный 
// файл, запрещая доступ к файлу-базе, только после этого читаем данные из 
// файла-базы, удаляем временный файл, открывая доступ к базе 
// другим пользователям 
$f = FileArray ("database/file_base.dat"); // здесь находится 2 пользователь 
// здесь идет текст скрипта 
// проверяем есть ли временный файл, запрещающий 
// чтение и запись в файл-базу, если он есть, останавливаем 
// пользователя в цикле, где он ожидает пока временный файл 
// исчезнет, как толко он исчезает, сами создаем такой же временный 
// файл, запрещая доступ к файлу-базе, только после этого открываем 
// файл-базу на запись, временный файл не удаляется, закрывая доступ к базе 
// другим пользователям 
$fp = OpenFile ("database/file_base.dat", "w"); // здесь находится 1 пользователь 
// записываем в файл-базу данные из выше 
// прочитанного database/file_base.dat - переменная $f 
// и добавляем еще одну строку с данными нового пользователя 
// закрываем файл-базу, удаляем временный файл, открывая доступ к базе 
// другим пользователям 
CloseFile ($fp, "database/file_base.dat"); 
// обратите внимание, что в CloseFile два аргумента: $fp и 
// database/file_base.dat 
…… 
?
>

В этой ситуации мы видим, что когда один пользователь достиг точки считывания с file_base.dat или, наоборот, другой пытается записать в file_base.dat информацию, нам ничего не страшно. Потому что, как в одном, так и в другом случае, появился маленький текстовый файл file_base.dat.tmp, который не дает ни одному ни другому совместно читать или писать в file_base.dat.

В нашем варианте есть одна "дыра", если вдруг пользователь обратился к базе данных, создав текстовую строку блокировки, незакончил как-бы цикл (свет погас и компьютер выключился), и эта текстовая блокирующая строка осталась лежать в папке Lock, то наша программа "подвиснет", не давая никому пройти, из-за этого оставшегося флага. Мы не стали усложнять функции проверкой на удаление этого файла-флага, а, просто ввели в функции его создающей, предел "подвисания" компьютера 10 секунд ($file_exist++; if($file_exist > 10){break;}), через 10 секунд он автоматически выйдет из цикла и сотрет временный файл. В этом кроется опасность, но она ничтожна мала по сравнению с теми, которые были описаны выше. Считаем, что подход описанный выше, защитит от обвала базы данных, которая лежит в текстовом файле и не будет особо заметно флагов блокировки, когда на сайте ее, одновременно использует до 10 человек. Мы знаем, что наш скрипт сервером исполняется 0,5 сек, в этом случае его пропускная способность в час составит до 1800 человек. Уменьшим ее вдвое, 900 человек, за сутки 21600 человек. Согласитесь, и без MySql можно обойтись.

Для проверки работоспособности этих функций запишите вручную в папку Lock этот самый блокирующий файл file_base.dat.tmp, в нашем случае, это: http://наш_сайт.ru/lock/database/file_base.dat.tmp, тем самым, блокируя доступ к базе http://наш_сайт.ru/database/file_base.dat, запустите программу, обратитесь к базе, вы увидите, что флаг работает и броузер "стоит" на месте, удалите file_base.dat.tmp файл (разблокируя) и подвисание закончится.

Теперь у нас есть функции:
1. FileArray , заменяющая @file
2. OpenFile , заменяющая @fopen
3. CloseFile , заменяющая @fclose



Александр Устюгов
http://omsk-777.ru/
1
 Аватар для orangeJuice
0 / 0 / 0
Регистрация: 14.03.2011
Сообщений: 12
08.05.2011, 12:51
Даже не знаю... я вот к примеру не получил ответ на свой вопрос. В нете случайно наткнулся на такое понятие как колизия (технический термин, которым называется проблема описаная автором этой темы). И нашел пути решения этой проблемы.

И у меня возник вопрос. Всё таки нужна блокировка чтения на время, когда идет запись, или не нужна? Или это делается скюЛ сервером автоматически? Речь едёт о необходимости применения "LOCK TABLES `table_name` WRITE" , каждый раз когда нужно что-то вставить, или обновить в mySQL-таблице. Тип использумой мною таблицы MyISAM. Заранее большое спасибо за ответ.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
08.05.2011, 12:51
Помогаю со студенческими работами здесь

то надо учитывать в работе с Сессиями чтоб повысить маскимально возможную безопасность?
Привет Всем! Интерестно, на сколько сделают Сессии,сайт безопасным. Если у них слабые стороны? Что надо учитывать в работе с Сессиями...

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

Грабли при работе STM32f4 при работе с ftp
Столкнулся с такой проблемой. Работаю в связке Stm32f4+cinterion bgs2e8 при сливании файла с ftp, если в файле есть 0x00(NULL), а они...

Безопасность при использовании Skype
Всем привет. :senor: Состоялась у меня сегодня беседа с одним гражданином по поводу безопасности передачи конфиденциальных данных...

Аппаратная ошибка видео (Ошибка при работе с видеоустройствами привела к некорректной работе Windows).
Аппаратная ошибка видео. Последнее время во время игры Call of Duty: Modern Warfare 2 в мультиплеер, (между сменами карт, как только...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru