Перейти к содержимому



  • Закрытая тема Тема закрыта

Защита БД от иньекций :)

#1 Вячеслав

Вячеслав
  • Пользователь
  • 357 сообщений
  • Репутация: 0
0

Отправлено 09 Август 2009 - 19:12

Привет!

У меня вот такой вопрос, на сайте имеются формы (регистрация, обратная связь, комментарии, голосования, авторизация), вопрос в том - как правильно защитить Бд от иньекций(тоесть от ввода в форму SQL запросов).

Какие должны быть проверки?

Вот например в гостевой имеется вот такая проверка:

$text=str_replace(" ",' ',$text);
$text=str_replace("&",'&',$text);
$text=str_replace(">",'>',$text);
$text=str_replace("<",'&lt;',$text);
$text=str_replace("\"",'&quot;',$text);
$text=preg_replace("/\n\n/",'<p>',$text);
$text=preg_replace("/\n/",'<br>',$text);
$text=preg_replace("/\\\$/",'$',$text);
$text=preg_replace("/\r/",'',$text);
$text=stripslashes($text);
$text=preg_replace("/\\\/",'\',$text);
$text=str_replace("\r\n","<br> ",$text);
$text=str_replace("\n\n",'<p>',$text);
$text=str_replace("\n",'<br> ',$text);


Можите пож. подробней обьяснить что она делает, или чтото дать почитать на эту тему? ;) спс...

 

 

  • 0

#2 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 09 Август 2009 - 19:20

все что будет записываться в БД

для цифр
intval - http://ru2.php.net/m...tion.intval.php
<? $id = intval($_GET['id']); ?>


для вводимого текста
mysql_escape_string - http://ru2.php.net/m...cape-string.php
<?php
if(!get_magic_quotes_gpc())
{
 $_POST['a'] = mysql_escape_string($_POST['a']);
 $_GET['b'] = mysql_escape_string($_GET['b']);
 $_COOKIE['c'] = mysql_escape_string($_COOKIE['c']);
} 
else 
{
 $_POST['a'] = mysql_escape_string($_POST['a']);
 $_GET['b'] = mysql_escape_string($_GET['b']);
 $_COOKIE['c'] = mysql_escape_string($_COOKIE['c']);
}

  • 0

#3 Евгений

Евгений
  • Пользователь
  • 481 сообщений
  • Репутация: 0

Отправлено 09 Август 2009 - 19:22

вот тут обсуждалось
  • 0

#4 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 09 Август 2009 - 22:25

Вячеслав, проверки не нужны, важно просто понять какие данные к тебе пришли.
Число:
$number = intval($_GET['number']);

//примеры
$_GET['number'] = 5; // $number = 5
$_GET['number'] = "Строка"; // $number = 0


Строка:
$str = mysql_escape_string($_POST['str']);

//примеры
$_POST['str'] = "Простая строка"; // $str = "Простая строка"
$_POST['str'] = "Строка с &quot;кавычками&quot;, 'апострофами' и \слешами\ "; // $str = "Строка с \"кавычками\", \'апострофами\' и \\слешами\\ " примерно

  • 0

#5 Вячеслав

Вячеслав
    Topic Starter
  • Пользователь
  • 357 сообщений
  • Репутация: 0

Отправлено 10 Август 2009 - 02:29

Я так понимаю в скрипте нужно применять к числовим и строковым данным глобальных массивов вот эти две проверки:

$str = mysql_escape_string($_POST['str']);
$number = intval($_GET['number']);

А если ето пароль, ведь там могут быть как числа так и символы?
  • 0

#6 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 10 Август 2009 - 06:12

А если ето пароль, ведь там могут быть как числа так и символы?


то это строка считается

если в пароле используется шифрование, то можно не проверять
  • 0

#7 BaCo

BaCo
  • Пользователь
  • 103 сообщений
  • Репутация: 0

Отправлено 29 Апрель 2010 - 18:20

Составляйте правильные запросы. Например:
mysql_query("SELECT * FROM `db_name` WHERE `id` = 'id';");
в такой пример сложно будет инъекцию сделать, а в такой:
mysql_query("SELECT * FROM db_name WHERE id = id");
легко
  • 0

#8 ZiTosS

ZiTosS
  • Пользователь
  • 5 148 сообщений
  • Репутация: 8

Отправлено 29 Апрель 2010 - 18:42

BaCo, вы не правы, в первый будет так же легко сделать инъекцию. Данные надо проверять. А вот типы данных не надо путать. Если целый, то сравниваем с целым, а не со строкой и так далее.
  • 0

#9 BaCo

BaCo
  • Пользователь
  • 103 сообщений
  • Репутация: 0

Отправлено 29 Апрель 2010 - 19:08

Ну, в общем да. Так и есть :rolleyes:
  • 0

#10 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 29 Апрель 2010 - 20:22

2BaCo прекращай некропостить, поднимать старые темы!
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru