Проблем със защита за XSS.

iCreatives

Registered
Здравейте,
Ползвам ето тази защита за XSS:
PHP:
<?php
header ('Content-type: text/html; charset=utf-8');
$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,"@")) { 
$loc = $_SERVER['PHP_SELF']; 
$ip = $_SERVER['REMOTE_ADDR']; 
$date = date ("d-m-Y @ h:i:s"); 
$lfh = "./adm/logs.php"; 
$log = fopen ( $lfh,"a+" ); 
fputs ($log, "Дата: $date | Атака от: $ip | Атака над: $loc?=$queryString\n<br>"); 
fclose($log); 
echo "<font color=black>Вашата атака беше записана, и скоро ще лапнете бана!</font>"; 
exit;
} 
?>

Проблема е следния: Когато предавам променлива с $_GET и стойността и е написана на български счита това за атака.
Пример: profile.php?username=Иван
Ще ми изведе грешката, ако е така:
profile.php?username=Ivan
няма проблям!
Как да го оправя?
Мерси! :)
 
PHP:
<?php
header ('Content-type: text/html; charset=utf-8');
$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,"@")) { 
$loc = $_SERVER['PHP_SELF']; 
$ip = $_SERVER['REMOTE_ADDR']; 
$date = date ("d-m-Y @ h:i:s"); 
$lfh = "./adm/logs.php"; 
$log = fopen ( $lfh,"a+" ); 
fputs ($log, "Дата: $date | Атака от: $ip | Атака над: $loc?=$queryString\n<br>"); 
fclose($log); 
echo "<font color=black>Вашата атака беше записана, и скоро ще лапнете бана!</font>"; 
exit;
} 
?>
 
Проблема е, че браузера не чете кирилица и превръща думата в символи от рода на %&20+ а те са забранени в защитата и за това отчита атака.
 
iCreatives каза:
Така няма да има защита от:
PHP:
strstr($queryString,"+") OR

Друг вариант няма ли?

Да, но другите неща, който отново се използват в XSS, както и SQLi ги има ;)
 
Преди това в изращащия скрипт ако думата е на кирилица -> base64_encode. Или нещо такова, което просто да помага кирилишките думи да минават проверката.
 
Не ми се занимава... Най-вероятно ще направя така както ми каза nom3r1. Ще помисля още малко и ще пиша ако се сетя за нещо! :)
 
iCreatives каза:
webdeveloper каза:
Аз лично всичките си думи ги обърнах в латиница със str_replace и нямам проблеми.
Звучи ми като "много играчка"... :D

Кое му е играчката?

PHP:
function latinica($lat)
{
$latinica=array("a","b","v", "g","d","e", "j", "z", "i", "ii", "k", "l", "m","n","o", "p","r","s", "t","u","f", "h","c","ch" , "sh","sht", "u", "io", "iu", "q", "A","B","V", "G","D","E", "J", "Z", "I", "II", "K", "L", "M","N","O", "P","R","S", "T","U","F", "H","C","CH" , "SH","SHT", "U", "IO", "IU", "Q"); //масива със латинските букви

$kirilica=array("а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м", "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ь", "ю", "я", "А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ь", "ю", "Я"); //масива със кирилица, съответстващ на този с латиница

$bbc_num=count($kirilica); //бройм елементите във масива $kirilica
$loop=0;
while($loop<$bbc_num)
{
$lat=str_replace($kirilica[$loop], $latinica[$loop], $lat); //заместваме буквите
$loop++;
}
return $lat;
}
$strings = latinica($dumite_na_kirilica);
 

Back
Горе