我希望允许用户在不限制任何字符的情况下执行搜索。
为了保护数据库免受攻击,"添加斜杠"和/
或mysql_escape_chars
是否足够?
你还有什么建议?
非常感谢。
p.s.URI路由->www.example.com/search/category/query
,其中query
是要搜索的术语。
如果直接传递查询,建议的解决方案是在参数上使用mysql_real_escape_string
——尽管这确实需要首先打开数据库连接。通过在转义时考虑数据库的字符编码,避免使用某些编码在字符中间进行转义,这一点非常重要。此外,mysql_escape_string
已被弃用。
但是,如果可能的话,建议您使用mysqli库的prepared statements特性;这使您能够将查询参数作为参数传递给PHP方法,因此几乎可以保证不会出错,同时无需执行转义。
假设您使用的是Kohana的内置数据库工具,您也可以使用它的prepared语句支持或查询生成器,它也支持prepared查询,并且不需要转义。
使用Kohana ORM
/Query Builder
-它们将保护您免受SQL注入的影响。当您需要注意的唯一情况是使用DB::expr
时,它不会逃离您的变量。阅读更多官方文档。
是的,这样的保护已经足够好了(如果你从文本区域插入数据,也差不多),但我会使用mysql_real_sescape_string。不要忘记在mysql查询中的搜索字符串周围添加s(... WHERE somecolumn LIKE 'query'
而不是... WHERE somecolumn LIKE query
,FULLTEXT
搜索也是如此)
请确保在url查询参数
这个问题对我来说没有多大意义。
为什么搜索只是你关心的问题?动态SQL查询获取参数是我们每个应用程序的基石。应该有一个通用规则(或一组规则)来覆盖动态SQL的每一种情况,而不仅仅是一种。
Kohana当然有自己的操作SQL的工具。为什么要使用原始的"添加斜杠"/mysql_escape_chars?
www.example.com/search/category/query将需要不必要的重定向。为什么不使用常规
/search?cat=category&q=query
?谷歌似乎并不认为使用这样的网址进行搜索是一种耻辱——你为什么要这样做?