Средства за защита на входните данни
Какво означава SQL инжекция?
SQL инжекциите са начин за променяне на заявката ви към базата данни. MySQL, MSSQL или друга няма значение. Ето нагледен пример за SQL инжекция:
Първоначално в тестов скрипт има заявка за извеждане на данни от MySQL според id, подадено чрез GET.
Ето я заявката:
SELECT * FROM tablica WHERE id = '$id'

При нормално изпълнение на скрипта променливата $id ще съдържа номер,
но ако някой напише на мястото на цифрата това: 5'; DROP TABLE tablica; -- ще може да ви съсипе цялата база данни. Тази инжекция използва GET (променливи подадени чрез http адреса). Може да се направи чрез POST, SESSION, COOKIE и дори SERVER ако ги използватe в скриптовете си.


Сега ще започнем с различните начини да се предпазим от този и други видове атаки. Това са различни функции, които по един или друг начин модифицират входният текст, за да го направят безвреден за вашият скрипт. Ще обясня действието на тези функции.

htmlspecialchars($tekst);
Променя текста, като замeства всички специални символи за HTML като < > % & " и други с техните аналози в HTML. Това ги променя така, че те могат да се виждат в браузера, но той няма да ги счита за HTML и те няма да се изпълнят. Това предпазва от този тип "атаки", които прехвърлят потребителя към други страници. Те подават HTML, а тази функция го неутрализира.

strip_tags($tekst);
Променя текста, като изтрива всякакви HTML тагове. НО, информацията която се подава бива доста осакатена. Дори при потребителски имена от типа на <user> няма да остане нищо. Препоръчвам ви да не я използвате освен ако не сте 100% сигурни, че такива текстове няма да се въвеждат. Например при подаване на URL адреси.

trim($tekst);
Много опасна функция. Премахва всички празни места, таблуации, нови редове и други подобни. Много внимавайте с нея. Използвайте я само в данни, които сте сигурни, че НЯМА да има празни места. Освен това не прави особена защита.

addslashes($tekst);
Основната защита срещу SQL инжекции. Слага \ пред всички кавички, така че SQL да ги игнорира. Винаги трябва да я имате.

Strip_tags(); и htmlspecialchars(); е няпълно Безсмислено да се използват заедно в какъвто и да е ред. Използвайте или едната или другата функция. По-добре htmlspecialchars();
Най-добрата комбинация е htmlspecialchars и addslashes. Така сте напълно защитени. Не се лъжете от това, което някои казват, че повече функции било по-добре защита. С повече функции можете само да си прецакате скрипта.


Понякога е достатъчно само да проверите дали променливата е число или не. Това става много лесно:

<?php
$var = 555;
if ( (int)$var )
echo "Променливата е число";
else
echo "Променливата НЕ е число";


По принцип трябва за всяка променлива да изпълнявате тези функции, но аз ви предлагам по-компактно решение. Този скрипт ще обходи всички входни данни и ще ги направи безвредни за вашите кодове. Достатъчно е само да го сложите в отделен файл и да инклудвате този файл във всеки ваш скрипт в самото начало.
<?php
function za6titi($tekst)
{
if ( (int)$tekst )
return $tekst;
else
{
$tekst = addslashes($tekst);
$tekst = htmlspecialchars($tekst, ENT_NOQUOTES);

return $tekst;
}
}

$_GET = array_map("za6titi", $_GET);
$_POST = array_map("za6titi", $_POST);
$_SESSION = array_map("za6titi", $_SESSION);
$_COOKIE = array_map("za6titi", $_COOKIE);
$_SERVER = array_map("za6titi", $_SERVER);
?>


Забележете, че правя проверка за числа. Ако променливата е число не я прекарва през двете функции, защото първо - с числа не може да ви навреди, второ - променливата вече няма да е число и всички ваши проверки за числа в последствие ще бъдат неточни.

Урока е писан специално за Web-Tourist и забранявам преписването му в други сайтове без разрешение от мен (Stormbreaker) !






/ Трябва да сте регистриран за да напишете коментар /
От: kickme
21:10 02-12-2010
Трябва ли да се променя нещо за догайдане към кода или базата данни?
1