我必须处理一个非常遗留的大型代码库,该代码库使用以下函数使SQL查询SQL注入安全。我想知道我如何使它足够安全的SQL漏洞,使网站安全?
function to_sql($Value, $ValueType = "Text") {
global $DB_conn;
if ($ValueType == "Plain") {
return addslashes ( $Value );
}
if ($ValueType == "Number" || $ValueType == "Float") {
return doubleval ( str_replace ( ",", ".", $Value ) );
}
if ($ValueType == "Check") {
if ($Value == 1) {
return "'Y'";
}
return "'N'";
}
if ($ValueType == "Text") {
if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc())
{
$Value = stripslashes($Value);
}
$Value=mysqli_real_escape_string($DB_conn,$Value);
return "'" . $Value . "'";
}
else{
return "'" . addslashes ( $Value ) . "'";
}
}
这个函数在SQL查询中使用如下:
SELECT state_id, state_title
FROM geo_state
WHERE country_id=" . to_sql($country,"Number") . "
AND country_name='".to_sql($country_name,"Text")."'
ORDER BY state_title;
注意:请因为它非常大的代码库,它不可能以新的方式重写所有查询,如PDO或使用mysqli函数,所以我需要解决方案,可以解决这个函数本身内的SQL注入和安全问题。
你必须摆脱Plain
模式,它根本不增加安全,因此每一个使用它的情况下,你的代码本质上是脆弱的。
摆脱else
子句也是一个好主意,因为它只是复制Text
模式,但编码数量较少。
因此,我建议将Text
模式作为默认模式,去掉Plain
模式,并最终研究使用Plain
的情况下的代码。
function to_sql($Value, $ValueType = "Text") {
global $DB_conn;
if ($ValueType == "Number" || $ValueType == "Float") {
return doubleval ( str_replace ( ",", ".", $Value ) );
}
if ($ValueType == "Check") {
return ($Value) ? "'Y'" : "'N'";
}
return "'" . mysqli_real_escape_string($DB_conn,$Value) . "'";
}