2013-10-26 6 views
0

Сбор данных из строки запросаMySQL проблема безопасности п.д.о.

$cat_id=$_GET['cat_id']; // Actual 

$cat_id="'2','3'"; // Sample data format required 

$sql="select * from table_name where cat_id IN ($cat_id)"; 

foreach ($dbo->query($sql) as $row) { 

    $str=$str . "$row[subcat]".","; 

} 

Как я собираю данные из строки запроса, и я должен был использовать в этом формате (2-я строка), как я могу предотвратить инъекции нападение здесь?

+0

возможно дубликат [Как я могу предотвратить SQL-инъекции в PHP?] (Http://stackoverflow.com/questions/60174/how-can- i-prevent-sql-injection-in-php) – jcolebrand

ответ

0

Если есть только цифры пришли из $_GET, то здесь этого простого решения, который заставляет каждый тип члена $cat_id подмножества быть целым числом:

$cat_id = implode(
    ',', 
    array_map(
     function($v){ return (int)$v; }, 
     explode(',', $cat_id) 
    ); 
); 

Он будет разделен $cat_id на массив ['1','2'] с explode() функция, затем преобразует каждый элемент в целое число с array_map() и присоединяет массив к строке с запятой (,) в качестве разделителя на implode(). Результат: '1,2'.

Однако я хотел бы предложить прочитать this question. Если вы используете pdo, вы можете просто попытаться использовать функцию FIND_IN_SET() вместо IN с привязкой параметров. Похожие вопросы:

  1. PDO binding values for MySQL IN statement
  2. PHP PDO: Can I bind an array to an IN() condition?
+1

Единственная проблема с 'FIND_IN_SET()' заключается в том, что оптимизатор будет сканировать всю таблицу для оценки каждой строки, поскольку она не понимает, существует потенциал для преобразования выражения в что-то, что он может решить, используя индексы. –

Смежные вопросы