Има много различни начини да се вкара нежелан код в чужда страница.
Ако искате да вкарате данни, получени от потребителя, и да ги запазите в база данни може да си докарате голяма беля, ако не знаете как да се защитите.
Доста често във форумите се дискутират различни начини на защита, но най-удачният, който използвам вече навсякъде беше предложен (ако не ме лъже паметта) от @vaskoa. Решението му беше да се използва PDO.
Ето един примерен код:
Код:
$dsn = 'mysql:dbname=testdb;host=localhost';
$user = 'dbuser';
$password = 'dbpass';
try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
exit();
}
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
Да разгледаме кода.
на първият ред е написана стандартният за PDO начин за конектване. Пишете си името на базата данни, потребителя, паролата и хоста.
След това както виждате PDO работи с Exceptions, затова ще ви е по-удобно да си сложите собствен хендлър -> http://bg.php.net/set_exception_handler
След това имаме 2 променливи $calories и $color. Да приемем, че са получени от потребител, което автоматично означава, че не може да им се има доверие. Най-важното, което съм научил е, че за да кодираш, независимо на какъв език, трябва да си параноик. Параноята е твой приятел! Запомнете това. Ще ви спести доста главоболия!
След тези променливи сидва ред на SQL заявката.
Обърнете внимание, че на мястото, където трябва да са поставени двете променливи има :color и :calories.
Обяснението е следното: На следващите два реда, те се заместват с променливите, получени от потребителя.
Разликата е, че в PDO::Statements функцията bindParam обезопасява стринга от възможни нежелани кодове. Само трябва да се зададе типа на данните, получени от потребителя. В случая имаме стринг -> PDO:

ARAM_STR и число -> PDO:

ARAM_INT.
Това е. PDO се оправя с останалото. Вече няма притеснения от SQL Injection!
За пълната документация вижте в http://php.net/pdo
