使遗留转义函数SQL注入在PHP中安全


Make a Legacy Escape Function SQL injection Safe in PHP?

我必须处理一个非常遗留的大型代码库,该代码库使用以下函数使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) . "'";
}