【问题标题】:Is this a safe way to prevent database injection? [duplicate]这是防止数据库注入的安全方法吗? [复制]
【发布时间】:2019-05-23 11:20:21
【问题描述】:

我经常使用这样的方法来过滤输入。如图所示使用preg_match( ),或者有时使用switch( ),它仅在POST/GET 变量是特定数量的关键字之一时起作用。

if (preg_match("/^[0-9]+$/",$_POST['id_to_clear']))
    {
    db_query("UPDATE `table` SET `error`=0, `progress`=0 WHERE `id` = {$_POST['id']}");
    }

一般来说,直接在 SQL 查询中使用 POST/GET 变量是一个巨大的危险信号。但在这种情况下,它似乎非常安全。有什么办法可以出错吗?我没看到的东西?

【问题讨论】:

  • 为什么不用参数?不要试图重新发明轮子。
  • 使用准备好的语句:dev.mysql.com/doc/refman/8.0/en/…
  • 是的,我同意@MitchWheat 使用准备好的语句。
  • "有些人在遇到问题时会想'我知道,我会使用正则表达式'。现在他们有两个问题。” ——Jamie Zawinsky。与您展示的正则表达式过滤解决方案相比,查询参数既能更安全地防止 SQL 注入,又更易于编码,这是普遍的看法。

标签: mysql database security sql-injection


【解决方案1】:

您可能应该在这里只使用准备好的语句,PHP 提供了许多实现这一点的 API。话虽如此,如果以下正则表达式通过:

preg_match("/^[0-9]+$/", $_POST['id_to_clear'])

那么id_to_clear POST 值应该只包含数字,在这种情况下,我看不出您向我们展示的查询有任何注入方式。

但是小心,因为即使现在事情可能是安全的,但在未来,您的查询可能会出现问题。没有太多困难,我可以想象稍后进行重构,再次将查询暴露给 SQL 注入。因此,请坚持陈述,除非有令人信服的理由不这样做。

【讨论】:

  • 奇怪的部分是验证$_POST['id_to_clear'],然后使用$_POST['id']:/
  • @JuanCarlosOropeza 那一定是错字:P
  • 是的,这是一个错字,这不是我的确切代码,只是一个非常有代表性的示例。
  • @l008com “代表性样本”仍然需要是实际工作代码。发布您尚未验证的内容是在浪费志愿者的时间,并且不符合应该如何做。见stackoverflow.com/help/mcve。
  • @TimBiegeleisen 你能给我举个例子说明这以后可能不安全吗?因为我想不出任何:/
猜你喜欢
  • 2012-03-26
  • 2015-09-05
  • 2021-08-20
  • 1970-01-01
相关资源
最近更新 更多