我必须处理一个非常遗留的大型代码库,它使用以下函数来使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注入和安全问题的解决方案。
答案 0 :(得分:1)
你必须摆脱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) . "'";
}