PHP защита от SQLi

tyrla4eto

Registered
Здравейте,
имам 1 логин форма, която след като я сканирах за SQLi ми изважда, че е уязвима на този вид атаки:

Код:
-1' OR 2+496-496-1=0+0+0+1 --

Пробвах няколко вида функции с които уж да защита променливата, която взимам от полета, чрез $_POST, но разлика няма.

Коя функция може да избегне този тип атака или как най-добре е да защитя формата си?
 
Няма универсална функция(може ида е измислена вече, не знам), но идеята е следната. Първо трябва да си наясно с това какво постъпва като данни.

Примерно: потребителското име - да кажем, че идеалния вариант е да е( a-z0-9_- ) , тогава мисля, че ще можеш да ползваш и регулярен израз, или просто да ползваш някоя от готовите функции за премахване на html тагове (htmlspeialchars, addslashes, strpos и тем подобни) .. и т.н.

Но според мен, идеята е следната, сядаш и мислиш къде какво ти постъпва и да следиш за перфектната ситуация, всичко освен нея, е грешка или опит за хак. :idea: :?:

Може би начина ми на мислене е мако старомоден ама за сега върши работа, ще се радвам да вида други мнения на колеги. :?:
 
Благодаря ти за отговора! Тези регулярни изрази въобще не сами ясни.. Пробвах функции като htmlspeacialchars, mysql_real_escape_string, addslashes, strpos но нищо не се получава.. Освен с регулярен израз има ли някакъв друг начин по който мога да избегна въвеждането на " ' ", " + ", " - " в полето?
 
str_replace , preg_replace и т.н. Няма да е лошо да прверяваш от време на време в сайта на PHP, там са показани примери и са обяснени подробно всяка функция какво прави. Да, може и просто в гугъл да напишеш и също ще намериш нещо :idea: :?:
 
mysql_* са deprecated. Разгледай
http://php.net/manual/en/mysqli.quickstart.prepared-statements.php или ниправо PDO
 
Ако тръгна да правя PDO трябва да пренаписвам цялата система...А иначе скрипта е написан (не от мен), като след проверка дали името и паролата са правилни активира бисквитка. Скенера ми показва, че тази бисквитка приема тези стойности подобни на " -1' OR 2+496-496-1=0+0+0+1 --". Каквато и функция да сложа е същата работа. Интересното е че променям името на input полето от user на user123 и пак приема бисквитка с тези стойности. Проверих целия код няма никъде другаде код за стартиране на бисквитка. От къде може да се получава това? А когато изкарам резултата от $_POST["user"] ми изкарва само това, което съм написал, но все пак запазва бисквитка с тези стойности, които споменах по-горе...



(Това го забелязах преди малко за това сега пиша цялото инфо, ако може някой да помогне с отстраняването на проблема. Благодаря!)
 

Back
Горе