Php 无需用户操作的人工验证

Php 无需用户操作的人工验证,php,user-interface,yii,Php,User Interface,Yii,对于我正在开发的系统,我遇到了一个小问题:我弄乱了HTTP的一个基本规则,我允许用户通过GET请求发布数据 还不要生我的气:我有一个原因:用户从外部环境进入我的应用程序,我不能提示他们进行任何额外的输入(所以所有必要的数据都在get查询中)。他们应该能够在浏览器窗口打开后立即关闭,并保存输入。不,我不能通过AJAX、API或其他隐藏方法来实现这一点 这些要求有点排除了验证码、计算、表单等。所以我的问题是,我真的需要某种类型的验证,以防止机器人/爬虫“意外”提交某些内容 我正在研究的解决方案之一是

对于我正在开发的系统,我遇到了一个小问题:我弄乱了HTTP的一个基本规则,我允许用户通过GET请求发布数据

还不要生我的气:我有一个原因:用户从外部环境进入我的应用程序,我不能提示他们进行任何额外的输入(所以所有必要的数据都在get查询中)。他们应该能够在浏览器窗口打开后立即关闭,并保存输入。不,我不能通过AJAX、API或其他隐藏方法来实现这一点

这些要求有点排除了验证码、计算、表单等。所以我的问题是,我真的需要某种类型的验证,以防止机器人/爬虫“意外”提交某些内容

我正在研究的解决方案之一是制作一个非常轻量级的登录页,通过javascript onload提交自己,但这在我的应用程序中是最难看的事情,所以我试图阻止它。另一种方法是让landingpage不做任何处理,而是使用AJAX调用来完成。然而,这意味着较旧的浏览器(和许多手机)将不得不使用另一种解决方案

背景:应用程序是用PHP5.3编写的,基于Yii框架,100%跨浏览器兼容(这包括了几乎所有的手机)

更多背景信息:我所说的“外部环境”从电子邮件客户端到网站各不相同。在运行时操纵我们的内容是不可能的

更新:以下是我将要做的:我可能会将此处发布的解决方案合并到一个回退机制中,以便尝试一系列验证: 1.Ajax验证 2.非Ajax javascript验证(自动表单提交) 3.提示用户输入(用户必须单击确认按钮)

除此之外,我还将实现一个机器人陷阱,如


在我完成构建后,如果我做了任何不同的事情,我将更新帖子。

如果您能够修改用户的位置,您可以尝试包含校验和。计算GET请求中所有字段的某种校验和或散列,并将其添加到GET请求本身(即通过javascript,但在用户来自的地方执行,而不是在用户登陆的地方)。然后,在应用程序中,用不正确的校验和拒绝所有点击。

很难理解应用程序的位置和外部环境的真实位置。但我使用的一种简单的bot删除技术是放置一个名为“login”或“name”的隐藏字段,并给它一个空值

人类永远不会填满这个隐藏的领域,但垃圾机器人总是填满它。因此,您可以放弃该字段不为空的任何请求

现在你必须阻止爬虫,而不仅仅是垃圾邮件机器人。从来没有这样做过,但这里有一些想法。在第一次mouseMove事件中,您可以在表单中添加隐藏的“人类”隐藏输入(但仅限于键盘——想想盲人——用户将被视为机器人)。因此,如果该字段不存在,您可以启动javascript“确认”,询问“确认您是机器人,或者如果您是人类,请单击“取消”。
您可以使锚点链接包含默认值,该隐藏字段值将在js中覆盖该值。大多数爬虫程序不会覆盖这些值,特别是如果您必须取消确认才能获得正确的行为(并且避免大多数用户使用mouseMove事件进行确认).

因此,从本质上讲,你要问的是如何确定一组特定的数据是来自人类还是计算机?你第2段的最后一个要求排除了你在第4段中提出的解决方案。头脑风暴,我要说的是,只有来自“外部环境”的纯GET请求,你无法实现你想要的,除非你至少有一些javascript在那里运行。如果你能考虑到cookie,你可能已经走得更远了,比如CSRF和/或会话cookie——我想你的用户必须通过某种方式的身份验证。@Alex:是的,差不多就是这样@Stefano我说的是验证,不是身份验证。你有单一的外部环境吗?如果是这样,您可以分析环境发送(或不发送)的其他数据类型(http头),并使用这些数据来确定数据的有效性。这方面的一个简单示例是测试useragent字符串以阻止googlebot。是否有关于所需数据类型及其格式的规范?e、 g.人的姓名、评论、电话号码、地址当然,如果他/她可以修改用户来自的地方,他/她可能会将其更改为使用POST而不是GET…此外,我不认为这会解决问题。这个想法是为了防止爬虫弄乱页面。如果爬虫访问页面,它必须在某个地方获得链接,可能来自使用相关系统的有效页面,因此爬虫可能具有有效链接,包括任何校验和。这个技巧可能对那些猜测链接的爬虫有所帮助(如果可能的话)…@sleske:GET可以被使用还有其他原因。例如,你不能重定向帖子。至于寻找链接的爬虫程序,这就是为什么我建议通过javascript向链接添加校验和。