PDO-ի մեջ հարցումների խնդիրները PHP-ում
Ինչպես արդեն պետք է իմանաք, SQL հարցումները ենթակա են SQL ներարկումների: PDO ընդլայնումը նախատեսված է պայքարելու ներարկումների դեմ, բայց պարզապես, լռելյայն, այն դա չի անում:
Եկեք նայենք խնդրին օրինակով: Ենթադրենք մենք ունենք հետևյալ հարցումը, որի մեջ տեղադրվում է փոփոխական.
<?php
$sql = "SELECT * FROM users WHERE id=$id";
$res = $pdo->query($sql);
?>
Ենթադրենք մեր փոփոխականը գալիս է ինչ-որ տեղից դրսից, օրինակ՝ GET պարամետրից: Պարզության համար, սակայն, եկեք պարզապես սահմանենք դրա արժեքը ձեռքով: Մենք ակնկալում ենք ինչ-որ թվային արժեք, օրինակ՝ այսպիսին.
<?php
$id = 1;
?>
Չարահամար հաքերը, սակայն, կարող է փոխանցել
հետևյալ արժեքը (ենթադրենք, որ մենք
ունենք role դաշտ).
<?php
$id = '-1 OR role="admin"';
?>
Ստացվում է, որ մենք ցանկանում էինք կատարել հետևյալ հարցումը.
<?php
$sql = "SELECT * FROM users WHERE id=1";
$res = $pdo->query($sql);
?>
Իսկ ստացանք հետևյալը, որն դուրս է բերում կայքի ադմինիստրատորին.
<?php
$sql = "SELECT * FROM users WHERE id=-1 OR role="admin"";
$res = $pdo->query($sql);
?>
Նման իրավիճակից խուսափելու համար PDO-ում նախատեսված է հատուկ մեխանիզմ, որը կոչվում է պատրաստված հարցումներ: Դրանք մենք կքննարկենք հաջորդ դասում:
Կանխամտածված իրականացրեք SQL ներարկում ձեր տվյալների բազայում: