Код:
function secureId($id)
{
$id=htmlspecialchars(addslashes(trim(abs($id))));
if (!is_numeric($id) or $id <= 0)
{
echo "На къде така ?";
}
else
{
return $id;
}
}
@kulov я помисли малко какво правиш тук... Наблъскал си всичко дето си видял в нета без да го осмислиш. Например правиш abs и после проверяваш дали е по-малко от 0... Минаваш през htmlspecialchars и addslashes и trim, а после проверяваш дали е число. Еми ако е число тези функции няма да имат никакъв ефект, ако пък не е число няма да мине проверката.
И друго.. ако случайно това $id не е число твоя код няма да спре да се изпълнява, ще покаже "На къде така ?" и ще избълва куп грешки и на mysql и на php, някои от които са доста информиращи за потенциалния хакер.
После това дето си го дал като суперзащита няма да осигури и 5% от това, което трябва като защита на даден сайт.
if (strstr($queryString,"<") OR strstr($queryString,">") OR strstr($queryString,"(") OR strstr($queryString,")") OR
strstr($queryString,"..") OR
strstr($queryString,"%") OR
strstr($queryString,"*") OR
strstr($queryString,"+") OR
strstr($queryString,"!") OR
strstr($queryString,"@")) {
echo "На къде бе ?";
exit;
Правиш една проверка дали адреса съдържа <>(..%*+!@ Ако си проверяваш всяка променлива дето взимаш от суперглобалите за входна информация това ще ти е абсолютно излишно.
Друго - не всички входни данни се съдържат в адреса... За $_POST, $_COOKIE и т.н. чувал ли си?
И от друга страна не прави нищо срещу SQL инжекциите.
А да, за addslashes. Тая функция винаги си слага наклонените черти, но ако е включено magic_quotes чертите стават ДВЕ. Ето пример защо не се визуализира една от тях.
addslashes БЕЗ magic_quotes
Код:
INSERT INTO ... VALUES ( 'текст \' с \' кавички')
В БД се записва
Това е защото mysql разбира тези черти пред кавичките като знак ДА НЕ изпълнява кавичките, а не като част от текста, който подавате.
addslashes С magic_quotes
Код:
INSERT INTO ... VALUES ( 'текст \\' с \\' кавички')
записва
защото той си изпълнява вторите наклонени черти, които неутрализират кавичките, а останалите стават просто част от текста.
Най-добре ако не ти се занимава да проверяваш всяко едно нещо ползвай това:
Код:
<?php
function secure($str) {
if ( is_numeric($str) )
return $str;
else {
$str = addslashes($str);
$str = htmlspecialchars($str, ENT_NOQUOTES);
return $str;
}
}
?>
НО ВИНАГИ, ЗАДЪЛЖИТЕЛНО ако очакваш само число го проверявай с is_numeric или нещо подобно. Особено ако пишеш "правилен" SQL.
Например ако правиш както е редно и не заграждаш числата в заявките с кавички не е нужно да има такива в променливата. Мисля, че тая лоша практика не работеше при MsSQL.