【问题标题】:SQL Injection Prevention - Single Line Methods?SQL 注入预防 - 单行方法?
【发布时间】:2014-02-25 03:45:12
【问题描述】:

我将尝试使用下面的示例代码使这一内容简短明了。您是否认为这对于任何形式的 SQL 注入都是一个问题......?

$tmpVar = isset($_POST['somePostVar']) ? pg_escape_string(utf8_encode(preg_replace('/[^a-z0-9_]+/i', '', filter_var($_POST['somePostVar'], FILTER_SANITIZE_STRING)))) : 'error';

虽然我知道使用所有四种方法可能会出现一些过度杀戮/冗余..我仍然宁愿安全而不是抱歉,因此在这里询问。

这个结果变量将用作

SELECT * FROM table_name WHERE someCol='$tmpVar'

现在我知道周围有类似这样的重复问题,我明白这一点,虽然不是 StackOverFlow 上的主要海报...每日浏览器并使用我...

所以使用 pg_escape_string、utf8_encode、preg_replace 和 filter_var...这个字符串仅限于带有下划线的字母数字。它可以通过 SQL 注入的形式轻松破解

utf8_encode 也在这里,因为 postgresql 在使用 pg_escape_string 时可能会出现问题。所以在这种情况下它们是齐头并进的。

【问题讨论】:

  • 请理解我确实知道每个函数的作用,而且有些函数可能会过度杀伤字符串。但有些情况需要考虑,其中一个简单的修复并不总是像看起来那么容易。 . 问题是这个特定的字符串仍然可以通过注射破坏......

标签: sql postgresql escaping preg-replace filter-var


【解决方案1】:

你为什么要把这一切搞得一团糟?

只需像其他人一样使用参数化查询。请参阅PHP's manual on SQL injectionbobby-tables.com

你需要理解这个问题,而不是随便扔更多层随机的半理解的东西。例如filter_var(..., FILTER_SANITIZE_STRING) 与 SQL 一起使用是完全错误的,为什么您在查看the documentation for it 之后可能会这样做?

你为什么要搞乱文本编码?如果client_encoding 正确,则不需要。


如果您正在做诸如替换标识符之类的事情,或者您无法使用服务器端查询参数的其他事情,您所要做的就是双引号,所以:

this "identifier" name

变成:

"this ""identifier"" name"

根据 SQL 标准。 PHP 似乎为此提供了方便的函数pg_escape_identifier

同样,启用standard_conforming_strings(默认)后,如果您必须在不使用参数的情况下提供引号(例如在ALTER USER ... PASSWORD ... 和其他地方Pg 不支持服务器端参数。但是,PHP 驱动程序可能仍然支持这些客户端参数,因此您可能可以像平常一样使用参数化查询,如果没有,最好使用 PHP 的pg_escape_literal

【讨论】:

  • 您应该阅读有关使用 pg_escape_string 以及它可能导致具有 utf8 编码的 postgres db 的问题。
  • 至于简单地添加双引号并期望这可以使用户可调整的查询安全......这不安全......
  • @Mayhem 如果 PHP 要求您在使用这些函数时更改文本编码,这会比平时更糟糕,或者您的 client_encoding 配置错误。我希望看到一份适当的报告,以合理的详细程度记录此问题。如果您只是在没有解释其推理的文档上引用 6 年的评论,那并没有太多的意义,并且主要表明 client_encoding 与默认的 PHP 编码不匹配。跨度>
  • 在某些环境下我将无法控制客户端,并且该项目的服务器仍有待探索。上面的代码/伪代码是测试和探索选项的组合,具体取决于它接收到的输入/发布数据。虽然标题不是最好的问题。关于以两端未知设置的方式覆盖所有极端情况的问题仍然存在。这可能是 php、sql 版本/有限扩展等,也不是指 php.net 上的“pg_escape_string”。当我遇到问题时,我会四处寻找
  • @Mayhem 答案很简单。使用参数化查询。你完成了。
猜你喜欢
  • 2017-12-17
  • 1970-01-01
  • 2014-12-13
  • 2012-05-22
  • 2012-12-21
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多