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]
ну проверь коли так хочешь icon_smile.gif
а так вапще принимай через пост все и фильтруй.
цитата
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 а наоборот, чтобы буквы, цифры, пробел, подчёркивание и тире пропускались.

Хотя суть одна, всё и так работает.
Всем спасибо! smail54.gif
цитата
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);

Пишут, что ставится после коннекта к базе, и должно нормально отрабатывать инсерт и др. запросы, используя принятую инфу. icon_rolleyes.gif
цитата
31/08/10 в 21:20
 goodlover
arma: у wp красивые строчки.. хороший ход. smail54.gif
цитата
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 и кавычках.
Всегда их ставлю почему-то, и похоже что не зря. icon_rolleyes.gif
Всех заплюсовал. smail54.gif


Эта страница в полной версии