在PHP中使用Legacy Escape函数SQL注入安全吗?

时间:2015-09-28 13:51:10

标签: php mysql security mysqli pdo

我必须处理一个非常遗留的大型代码库,它使用以下函数来使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注入和安全问题的解决方案。

1 个答案:

答案 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) . "'";
}