如何阻止非浏览器客户端提交请求?

3
我希望阻止非浏览器客户端访问某些页面/成功发出请求。
网站内容仅向经过身份验证的用户提供。情况是我们的用户将他的凭据提供给第三方 - 可能是另一个网站或移动应用程序 - 代表他执行请求。
假设有一个表单,用户填写并发送消息。我可以保护这个表单,以便处理提交的服务器可以告诉用户是否直接从浏览器提交它吗?
出于可用性原因,我不想使用CAPTCHA。我能用一些JavaScript来做到这一点吗?

你为什么想要防止这个? - Kimvais
也许这是一个基于浏览器的游戏,他想要防止机器人? - Douglas Leeder
1
或者一个会收到垃圾邮件的“发送反馈”表单... 在这两种情况下,最好有一些举报应用程序来强制更改密码。 - Kimvais
这是一个商业属性 - 用户可以从网页向手机发送短信;我们更希望他们直接访问我们的网站。 - Tomas Kohl
3个回答

8
您可以使用JavaScript来提高安全性,但自动化系统也可以完成浏览器所做的任何事情。在最坏的情况下,他们可以自动化浏览器,但几乎肯定会有一些更容易模拟操作的方法。
无论如何,他们都可以使用代理记录浏览器发送的请求,并解决您希望JavaScript执行的任何技巧。
就提高安全性而言(使用JavaScript),以下是一些想法:
1. 更改提交的位置。 2. 在提交时更改字段名称。 3. 隐藏看起来应该填写的字段。 4. 在提交时加密/混淆表单内容。 5. 将GET更改为POST。
另一个可用性问题是禁用JavaScript的用户将无法使用服务。这可能比使用验证码对可用性产生更大的影响。

1

没有可靠的方法来检测HTTP代理 - 无论如何,您都会破坏某些浏览器的表单 - 除非您可以强制用户使用非常有限的浏览器集(但这也可以再次欺骗)。

在我看来,如果尝试限制可以用于访问表单的软件,您应该确保有真正的人类控制该软件。不幸的是,除非所有客户都可以访问生物识别扫描仪,否则没有比验证码更好的方法来实现这一点。


-1

只有一种方法可以做到这一点,分析供应商字符串以查找已承认的浏览器,但如果有人伪造供应商字符串,则无法避免提交。

要了解使用JavaScript的导航器是否基于Mozilla:

var isMoz = window.navigator.userAgent.match(/^Mozilla/)?true:false;

使用PHP,您可以尝试本机函数get_browser


3
不,不,不。您很可能会与您未在此明确列出的__所有__浏览器兼容性受到破坏,而且很容易规避这种情况(比如使用 wget -U“ Mozilla”)。总之;__这样做会弊大于利__。 - Kimvais
我已经说过它可以被欺骗,我认为最佳解决方案应该是使用适当的htaccess配置文件,禁止那些看起来不合法的IP。 - markcial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接