Mysql
 sql >> база данни >  >> RDS >> Mysql

$_SESSION безопасен ли е от sql инжектиране?

Всъщност не е нужно да тествате дали входът е числов, защото в MySQL всеки низ, напр. '123abc' в числов контекст (като сравняване с целочислена колона id ) имплицитно приема само цифрите и игнорира останалите. Нецифров низ като 'abc' просто има целочислена стойност 0, защото няма водещи цифри.

Въпросът е, че стойностите са безопасни от SQL инжекция, ако използвате параметри на заявката. Дали входовете идват от $_SESSION или друг източник е без значение. $_SESSION не е нито безопасен, нито опасен по отношение на SQL инжектирането, важно е как предавате данните към заявката си.

Също така бих опростил кода, за да форматирам списъка с заместители на параметри:

$placeholders = implode(',', array_fill(1, count((array)$_SESSION['story']), '?'));

И забравете за bindParam(), просто предайте масива на execute() .

//Collect all data needed
$storyQuery = openConnection() -> prepare("SELECT * FROM `stories` 
    WHERE `id` IN ({$placeholders})");
$storyQuery -> execute((array)$_SESSION['story']);
$story = $storyQuery -> fetchAll();

Относно вашия коментар:

В PDO можете да използвате или наименувани параметри като :id , или можете да използвате позиционни параметри, които винаги са ? (но не смесвайте тези два типа в дадена заявка, използвайте единия или другия).

Подаване на масив към execute() автоматично свързва елементите на масива с параметрите. Прост масив (т.е. индексиран от цели числа) е лесен за свързване с позиционни параметри.

Ако използвате именувани параметри, трябва да предадете асоциативен масив, където ключовете на масива съвпадат с имената на параметрите. По избор ключовете на масива могат да имат префикс с : но не е задължително.

Ако сте нов в PDO, наистина си струва да прочетете документацията . Има примери за кодове и всичко!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете MySQL база данни и да зададете привилегии

  2. Използване на MySQL с Android

  3. Как да накарам тази заявка да се изпълнява по-бързо?

  4. Codeigniter simple_query срещу конструктор на заявки (вмъкване, актуализиране и изтриване)

  5. Върнете както резултат от заявката, така и брой редове