对于我正在研究的系统,我遇到了一些问题:我正在搞乱HTTP的一个基本规则,我允许用户通过GET请求发布数据。
不要生我的气:我有一个理由:用户从外部环境到我的应用程序,我无法提示他们任何额外的输入(因此所有必要的数据都在GET中查询)。他们应该能够在打开后立即关闭浏览器窗口,并保存输入。不,我不能通过AJAX,API或其他底层方法来做到这一点。
这些要求排除了验证码,计算,表格等。所以我留下了一个问题,我确实需要某种类型的验证来防止机器人/爬虫“意外”提交某些内容。
我正在研究的一个解决方案是制作一个非常轻量级的登陆页面,通过javascript onload提交自己,但它将是我应用程序中最丑陋的东西,所以我试图阻止它。另一个是让登陆页面不进行任何处理,而是使用AJAX调用来执行此操作。然而,这意味着旧浏览器(以及许多移动电话)将不得不使用另一种解决方案。
背景:用PHP5.3编写的应用程序,基于Yii Framework构建,100%跨浏览器兼容(这几乎包括每个移动电话)。
更多背景知识:我所谈论的“外部环境”因电子邮件客户端和网站而异。无法在运行时操作我们的内容。
更新:以下是我要做的事情:我可能会将这里发布的解决方案合并到一个备用机制中,以便尝试进行一系列验证: 1. Ajax验证 2.非Ajax javascript验证(自动表单提交) 3.提示用户输入(用户必须单击确认按钮)
除此之外,我将实现一个由http://www.kloth.net/internet/bottrap.php
描述的僵尸陷阱在我完成构建之后,如果我做了不同的事情,我会更新帖子。
答案 0 :(得分:1)
如果您能够修改用户来的地方,可以尝试包含校验和。计算GET请求中所有字段的某种校验和或散列,并将其添加到GET请求本身(即通过javascript,但是在用户来自的地方,而不是他们登陆的位置)。然后,在您的应用程序中,拒绝所有具有错误校验和的命中。
答案 1 :(得分:1)
很难理解应用的位置以及外部环境的确切位置。但我使用的一种简单的机器人删除技术是将一个名为“登录”或“名称”的隐藏字段设置为空值。
人类永远不会填补这个隐藏的领域,但垃圾邮件机器人总是填补它。因此,您可以丢弃该字段不为空的任何请求。
现在您必须阻止抓取工具,而不仅仅是垃圾邮件机器人。从未做过,但这里有一些想法。您可以在第一个mouseMove事件中添加隐藏的“人类”隐藏输入(但仅限键盘 - 并考虑盲人 - 用户将被视为机器人)。因此,如果此字段不存在,您可以启动javascript'确认',询问“确认您是机器人,或者如果您是人类则单击取消”。 您可以使锚点链接包含此隐藏字段值将在js中覆盖的默认值。大多数抓取工具都不会覆盖这些值,尤其是如果您必须取消确认才能获得正确的行为(并避免大多数用户使用mouseMove事件进行确认)。