Jesus Christ... SQL Injection? PHP Data Objects su tam uz od PHP 5.0 z roku 2004. Trochu fail ze sa za tu dobu coderi nenaucili pouzivat:
$sth = $dbh->prepare('SELECT `name`, `colour`, `calories` FROM `fruit` WHERE `calories` < ? AND `colour` = ?');
$sth->execute(array($_GET['calories'], $_GET['colour']));
Skladat zo stringov sql query a mysliet pri tom na escapovanie mi nepride ako overeny koncept. Nie je ani lahsie, ani kratsie, ani efektivnejsie, ani prehladnejsie, ani bezpecnejsie. Len dementnejsie. Prepared statements tu su uz minimalne 2 dekady. Uz aj prehistoricke perlie DBI ich podporovalo.
Vyhodou prepared statement nie je len escaping. Staci si pozriet definiciu: Precompilation and DB-side caching of the SQL statement leads to overall faster execution and the ability to reuse the same SQL statement in batches.
Chybou je zrejme ze stale sa da volat priame query, kedze PHP je jazyk s vyssim percentom patlalov. Ked sa to programatori nevedia naucit, jazyk by ich mal viest k bezpecnemu kodu
Ak sa pouzije questionmark syntax, tak treba pouzit pole, aby sa vedelo v akom pradi sa maju placeholdery nahradzat. Ale PHP umoznuje aj bindovanie:
$sth = $dbh->prepare('SELECT `name`, `colour`, `calories` FROM `fruit` WHERE `calories` < :calories AND `colour` = :colour');
$sth->bindParam(':calories', $_GET['calories'], PDO::PARAM_INT);
$sth->bindParam(':colour', $_GET['colour'], PDO::PARAM_STR, 12);
Pripadne bindovanie cez asociativne pole:
$sth->execute(array(':calories' => $_GET['calories'], ':colour' => $_GET['colour']));
No to je hezký.
Já ale říkám, že kdyby od začátku mysql_query mělo syntaxi
mysql_query($handle, "select * from users where username='?' and password='?';", $username, hash($password));
tak to ti lidi budou schopni pobrat, kdežto prepared statement může být na __nezkušeného__ programátora příliš složité.
Ber to tak, že když vlezeš na některý vejšky, tak ti na PHPko řeknou blefujnedík.
Prostě spousta wordpress pluginů je psaná třeba šikovnejma středoškolákama...
Myslis ze to je tim PHP? Ukaz mi kus kodu kolem SQL v libovolnym jazyce ... a jednoznacna idetifikace patlala je uz to, ze tam bude select * .
Nebo cokoli na tema try-catch ... nejdriv neco zavola a pak resi, jestli to padlo, coz trebas uzasne funguje na veci typu "zadej cislo" "zadej druhy cislo" ... vysledek A+B = ... jo aha, ona spousta jazyku nema problem secist stringy.
Ok, vylepsime to, budem zjistovat jestli to je cislo ... maly moment ... 0xac ... dobry, prej to je cislo.
Jazyk je od toho aby veci umoznoval ne aby je znemoznoval.