Немного про SQL-инъекции
Всегда ли достаточно для защиты от SQL-инъекций делать
$data = mysql_real_escape_string ($data);
с любой переменной $data
, хранящей данные, полученные от юзера через GET
или POST
? (делается после коннекта с БД)
Разумеется, перед этим можно грохнуть из его ввода теги и позаботиться о "магических кавычках" (если используем версию PHP ниже 5.4, в последней, они, вроде, наконец-то упразднены?):
//------------------ файл разбора параметров params.html <? while (list($num,$var) = each($params)) { if (!empty($_POST[$var])) $$var = trim(htmlspecialchars(magic($_POST[$var]))); else if (!empty($_GET[$var])) $$var = trim(htmlspecialchars(magic($_GET[$var]))); else $$var = ''; } ?> //------------------ вызов этого обработчика параметров $params = array('id','mode'); //разрешённые параметры require_once ("params.php"); //получили значения, создали пустые или непустые переменные $id и $mode //------------------ функция для борьбы с кавычками <? function magic($path){ if( ini_get('magic_quotes_sybase')=='1'){ $path=str_replace('""','"',$path); $path=str_replace("''","'",$path); } else { if(@get_magic_quotes_gpc()=='1'){ $path=str_replace('\"','"',$path); $path=str_replace("\'","'",$path); $path=str_replace("\\","\",$path); } } return $path; } ?>
Все параметры запросов тогда, по логике защищаются одинарными кавычками
mysql_query (“SELECT * FROM table WHERE id = '$id'”)
Я по лености, случается, пишу и наоборот
mysql_query ('SELECT * FROM table WHERE id = "'.$id.'")';
то есть, фактически, оцениваю параметры, оставляя возможность вставить что-нибудь вроде union вторым запросом...
09.04.2010, 22:02 [8936 просмотров]