Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Работа с базой и безопасность
Новая тема
Ответить
цитата
30/08/10 в 18:58
goodlover
Суть: юзер на сайте вводит информацию, она потом в php ловится в строковую переменную, и далее создаётся запрос к базе mysql, добавляется то что юзер ввёл (мыло, возраст). Потом этот запрос выполняется.
Чтобы любопытный человек не мог ввести что-то своё, чтобы дополнительные его запросы к базе не начали выполняться, как тут предохраняться?
Код:
$query = "INSERT INTO $table (stolb1, stolb2) VALUES('$perem1', '$perem2')";
$result = MYSQL_QUERY($query);
$perem1 и $perem2 принимаются через POST из формы.
Как-то нужно проверять что пришло в переменных $perem1 и $perem2, чтобы было безопасное добавление в базу?
цитата
30/08/10 в 19:41
_s_[sov]
ну проверь коли так хочешь
а так вапще принимай через пост все и фильтруй.
цитата
30/08/10 в 19:52
goodlover
Если бы я чётко знал как и от чего фильтровать, то этого топика бы не было.
цитата
30/08/10 в 20:54
loksa
я не спец, но отсекаются спец символы обычно.
у меня в одном скрипте это делает строка
$QUERY_STRING = preg_replace("/[^\\w_-]/","",$QUERY_STRING);
либо просто пропускать только набор символов которые используются, типа буквы, цифры, точка запятая и т.д., и @ - для мыла.
любому прогеру дело на 5 минут.
цитата
31/08/10 в 10:05
freeek
http://www.w3schools.com/php/func_mysql_real_escape_string.asp
посмотри, как это делают известные фреймворки
цитата
31/08/10 в 11:22
leroy_17
обычно фильтруют
' /* -- и ( )
А вообще лучше четко прописать что мжет вводить юзер , если это поиск
то это буквы цифры пробел тире и подчеркивание. Больше им не надо в поиске
цитата
31/08/10 в 15:45
Dr.Syshalt
Вообще самый правильный и железный способ - это использовать параметризованные запросы. Если это mysql + php - то mysqli-интерфейс, там есть mysqli_stmt::prepare и прочие спизженные из нормальных языков типа Java+JDBC вещи.
цитата
31/08/10 в 17:42
goodlover
leroy_17 писал:
А вообще лучше четко прописать что мжет вводить юзер , если это поиск
то это буквы цифры пробел тире и подчеркивание. Больше им не надо в поиске
Логично, а как это сделать? (если на стороне сервера)
То есть не перечислять что запрещено в preg_replace а наоборот, чтобы буквы, цифры, пробел, подчёркивание и тире пропускались.
Хотя суть одна, всё и так работает.
Всем спасибо!
цитата
31/08/10 в 17:45
arma
Можно заюзать php библиотеку filter.so
http://devzone.zend.com/article/1113
http://nl.php.net/manual/en/filter.filters.sanitize.php
http://nl.php.net/manual/en/ref.filter.php
Примеры:
http://nl.php.net/manual/en/filter.examples.validation.php
http://nl.php.net/manual/en/filter.examples.sanitization.php
Для себя юзаю потыренные из wordpress'a ф-ции, фильтрация работает например так:
Код:
<?php
add_filter('verify_text', 'strip_tags');
add_filter('verify_text', 'encoding_auto_convert');
add_filter('verify_text', 'trim');
add_filter('verify_text', 'mysql_real_escape_string');
$new_data = apply_filters('verify_text', $old_data)
?>
цитата
31/08/10 в 20:51
zuborg
Dr.Syshalt писал:
Вообще самый правильный и железный способ - это использовать параметризованные запросы. Если это mysql + php - то mysqli-интерфейс, там есть mysqli_stmt::prepare и прочие спизженные из нормальных языков типа Java+JDBC вещи.
Верно, а если ещё и кешировать результат prepare() то можно секономить cpu базы который тратится на парсинг запроса и построение плана выполнения.
цитата
31/08/10 в 21:19
goodlover
Ух, много букв.. буду изучать.
А что думаете об этом?
Код:
$userinfo = mysql_real_escape_string($userinfo);
Пишут
, что ставится после коннекта к базе, и должно нормально отрабатывать инсерт и др. запросы, используя принятую инфу.
цитата
31/08/10 в 21:20
goodlover
arma:
у wp красивые строчки.. хороший ход.
цитата
31/08/10 в 23:03
Dr.Syshalt
goodlover писал:
А что думаете об этом?
Код:
$userinfo = mysql_real_escape_string($userinfo);
Жить будет - способ дедовский, но работает.
цитата
31/08/10 в 23:48
Noobus Boobus
+1 к mysql_real_escape_string, и незачем огород городить.
цитата
01/09/10 в 10:56
leroy_17
проблема в том что эта функа не все убирает, например если извернуться то можно закоментировать код и дописать другой запрос. Раньше в mysql проходили запросы типа chr(39) или написанные 16-ти ричным кодом символы . Т.е. кавычку можно написать не только как " ' ". На 5-ке mysql не пробовал так что точно не скажу на 4-ке работал такой метод взлома.
цитата
01/09/10 в 18:22
msth
либо
Код:
mysql_query("SELECT * FROM items WHERE id = '".mysql_real_escape_string($_POST['id'])."'");
важный момент тут это обрамление кавычками ('), так как если этого не сделать, то возможно, что поломают даже с mysql_real_escape_string.
или фильтровать переменные, проверять номер это или строка из определенных символов и тд.
цитата
01/09/10 в 19:16
Heavy
Noobus Boobus писал:
+1 к mysql_real_escape_string, и незачем огород городить.
+1, если пофиг на валидность данных и задача только не дать базу коцнуть.
как вариант еще использовать mysqli + "плейсхолдеры" (но это на любителя, имхо могли бы упрощенную версию для популяризации сделать)
цитата
01/09/10 в 19:40
goodlover
Значит останавливаюсь на mysql_real_escape_string и кавычках.
Всегда их ставлю почему-то, и похоже что не зря.
Всех заплюсовал.
Новая тема
Ответить
Эта страница в полной версии