PDO-ի մեջ հարցումների խնդիրները PHP-ում

Ինչպես արդեն պետք է իմանաք, SQL հարցումները ենթակա են SQL ներարկումների: PDO ընդլայնումը նախատեսված է պայքարելու ներարկումների դեմ, բայց պարզապես, լռելյայն, այն դա չի անում:

Եկեք նայենք խնդրին օրինակով: Ենթադրենք մենք ունենք հետևյալ հարցումը, որի մեջ տեղադրվում է փոփոխական.

php<?php
  $sql = "SELECT * FROM users WHERE id=$id";
  $res = $pdo->query($sql);
?>

Ենթադրենք մեր փոփոխականը գալիս է ինչ-որ տեղից դրսից, օրինակ՝ GET պարամետրից: Պարզության համար, սակայն, եկեք պարզապես սահմանենք դրա արժեքը ձեռքով: Մենք ակնկալում ենք ինչ-որ թվային արժեք, օրինակ՝ այսպիսին.

php<?php
  $id = 1;
?>

Չարահամար հաքերը, սակայն, կարող է փոխանցել հետևյալ արժեքը (ենթադրենք, որ մենք ունենք role դաշտ).

php<?php
  $id = '-1 OR role="admin"';
?>

Ստացվում է, որ մենք ցանկանում էինք կատարել հետևյալ հարցումը.

php<?php
  $sql = "SELECT * FROM users WHERE id=1";
  $res = $pdo->query($sql);
?>

Իսկ ստացանք հետևյալը, որն դուրս է բերում կայքի ադմինիստրատորին.

php<?php
  $sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
  $res = $pdo->query($sql);
?>

Նման իրավիճակից խուսափելու համար PDO-ում նախատեսված է հատուկ մեխանիզմ, որը կոչվում է պատրաստված հարցումներ: Դրանք մենք կքննարկենք հաջորդ դասում:

Задание 1

Կանխամտածված իրականացրեք SQL ներարկում ձեր տվյալների բազայում: