БлогNot. Немного про SQL-инъекции

Немного про 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 [8880 просмотров]


теги: php mysql безопасность

К этой статье пока нет комментариев, Ваш будет первым