Защита textareta от XSS

kenwood10

Registered
Здравейте имам следния php код:


PHP:
<div align="center">
<?php
$cl_text = $_REQUEST['cl_text'];
$lang = $_REQUEST['lang'];
$retext = $cl_text;

$cyrilic = array('ч','щ','ш','ю','а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ъ','ь','я','у','Ч','Щ','Ш','Ю','А','Б','В', 'Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ъ','Ь','Я','У');
$latin = array('ch','sht','sh','iu','a','b','v','g','d','e','j','z','i','j','k','l','m','n','o','p','r','s','t','u','f','h','c','y','y','q','w','Ch','Sht','Sh','Iu','A','B','V', 'G','D','E','J','Z','I','J','K','L','M','N','O','P','R','S','T','U','F','H','C','Y','Y','Q','W');

$i = "0";

if ($lang == "cyrilic") {
while($i < count($latin)) {
$retext = str_replace($latin[$i], $cyrilic[$i], $retext);
$i++;
}
}else{
if ($lang == "latin") {
while($i < count($cyrilic)) {
$retext = str_replace($cyrilic[$i], $latin[$i], $retext);
$i++;
}
}
}

echo '<form action="?" method="GET"> <b>Въведи текста на кирилица:</b><br/>
<textarea name="cl_text" rows="6" cols="65">'.$cl_text.'</textarea><br/>
<b>Преведен:</b><br/>
<textarea rows="6" cols="65">'.$retext.'</textarea><BR/>
<input type="radio" name="lang" value="cyrilic" id="langC"><label for="langC">Към Кирилица</label>     <input type="radio" name="lang" value="latin" id="langL"><label for="langL">Към Латиница</label><br/>
<input type="submit" value="Обърни"/>     <input type="reset" value="Изчисти"/>
</form>';

?>
</div>


Как да го защитя от XSS ? ... Благодаря предварително търсих урок спецялно за textareta , но не намерих.. Ако някои може да помогне да пише :)
 
Ето тези редове
Код:
$cl_text = $_REQUEST['cl_text'];
$lang = $_REQUEST['lang'];
$retext = $cl_text;
ги замени така:
Код:
$cl_text = addslashes(htmlspecialchars($_REQUEST['cl_text']));
$lang = addslashes(htmlspecialchars($_REQUEST['lang']));
$retext = $cl_text;
[/code]
 
dakata__92 каза:
Ето тези редове
Код:
$cl_text = $_REQUEST['cl_text'];
$lang = $_REQUEST['lang'];
$retext = $cl_text;
ги замени така:
Код:
$cl_text = addslashes(htmlspecialchars($_REQUEST['cl_text']));
$lang = addslashes(htmlspecialchars($_REQUEST['lang']));
$retext = $cl_text;
[/code]

Защо му е addslashes + htmlspecialchars. Ако има htmlspecialchars(), тези " и тези ' ще станат на и & #039; и следователно нямат нужда от escaping, което идва от addslashes().
 
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. Така сте напълно защитени. Не се лъжете от това, което някои казват, че повече функции било по-добре защита. С повече функции можете само да си прецакате скрипта.

Цитирам от този урок ! Досега винаги ми е помагал :
http://web-tourist.net/login/login/view.php?st=2418
 
http://web-tourist.net/login/login/view.php?st=2418

Точно заради този урок съм измъкнал над 57 сайта :] Тази функция не струва защо много бъгове създава по добре си прегледайте кодовите и ги покрийте :)
 
dakata__92 каза:
Ето тези редове
Код:
$cl_text = $_REQUEST['cl_text'];
$lang = $_REQUEST['lang'];
$retext = $cl_text;
ги замени така:
Код:
$cl_text = addslashes(htmlspecialchars($_REQUEST['cl_text']));
$lang = addslashes(htmlspecialchars($_REQUEST['lang']));
$retext = $cl_text;
[/code]


Тъй като не разбирам от защити сега последно това ли да слагам ... Някои мнение ?
 
phpbot каза:
http://web-tourist.net/login/login/view.php?st=2418

Точно заради този урок съм измъкнал над 57 сайта :] Тази функция не струва защо много бъгове създава по добре си прегледайте кодовите и ги покрийте :)
Дай пример тогава , как да се защити това текстово поле и какви бъгове съсдава ! кАто цяло си филтрира добре това, че при сял инжекция можеш да добавиш <> под формата на html кодировката на знаците както се спомена по-горе е друго . Ако в случая извеждаш така stranica.php?neshto=1 слагаш един инт на променливата при гет заявката и сяла е прекратен :) Но ако греша моля да ми се обясни и с примери понеже доста се порових за това в нета и в туриста ! :)
 
Стана ми интересно и се зачетох но се замислих малко та въпроса ми по темата e какво ще стане ако филтрираме входните данни двойно
$cl_text = addslashes(htmlspecialchars($_REQUEST['cl_text']));
$lang = addslashes(htmlspecialchars($_REQUEST['lang']));

така и после ги ескейпнем
mysql_real_escape_string($cl_text);
mysql_real_escape_string($lang);

Всичко това в един код какво ще стане със защитата ? Ще изведе грешка или ще се "неутрализира", или ще кодира данните много лошо обяснете защото се зачетох, а темата е интересна и актуална. Ако не ще си направя експерименти и сам :D
 
PHP:
<div align="center">
<?php
$f = array("(",")","\"", "\\", "/", "=", "&", "%", "#", "*", "<", ">", "|", "'", ";", ":", "`", "?", "!", "..");
$cl_text = str_replace($f,"",$_REQUEST['cl_text']);
$lang = str_replace($f,"",$_REQUEST['lang']);


$retext = $cl_text;

$cyrilic = array('ч','щ','ш','ю','а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ъ','ь','я','у','Ч','Щ','Ш','Ю','А','Б','В', 'Г','Д','Е','Ж','З','И','Й','К','Л','М','Н','О','П','Р','С','Т','У','Ф','Х','Ц','Ъ','Ь','Я','У');
$latin = array('ch','sht','sh','iu','a','b','v','g','d','e','j','z','i','j','k','l','m','n','o','p','r','s','t','u','f','h','c','y','y','q','w','Ch','Sht','Sh','Iu','A','B','V', 'G','D','E','J','Z','I','J','K','L','M','N','O','P','R','S','T','U','F','H','C','Y','Y','Q','W');

$i = "0";

if ($lang == "cyrilic") {
while($i < count($latin)) {
$retext = str_replace($latin[$i], $cyrilic[$i], $retext);
$i++;
}
}else{
if ($lang == "latin") {
while($i < count($cyrilic)) {
$retext = str_replace($cyrilic[$i], $latin[$i], $retext);
$i++;
}
}
}

echo '<form action="?" method="GET"> <b>Въведи текста на кирилица:</b><br/>
<textarea name="cl_text" rows="6" cols="65">'.$cl_text.'</textarea><br/>
<b>Преведен:</b><br/>
<textarea rows="6" cols="65">'.$retext.'</textarea><BR/>
<input type="radio" name="lang" value="cyrilic" id="langC"><label for="langC">Към Кирилица</label>     <input type="radio" name="lang" value="latin" id="langL"><label for="langL">Към Латиница</label><br/>
<input type="submit" value="Обърни"/>     <input type="reset" value="Изчисти"/>
</form>';

?>
</div>

Това мисля че ще ти помогне ;)
 

Back
Горе