Php 此PostgreSQL查询是否易受攻击?

Php 此PostgreSQL查询是否易受攻击?,php,security,postgresql,Php,Security,Postgresql,使用PHP函数,我将按如下方式转义用户输入数据: <?php $dbconn = pg_connect('dbname=foo'); $escaped = pg_escape_literal($_GET['name']); pg_query("INSERT INTO participants (name) VALUES ({$escaped})"); ?> 作为PostgreSQL的新手,我的问题是: 有没有一种方法可以在给定这段代码的情况下实现SQL注入

使用PHP函数,我将按如下方式转义用户输入数据:

  <?php
  $dbconn = pg_connect('dbname=foo');
  $escaped = pg_escape_literal($_GET['name']);
  pg_query("INSERT INTO participants (name) VALUES ({$escaped})");
  ?>

作为PostgreSQL的新手,我的问题是:

  • 有没有一种方法可以在给定这段代码的情况下实现SQL注入
  • 此代码中是否存在其他未经处理的漏洞

使用PHP5.4和PostgreSQL 9.2

这是用于转义查询和确保sql注入攻击不起作用的推荐方法


如果你特别偏执,或者只是为了安全起见,你也可以在转义之前使用正则表达式清除不需要的字符和数据的长度检查。

因为你不信任任何用户输入,所以你会相应地转义,所以没有注入。 此外,您可以使用来确保不会忘记任何转义,并为句子选择正确的数据类型


请记住,如果您只忘记了一次转义,那么您的整个系统将受到威胁,尽管它可能会转义所有其他部分。

正如我指出的,转义应该会阻止sql注入。但是,它仍然会导致错误的查询。因此,最好在查询之前添加正则表达式检查,以确保此实例中的名称字段或任何其他值通常只包含应用程序所需的字符。在这种情况下,还应添加检查约束,这使得您不可能忘记代码中的任何地方的检查。@FrankHeikens这实际上是一个非常好的主意,因为一个应用程序或应用程序的一部分可以小心地处理不受信任的数据,从而愉快地插入名为
”的用户;从用户中删除--。然后,一个更邋遢的应用程序或部分应用程序可能会读取数据并将其插入另一个字符串——“因为它来自数据库,所以它是可信的”。喷溅。在这种情况下,排除没有真正理由存在的明显可疑字符串是非常有价值的额外保护,IMO,尽管不能代替不首先编码安全漏洞。它有助于阻止XSS SQL注入。@Kami虽然我同意正则表达式检查实际上是个好主意,但我也认为Frank是对的-它应该作为
检查
约束来完成,而不是在应用程序中。更重要的是,我强烈反对
pg_escape_literal
是处理不可信参数的推荐方法。使用参数化查询(“准备好的语句”)。因此,剔除明显的SQL注入尝试也是一个好主意。查找字符串
”)在用户名中?这可能值得拒绝。请参阅其他帖子上的评论。是的,但由于
准备好的语句
不会受到任何类似尝试的影响,因此这是最安全的方法。另外,它会更快,因为您不需要通过任何regexp或其他方式检查任何尝试。我同意准备好的语句(或参数化语句,真的)是至关重要的。我只是说,另外,一些数据清理并不一定是个坏主意,因为它有助于阻止攻击者使用应用程序的一个部分插入数据,然后由另一个安全性较弱的部分(可能只是内部的)使用,利用较弱的应用程序。感谢您展示代码、版本,并提供了一个明确的问题。非常感谢