【问题标题】:Effective protection function against SQL injection有效的SQL注入防护功能
【发布时间】:2015-09-22 14:12:10
【问题描述】:

我在一个免费软件中发现了这个消毒功能:

function VerifChamps($valeur)
{
$verif = (get_magic_quotes_gpc()) ? htmlentities($valeur, ENT_QUOTES) : addslashes($valeur);
return $verif;
}

然后查询是这样完成的:

$login=VerifChamps($_POST['name']);

mysql_select_db(..., ...);
$query = sprintf("SELECT * FROM table WHERE login='%s'", $login);

$Result = mysql_query($query, $connexion) or die(mysql_error());
$row_RsProf = mysql_fetch_assoc($Result);
mysql_free_result($Result);

这段代码有多安全?如何改进它以使其更加安全?

编辑:服务器正在运行 PHP v5.2.13,打开了 Magic Quotes

【问题讨论】:

    标签: php mysql sql sql-injection sanitization


    【解决方案1】:

    简短的回答是它根本不安全

    这就是它的问题......

    1. 您正在检查 get_magic_quotes_gpc,它已从 PHP 中删除多年
    2. 如果魔术引号打开,则您使用htmlentities 对字符串进行编码,但如果它关闭则不会(损坏数据的方式)
    3. 您为什么要使用htmlentities 将数据发送到数据库?它根本不会阻止 sql 注入。
    4. addslashes 在转义数据时没有考虑客户端连接字符编码(这使得它非常不安全)
    5. 您正在返回一个未定义的变量(即NULL),使整个函数无用

    另外,mysql 已被弃用,并已从 PHP 7 中删除。请改用较新的 MySQLi 扩展。

    您可以简单地将整个函数替换为更新的数据库 API 提供的功能,例如 MySQLiPDO,它们提供 prepared statements 和参数化查询,这些已经被证明是可靠和安全的。您在此处的示例中提供的代码显然很古老且非常不安全。

    【讨论】:

      【解决方案2】:

      很多天以来,我都在使用mysqli_real_escape_string 函数。避免sql注入是一个很好的功能。

      并且,请避免使用mysql 扩展名。此扩展名将来会被删除。相反,应该使用MySQLiPDO_MySQL 扩展名。

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 不鼓励仅链接答案
        猜你喜欢
        • 2019-04-04
        • 1970-01-01
        • 2018-10-21
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多