这个 PostgreSQL 查询是否存在漏洞?

3
使用pg_escape_literal PHP函数,我将用户输入数据进行转义,具体操作如下:
  <?php
  $dbconn = pg_connect('dbname=foo');
  $escaped = pg_escape_literal($_GET['name']);
  pg_query("INSERT INTO participants (name) VALUES ({$escaped})");
  ?>

作为一个新手,我有以下的问题:

  • 是否有一种方法可以在给定的代码中实现SQL注入攻击?
  • 这段代码中还存在未处理的其他漏洞吗?

使用PHP 5.4和PostgreSQL 9.2。


感谢您展示代码、版本并提供明确的问题。非常感谢。 - Craig Ringer
2个回答

4

由于您不信任任何用户输入并相应地进行了转义,因此其中没有注入。

此外,您可以使用预处理语句来确保您不会忘记任何转义,并为句子选择正确的数据类型。

请记住,如果您忘记了仅一个转义字符,整个系统都将受到威胁,尽管其他部分可能已经进行了转义。


因此,剔除明显的SQL注入尝试也是一个好主意。在用户名中找到字符串');?拒绝它可能是值得的。请参见其他帖子上的评论。 - Craig Ringer
是的,但由于“预处理语句”不会受到任何类似尝试的影响,因此这是最安全的方法。此外,它会更快,因为您不需要通过任何正则表达式或其他方式来检查任何尝试。 - StormByte
1
我同意准备好的语句(或参数化语句)非常重要。我只是在说,除此之外,一些数据清理并不一定是一个坏主意,因为它可以帮助阻止攻击者利用应用程序的一部分插入数据,然后再由另一部分(可能是仅供内部使用的部分)使用较弱的安全性来利用这个较弱的应用程序。 - Craig Ringer

0

这是推荐的方法,用于转义查询并确保 SQL 注入攻击无法生效。

如果你非常谨慎或只是想要更加安全,你还可以在转义数据之前进行正则表达式筛选不需要的字符和长度检查。


正如我所指出的,转义应该可以防止 SQL 注入。不过,它仍然可能导致错误的查询。因此,在执行查询之前添加一个正则表达式检查是个好主意,以确保在这种情况下或其他任何情况下,名称字段或其他任何值只包含您的应用程序期望的字符。 - Kami
1
在这种情况下,还要添加一个检查约束,使得在您的代码中无法忘记此检查。 - Frank Heikens
@FrankHeikens 这实际上是一个非常好的想法,因为一个应用程序或应用程序的一部分可以小心地处理不可信数据,从而愉快地插入用户命名为');DELETE FROM users;--'。 一个粗心的应用程序或应用程序的某个部分可能会读取数据并将其插入到另一个字符串中 - “因为它来自数据库,所以它是可信的”。 失误。 在这种情况下,排除明显可疑的字符串(其中没有真正存在的合理原因)是有价值的额外保护措施,虽然不能替代在第一时间编写安全漏洞。 它有助于阻止XSS SQL注入。 - Craig Ringer
@Kami 虽然我认为正则表达式检查是个好主意,但我也认为 Frank 是对的 - 应该将其作为“CHECK”约束来完成,而不是在应用程序中完成。更重要的是,我强烈反对使用 pg_escape_literal 来处理不可信参数。使用参数化查询(“预处理语句”)方法。 - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接