Защита в MSSQL

niker

Registered
Кой от тези двата кода е по-добре да използвам за защита в MSSQL(inject/XSS)

Код:
<?php
function secure($str) {
if ( (int)$str )
return $str;
else {
$str = addslashes($str);
$str = htmlspecialchars($str, ENT_NOQUOTES);
return $str;
}
 }
?>

Код:
<?php
function secure($str) {
if ( (int)$str )
return $str;
else {
$str = str_replace("'", "", $str);
return $str;
}
 }
?>
 
Първият, но самата "защита" не добра.. ти филтрираш данните през addslashes и htmlspecialchars.. ами ако ще ти върне някаква стойност с наклонени черти или нещо, което се филтрира и чрез тези две функции .. предлагам ти да си направиш няколко функции, които да филтрираш различни данни, в случая ако учакваш id, значи очаваш число, ето един пример ..

Код:
function secureId($id)
{
$id=htmlspecialchars(addslashes(trim(abs($id))));
if (!is_numeric($id) or $id <= 0)
{
echo "На къде така ?";
}
else
{
return $id;
}
}


И после може да я ползваш така :
Код:
$id=secureId($_GET['id']);

echo $id;

Това е само като чакаш id .. вече си прави извода как ще си правиш другите функции ..
 
Е искам просто да се предпазя от inject i XSS.
ако можеш да ми дадеш някаква добра "защита"
ще съм ти благодарен.
 
Слагаш това от горе на страницата си ..
Код:
<?php
$queryString = strtolower($_SERVER['QUERY_STRING']);

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;
}
?>
 
kulov каза:
Първият, но самата "защита" не добра.. ти филтрираш данните през addslashes и htmlspecialchars.. ами ако ще ти върне някаква стойност с наклонени черти или нещо, което се филтрира и чрез тези две функции .. предлагам ти да си направиш няколко функции, които да филтрираш различни данни, в случая ако учакваш id, значи очаваш число, ето един пример ..

Код:
function secureId($id)
{
$id=htmlspecialchars(addslashes(trim(abs($id))));
if (!is_numeric($id) or $id <= 0)
{
echo "На къде така ?";
}
else
{
return $id;
}
}


И после може да я ползваш така :
Код:
$id=secureId($_GET['id']);

echo $id;

Това е само като чакаш id .. вече си прави извода как ще си правиш другите функции ..

При изключени magic_quotes, addslashes() не слага наклонени черти до кавичките.
 
Нито един от двата начина, които си дал е добър .. Погледни последното ми мнение и ползвай това, което ти дадох..
 
Код:
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.
 
Ок мерси имам 4 въпроса:
1) Върши ли работа: mysql_real_escape_string(trim($));
2) И мога ли да добава към функцията с addslashes и htmlspecialchars и trim, за да избегна примерно, ако са написали без да искат потребителите празните места.
3) Какво точно прави mysql_real_escape_string.
4) И дали да ползвам mysql_real_escape_string или addslashes и htmlspecialchars (Но искам да ползвам и trim)
 
niker каза:
Ок мерси имам 4 въпроса:
1) Върши ли работа: mysql_real_escape_string(trim($));
2) И мога ли да добава към функцията с addslashes и htmlspecialchars и trim, за да избегна примерно, ако са написали без да искат потребителите празните места.
3) Какво точно прави mysql_real_escape_string.
4) И дали да ползвам mysql_real_escape_string или addslashes и htmlspecialchars (Но искам да ползвам и trim)

mysql_real_escape_string прави същото като addslashes, в някои случаи е по-добре от addslashes, но трябва да имаш отворена връзка с БД когато го ползваш. С две думи не става да сложиш кода най-горе и той да ти обработи всичко в $_GET и $_POST. Ползвай го с htmlspecialchars (който пази от XSS). Няма проблем да слагаш и trim, където ти трябва.
 
niker каза:
Ок мерси имам 4 въпроса:
1) Върши ли работа: mysql_real_escape_string(trim($));
2) И мога ли да добава към функцията с addslashes и htmlspecialchars и trim, за да избегна примерно, ако са написали без да искат потребителите празните места.
3) Какво точно прави mysql_real_escape_string.
4) И дали да ползвам mysql_real_escape_string или addslashes и htmlspecialchars (Но искам да ползвам и trim)
http://shiflett.org/blog/2006/jan/addslashes-versus-mysql-real-escape-string
 

Back
Горе