【发布时间】:2009-02-25 19:20:54
【问题描述】:
我在具有完全根访问权限的专用服务器(Ubuntu Server 8.10)上运行 PHP 5 和 MySQL 5。我正在清理一些我继承的 LAMP 代码,并且我有大量使用这种构造的 SQL 选择:
SELECT ... FROM table WHERE
LCASE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
strSomeField, ' ', '-'), ',', ''), '/', '-'), '&', ''), '+', '')
) = $somevalue
忽略这样一个事实,即从一开始就不应该构建数据库来要求这样的选择,并且需要对 $somevalue 字段进行参数化以堵塞巨大的安全漏洞,我修复 WHERE 的最佳选择是什么条件变成不那么令人反感的东西?如果我使用的是 MSSQL 或 Oracle,我会简单地组合一个用户定义的函数,但是我对 MySQL 的经验比较有限,而且我以前没有用它构建过 UDF,尽管我很高兴编写 C 代码。
更新:对于所有已经在原始代码中对此感到惊讶的人来说,$somevalue 实际上类似于 $GET['product']——在主题。在这种情况下,选择是通过产品名称从数据库中拉回产品——在删除字符之后,它与之前可以作为 URI 参数传递的内容相匹配。
【问题讨论】:
-
这个已经提交给thedailywtf.com了吗?
-
那个代码很可爱!我 5 岁的儿子知道更好的预防 SQL 注入的方法。
-
你能对搜索值做反向转换吗?也许这可以成为使所有条目一致的过程的一部分?
标签: php sql mysql user-defined-functions