Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: SQL Injection
 
 автор: Arfey   (14.12.2008 в 16:01)   письмо автору
 
 

Как защитить свои SQL Injection?

  Ответить  
 
 автор: BinLaden   (14.12.2008 в 16:17)   письмо автору
 
   для: Arfey   (14.12.2008 в 16:01)
 

Чо?

  Ответить  
 
 автор: cheops   (14.12.2008 в 16:25)   письмо автору
 
   для: Arfey   (14.12.2008 в 16:01)
 

Не очень понятно если честно... Вы хотите чтобы инъекции выполнялись или нет? Если не сложно опишите подробнее.

  Ответить  
 
 автор: Arfey   (16.12.2008 в 22:22)   письмо автору
 
   для: cheops   (14.12.2008 в 16:25)
 

просто часто слышу, что необходимо ставить защиту от SQL-инъекций. но как тогда самому получать данный из БД?

  Ответить  
 
 автор: AcidTrash   (16.12.2008 в 22:32)   письмо автору
 
   для: Arfey   (16.12.2008 в 22:22)
 

>что необходимо ставить защиту от SQL-инъекций.
Защита - это правильная обработка данных извне.

>но как тогда самому получать данный из БД?
также, как и всегда.

  Ответить  
 
 автор: tokmak   (17.12.2008 в 22:32)   письмо автору
 
   для: Arfey   (14.12.2008 в 16:01)
 

SQL-инъекция - просто так от нее не защититься. Необходимо всегда следить за SQL запросами, обрабатывать все переменые введеные пользователями, строго обрабатывать $_GET,$_POST переменые. Основная атака приходится через адрес строку для доступа к вашему сайту.
Например:
http://www.site.ru/article.php?id=10 - тут расположена статья с номером 10

Ваш SQL запрос к примеру:
$id = $_GET['id'];

$query =  "SELECT * FROM `article` WHERE `id_art` = $id";


а теперь допустим злоумышленик вводит такой адрес:

http://www.site.ru/article.php?id=10//

то мы получим запрос:
$id = $_GET['id'];

$query =  "SELECT * FROM `article` WHERE `id_art` = 10//";
и тут уже будет коментарий!


 // Если вы не проверите эту переменную, то есть шанс на вашем сайте, выполнить инъекцию
if (!is_int($_GET['id'])  {  
  echo "Попытка инъекции";
  exit();

  Ответить  
 
 автор: BinLaden   (17.12.2008 в 22:41)   письмо автору
 
   для: tokmak   (17.12.2008 в 22:32)
 

> "SELECT * FROM `article` WHERE `id_art` = 10//"
> и тут уже будет коментарий!

Однострочные комментарии в SQL -- "--"

> if (!is_int($_GET['id']) {
Нельзя так проверять, так как $_GET['id'] никогда просто так не будет integer. Это может быть NULL, string или array.

  Ответить  
 
 автор: tokmak   (17.12.2008 в 23:41)   письмо автору
 
   для: BinLaden   (17.12.2008 в 22:41)
 

насчет комментария , перепутал извеняюсь /*

>> if (!is_int($_GET['id']) {
>Нельзя так проверять, так как $_GET['id'] никогда просто так не будет integer. Это может быть NULL, string или array.

BinLaden, Но согласитесь, лучше уж, хоть какая-та защита, чем вообще никакой. ;)

Ну можно и вот так (это для автора):

 if (!preg_match("/[0-9]/i",$_GET['id']))  {
    echo "ID параметр указан неверно!";
    exit();
}

  Ответить  
 
 автор: AcidTrash   (17.12.2008 в 23:46)   письмо автору
 
   для: tokmak   (17.12.2008 в 23:41)
 

>Ну можно и вот так (это для автора):
А не проще воспользоваться intval().

P.S. Да кстати, в вашем РВ зачем модификатор i ? :)

  Ответить  
 
 автор: BinLaden   (17.12.2008 в 23:46)   письмо автору
 
   для: tokmak   (17.12.2008 в 23:41)
 

> Но согласитесь
Не соглашусь. Ваш код неверен и условие !is_int($_GET['id']) будет выполняться всегда. Для проверки того, что $_GET['id'] - набор цифр существует, например, ctype_digit().

> "/[0-9]/i"
Вы проверяете наличие хотя бы одной цифры.

  Ответить  
 
 автор: tokmak   (17.12.2008 в 23:57)   письмо автору
 
   для: BinLaden   (17.12.2008 в 23:46)
 

опа... прошу поправьте меня насчет preg_match. Как необходимо правильно проверить?
Сорри за оффтоп...

  Ответить  
 
 автор: BinLaden   (17.12.2008 в 23:58)   письмо автору
 
   для: tokmak   (17.12.2008 в 23:57)
 

/^[0-9]+$/ или /^\d+$/

  Ответить  
 
 автор: tokmak   (18.12.2008 в 00:04)   письмо автору
 
   для: BinLaden   (17.12.2008 в 23:58)
 

/^[0-9]+$/
?id=111d если ввести такое значение, то preg_match думает, что это все цифры :D
именно при таком значении id, а остальные работают норм.

Спасибо! Пригодится!

Блин, вот что значит пишут в статьях по безопастности кода!

  Ответить  
 
 автор: BinLaden   (18.12.2008 в 00:11)   письмо автору
 
   для: tokmak   (18.12.2008 в 00:04)
 

Вообще говоря, нужно поставить ! перед preg_match() теперь

  Ответить  
 
 автор: tokmak   (18.12.2008 в 00:19)   письмо автору
 
   для: BinLaden   (18.12.2008 в 00:11)
 

Теперь вот сижу ищу инфу по preg_match... чтобы более подробней с ней разобраться....

  Ответить  
 
 автор: Trianon   (18.12.2008 в 00:21)   письмо автору
 
   для: tokmak   (17.12.2008 в 23:41)
 

>... Но согласитесь, лучше уж, хоть какая-та защита, чем вообще никакой. ;)

А я не соглашусь с самим принципом.
Защита дарит надежду.
А негодная защита имеет следствием атаку тогда и там, где её совсем не ждешь.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования