SQL注入风险 - 允许REGEXP输入

时间:2013-08-06 22:32:12

标签: php mysql regex sql-injection

我正在考虑允许用户插入自己的REGEXP模式,这将在Mysql查询中使用。我很清楚sql注入风险,我知道没有办法将regexp模式值作为参数传递给预准备语句。

是否有一种防水方式可以安全地允许用户在sql查询中提供自己的正则表达式模式,还是应该放弃这个想法?

顺便说一下,我正在使用PHP,所以我基本上都在问PHP中是否可以确保模式有效,真实且无害。

2 个答案:

答案 0 :(得分:1)

好问题!我经历过,一般来说用户并没有真正“受过教育”,足以进入“真正的”正则表达式。 “标准”用户认为星号已经非常复杂。像/^([^[0-9]+\s[a-z]*)/i这样的模式很少被“普通”用户使用。您可能最好建议为用户提供更简单的元字符作为通配符。 除非您希望将该工具用作管理员工具...以便了解他们正在做什么的人。

答案 1 :(得分:0)

我还没有为mysql做过这个,但我已经为另一个dbms完成了类似的事情

我做的是:

  1. 确定db实际使用的正则表达式的版本/方言(有几种口味。你可以选择像POSIX basic这样的限制版)
  2. 首先尝试在应用程序中编译正则表达式(在我的例子中是java)。如果它在此时抛出异常,你就知道它很糟糕。
  3. 在db
  4. 上执行它

    另外,你可以:

    • 首先使用" sandbox"执行它。用户(一个使用虚拟架构,没有权利做任何危险的事情),看看会发生什么。
    • 限制它(根据允许的字符的白名单验证)例如,不允许使用单引号,分号等危险的东西。我想php / mysql允许各种编码,所以你会有处理这个问题。

    话虽如此,我认为你不能完全消除风险。编辑:特别是如果你想避免拒绝服务攻击。