【问题标题】:How to block non-browser clients from submitting a request?如何阻止非浏览器客户端提交请求?
【发布时间】:2010-03-19 10:23:13
【问题描述】:

我想阻止非浏览器客户端访问某些页面/成功发出请求。

网站内容提供给经过身份验证的用户。发生的情况是,我们的用户将他对我们网站的凭据提供给代表他执行请求的第 3 方 - 它可以是另一个网站或移动应用程序。

假设有一个用户填写并发送消息的表单。我可以保护这个表单,以便处理提交的服务器可以判断用户是否直接从浏览器提交?

出于可用性原因,我不想使用 CAPTCHA。我可以用一些 javascript 来做吗?

【问题讨论】:

  • 为什么要阻止这种情况?
  • 也许这是一个基于浏览器的游戏,他想阻止机器人?
  • 或收到垃圾邮件的“发送反馈”表单...在这两种情况下,最好有一些举报人应用程序来强制更改密码。
  • 这是一个商业财产 - 用户可以从网络向手机发送文本;我们宁愿让他们直接访问我们的网站

标签: javascript security forms


【解决方案1】:

您可以使用 javascript 提高标准,但浏览器所做的任何事情,自动化系统都可以做到。在最坏的情况下,他们可以自动化浏览器,但几乎肯定会有一些更简单的方法来模拟操作。

在任何情况下,他们都可以记录浏览器使用代理发送的请求,并计算出您使用 javascript 执行的任何技巧。

想到什么(提高标准)(使用 javascript):

  1. 更改提交的位置。
  2. 在提交时更改字段名称。
  3. 隐藏看起来应该填写的字段。
  4. 在提交时加密/混淆表单内容。
  5. 将 GET 更改为 POST。

另一个可用性问题是任何禁用 javascript 的人都将无法使用该服务。这可能比验证码更能影响可用性。

【讨论】:

    【解决方案2】:

    没有可靠的方法来检测 HTTP 代理 - 在 任何 情况下,您将破坏某些浏览器的表单 - 除非您可以强制用户使用非常有限的浏览器集(但这可以再次被欺骗)。

    IMO,试图限制可用于访问表单的软件,您应该确保有真人控制该软件。不幸的是,没有比验证码更好的方法了,除非所有客户都可以使用生物识别扫描仪。

    【讨论】:

      【解决方案3】:

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

      要知道导航器是否基于 javascript 的 mozilla:

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

      用php你可以试试原生函数get_browser

      【讨论】:

      • 不,不,不。您很可能会破坏与您未在此处明确 列出的所有 浏览器的兼容性,并且规避这一点非常简单(比如wget -U "Mozilla")。总之; 这弊大于利
      • 我已经说过它可以被欺骗,我想最佳解决方案应该是使用适当的 htaccess 配置文件来禁止似乎不合法的 IMO 所需的 ip。
      猜你喜欢
      • 2019-05-16
      • 2015-03-09
      • 2012-04-30
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      相关资源
      最近更新 更多