1

我正在考虑允许用户插入他们自己的 REGEXP 模式,该模式将在 Mysql 查询中使用。我很清楚 sql 注入风险,并且我知道无法将正则表达式模式值作为参数传递给准备好的语句。

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

顺便说一句,我正在使用 PHP,所以我基本上是在询问 PHP 中是否有可能确保模式是有效的、真实的和无害的。

4

2 回答 2

1

好问题!我的经验是,一般用户没有受到足够的“教育”来输入“真正的”正则表达式。“标准”用户认为星号已经非常复杂。/^([^[0-9]+\s[a-z]*)/i“普通”用户很少使用类似的模式。可能会更好地建议您为用户提供更简单的元字符作为通配符。除非您想将该工具用作管理员工具……对于知道自己在做什么的人。

于 2013-08-06T22:40:19.303 回答
0

我没有为 mysql 做过这个,但我为另一个 dbms 做过一次类似的事情

我所做的是:

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

此外,您可以:

  • 首先使用“沙盒”用户(使用虚拟模式的用户,无权做任何危险的事情)执行它,然后看看会发生什么。
  • 对其进行更多限制(根据允许的字符的白名单对其进行验证)例如,不允许使用单引号、分号等危险的东西。我想 php/mysql 允许各种编码,所以你也必须处理这个问题。

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

于 2013-08-06T22:56:39.013 回答