Как предотвратить SQL-инъекцию через параметр массива? (CVE-2017-14069)

  • Автор темы Jvwcdsyixu
  • Обновлено
  • 16, May 2024
  • #1
Привет, эта страница

предположим, что sql_query

 POST nowarned=nowarned&usernw[]=(select*from(select sleep(10))x)


Код (SQL): уязвим для SQL-инъекции «через параметр массива usernw в nowarn.php».

и предлагается эксплойт:

 $r = sql_query("SELECT modcomment FROM users WHERE id IN (" . implode(", ", $_POST[usernw]) . ")")or sqlerr(__FILE__, __LINE__);


Код (разметка): Подскажите, пожалуйста, как должен выглядеть этот sql_query, чтобы предотвратить злоупотребления?

Jvwcdsyixu


Рег
27 Feb, 2012

Тем
62

Постов
199

Баллов
539
  • 21, May 2024
  • #2
Я думаю, что поле «id» будет числовым.

Поэтому вместо того, чтобы выполнять взрыв внутри самого запроса, выполните проверку перед отправкой данных в запрос, например:

$d= $_POST['usernw'];

если( is_array($d) ){

foreach($d as $k=> $kk){

if( !is_numeric($kk)){ unset($d[$k]); }

}

если( sizeof($d)>0 ){

$r = sql_query("ВЫБРАТЬ модкомментарий ОТ пользователей WHERE id IN (" . implode(", ", $d) . ")") или sqlerr(FILE, LINE); }//$d пуст после проверок }//POST не является массивом
 

Vakhidov


Рег
01 Jan, 2011

Тем
60

Постов
222

Баллов
572
  • 05, Jun 2024
  • #3
Спасибо, я нашел, что один человек сделал бы это вот так, поверните: $r = sql_query("ВЫБРАТЬ модкомментарий ОТ пользователей WHERE id IN (" . implode(", ", $POST) . ")") или sqlerr(__FILE_, LINE); в: $r = sql_query("ВЫБРАТЬ модкомментарий ОТ пользователей WHERE id IN (" . sqlesc(implode(", ", $POST) ). ")") или sqlerr(__FILE_, LINE); это кажется более простым, чем способ @JEET. обратная связь приветствуется
 

DimaPups


Рег
05 May, 2014

Тем
80

Постов
177

Баллов
607
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно