我已经在我网站的每个页面上运行之前运行的清理类。我非常确定addslashes与使用mysql_real_escape_string进行转义相同。
class sanatize
{
private static $singleton;
function __construct(){
$_CLEAN_POST = array();
$_CLEAN_GET = array();
$_CLEAN_REQUEST = array();
foreach($_REQUEST as $key => $value)
{
$key = addslashes(trim(strip_tags($key)));
$value = addslashes(trim(strip_tags($value)));
$_CLEAN_REQUEST[$key] = $value;
}
foreach($_GET as $key => $value)
{
$key = addslashes(trim(strip_tags($key)));
$value = addslashes(trim(strip_tags($value)));
$_CLEAN_GET[$key] = $value;
}
foreach($_POST as $key => $value)
{
if(is_array($value)){
foreach($value as $key2 => $value2){
$key2 = addslashes(trim(strip_tags($key2)));
$value2 = addslashes(trim(strip_tags($value2)));
$_CLEAN_POST[$key][$key2] = $value2;
}
}
else{
$key = addslashes(trim(strip_tags($key)));
$value = addslashes(trim(strip_tags($value)));
$_CLEAN_POST[$key] = $value;
}
}
$_POST = array();
$_GET = array();
$_REQUEST = array();
$_POST = $_CLEAN_POST;
$_GET = $_CLEAN_GET;
$_REQUEST = $_CLEAN_REQUEST;
}
function __destruct()
{
//echo "cleaned";
}
public static function getInstance()
{
if(is_null(self::$singleton))
{
self::$singleton = new sanatize();
}
return self::$singleton;
}
}
然后我将使用
调用它$sanatize = sanatize::getInstance();
答案 0 :(得分:7)
“我非常确定addslashes与使用mysql_real_escape_string进行转义相同。”
首先,事实并非如此。 mysql_real_escape_string
知道连接,并考虑该连接的字符集。
其次,您基本上复制了失败的magic_quotes
设计。并非所有这些字段都进入数据库,因此您正在进行不必要的工作。你也必须要小心,不要在“干净”的阵列中重新逃脱;双重逃避是一个非常普遍的问题。
在我看来,SQL注入的最简单的解决方案是预处理语句。我建议使用PDO
或mysqli
。
MySQLi_STMT
。 mysqli::prepare
给出了如何创建变量并将变量绑定到预准备语句的示例。请注意?
占位符。另请查看mysqli_stmt::bind_param
。