2

如果你去这里,你会在我的 Magento 商店遇到一整页的恶意搜索尝试:http: //www.princessly.com/catalogsearch/term/popular/

我的问题是,如何防止恶意搜索短语出现在热门搜索词页面上,但仍然显示来自善意用户的合法搜索词?

谢谢!

4

3 回答 3

1

首先检查注入搜索词是否被评估,或者换句话说,seach 词是否被正确转义和过滤以防止 sql 注入。然后继续清理索引搜索词的数据库。接下来我会看看索引功能,如果你在搜索功能中有足够的 sql 注入和 xss 保护,你真的不需要担心这个(除非它占用了你的带宽,那么你可能想要调查将 IP 列入黑名单或主动搜索过滤,但会稍微复杂一些)。本质上您只想存储正确的查询,最简单的方法是只存储按字母顺序排列的查询,但这可能非常严格并且排除其他有效查询。相反,您可以使用黑名单和正则表达式检查,但这将更难实施和及时。最后,您可能希望在每个时间段内施加搜索限制,以及诸如用户代理检查之类的东西,以确保一个人实际上正在搜索。您也可以使用某种形式的验证码,但这可能会严重阻止用户广泛使用搜索功能,所以我不鼓励这样做。

于 2012-04-29T16:33:17.510 回答
1

不要列出不返回结果或仅返回“草率”匹配项的搜索。“恶意搜索”可能与您网站上的任何产品都不匹配,因此它们将被此规则排除在外。

此规则不要求您以任何方式识别搜索的特定形式(它不是黑名单),因此它是稳健的。此外,列出没有结果的普通搜索可能不会使您或您的客户受益,因此将它们排除在解决垃圾邮件问题之外将是一种改进。

于 2012-04-29T17:11:23.623 回答
0

可以以某种方式枚举恶意搜索词,因此当这种情况发生时,开发人员会构建一组正则表达式来检查输入的搜索词/查询是否干净,例如让我们将' OR '1'='1SQL 注入作为搜索输入:

目标:防止' OR '1'='1在数据库中被捕获。HOWTO:应用一个正则表达式,例如,^'?1 (')? [Oo][Rr] (')?1(')?=1(')?$如果该正则表达式返回 true,则阻止该术语被捕获,如果我们想添加更多被阻止的术语,我们可以做类似的事情^('?1 (')? [Oo][Rr] (')?1(')?=1(')?)|(Other Regex)^。但是,如果这些术语已经被捕获,那么清理数据库将是最好的解决方案,因为如果我们尝试在每次将要显示热门搜索词时进行正则表达式检查,网站性能会下降,所以我的建议是通过在流行术语表上运行正则表达式来清理数据库并删除具有恶意意图的行。

于 2012-04-29T14:03:01.087 回答