2011-06-03 64 views
1

转义传递给LIKE模式匹配查询的文本的正确方法是什么? 问题是Zend_Db中LIKE的转义输入

select()->where('field LIKE ?', $input . '%'); 

将是不正确与

$input = '%sometext'; 

更新: '容易' - > '不正确使用'

回答

0

这不是漏洞,是吗?这是有效的内容。如果它对你的应用程序的漏洞(如WHERE user LIKE '%admin%'),你应该考虑验证/使用某物像过滤输入自己:

if (strpos('%', $input)){ 
    $input = strtr($input, '%', ''); 
} 
+0

好吧,也许“脆弱”是不正确的话,我认为更好的方式是“不正确” (有问题更新)。 问题是,如果用户想要查找文本“100%确定”,他会收到'100英里以外肯定'的结果(只是一个例子)。这不是用户期望看到的。 甚至更​​多,在SQL的不同方言中有更多的字符是特殊的。所以我认为很明显,替换特殊符号并不是很好,如果我将这些代码硬编码为MySQL,ORM的全部内容将会丢失。 – eater 2011-06-04 21:37:29

+0

好的。那么DBLayer应该如何决定是否要搜索'100%'以及'100(。*)'的位置? – 2011-06-05 21:22:44

+0

我认为数据库层必须有方法来转义传递给LIKE查询的输入。在MySQL中它可以是简单的 \t addcslashes($ str,'_%'); 但是在不同的数据库中的特殊字符集可以是不同的,并且对于每个数据库都有这种类型的函数(我认为在适配器中)会很好。 F.e.在MSSQL中LIKE查询可以包含[a = z]以匹配字符列表,如果没有正确的转义,就不可能在其中搜索带有'[10]'的字符串。 – eater 2011-06-05 22:22:39