Good afternoon,
The use of htmlspecialchars will not solve sophisticated XSS attacks. I advise using this Anti-xss class which is more specific:
<?php
class AntiXSS {
public static $err = "XSS Detected!";
/*
* @function : setEncoding
* @return : String
* @parameters : str: Content you want to change the character encoding
* newEncoding: Character encoding you want set
* @description: Convert the character encoding of the string
* to newEncoding from currentEncoding. currentEncoding
* detecting by function so you only need give str and
* newEncoding to the setEncoding function.
*/
public static function setEncoding($str, $newEncoding) {
$encodingList = mb_list_encodings();
$currentEncoding = mb_detect_encoding($str, $encodingList);
$changeEncoding = mb_convert_encoding($str, $newEncoding, $currentEncoding);
return $changeEncoding;
}
/*
* @function : blacklistFilter
* @return : String
* @parameters : str: Content you want to filter with blacklist
* @description: Filter the content by blacklist method. Library use
* RSnake's XSS attack vectors. To add new attack vectors
* I'm continue to research.
*/
public static function blacklistFilter($str) {
if (preg_match("/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t(.*)>(.*)/i", $str) > 0) {
return $str;
} else {
return self::$err;
}
}
/*
* @function : whitelistFilter
* @return : String
* @parameters : str: Content you want to filter with blacklist
* whiteFilterPattern: Some patterns for filter the
* data types.
* @description: Filter the content by whitelist method. To add
* new data types, I'm continue to research.
*/
public static function whitelistFilter($str, $whiteFilterPattern) {
switch ($whiteFilterPattern) {
case "string":
$pattern = "([a-zA-Z]+)";
break;
case "number":
$pattern = "([0-9]+)";
break;
case "everything":
$pattern = "(.*)";
break;
default:
$pattern = "([0-9a-zA-Z]+)";
break;
}
if(preg_match("/^$pattern $/i", $str) > 0) {
return $str;
} else {
return self::$err;
}
}
/*
* @function : setFilter
* @return : String
* @parameters : str: Content you want to filter with blacklist
* filterMethod: Library have 3 method.
* -Black Method
* -White Method
* -Gray Method
* filterPattern: Some patterns for filter the
* data types. (You can only use with whitelist filter)
* noHTMLTag: Use PHP's strip_tags function to
* remove HTML tags from content.
* @description: Filter the content by method.
*/
public static function setFilter($str, $filterMethod, $filterPattern = NULL, $noHTMLTag = NULL) {
if (urldecode($str) > 0) {
$str = urldecode($str);
}
if ($noHTMLTag == 1) {
$str = strip_tags($str);
}
$str = strtolower($str);
$str = addslashes($str);
$str = htmlspecialchars(trim($str));
switch($filterMethod) {
case "black":
$str = self::blacklistFilter($str);
break;
case "white":
$str = self::whitelistFilter($str, $filterPattern);
break;
default:
break;
}
return $str;
}
}
?>
I hope I’ve helped.
First of all, who told you that this app has no vulnerability ?
– Edilson
Hello @Edilson, as I said in the question, in the researches I did, one of the sites I arrived was this: http://analyste.blogspot.com.br/2009/11/cross-site-scripting-ou-xss.html. .
– adventistapr
htmlspecialchars does not escape simple quotes ', and js online, those in style dom level 0 are ignored.
– Edilson
If I have time, and if I continue in response, I will give you a reply with a few examples where htmlespecialchars let js is injected, even if reduced.
– Edilson
All help is always welcome @Edilson, thank you.
– adventistapr
You must use it
ENT_QUOTES
and use theUTF-8
, in both parameters. In the end you will have something likehtmlspecialchars($texto, ENT_QUOTES, 'UTF-8')
, another detail is whether to do this before (save to the database already with htmlspecialchars) or whether to save "normal" and use it in the after in the view. The second says it is better, because it prevents a string from being "broken" by the bank boundary. For curiosity the first method is used by Wordpress, which uses up to MD5 and supports up to PHP 5.2, ie is not a security reference.– Inkeliz
You can sanctify $_GET, $value = filter_var($_GET["search"], FILTER_SANITIZE_STRING);
– Rodrigo Jarouche