【问题标题】:API requests: how to be sure only 'allowed' webforms will receive an answer?API 请求:如何确保只有“允许”的网络表单会收到答复?
【发布时间】:2023-03-04 21:10:02
【问题描述】:

我经营一个免费创建数字生成内容的网站。我的访问者也不需要帐户即可开始下载。它的工作原理很简单:最终用户填写表单,表单向 PHP 脚本(“API”)发送请求,然后 PHP 脚本返回结果。

                 ?                  
+---------+              +---------+
|         | -----------> |         |
|FORM.html|              | API.php |
|         |<-------------|         |
+---------+              +---------+
               digital              
               content              

目前,PHP 脚本将向任何使用正确参数调用它的对象发送答案。这使得其他网站很容易窃取我的表单并劫持我的服务。此外,足够熟练的人可以通过 CURL、WGET 或任何自动脚本请求此“数字内容”。所以,我的问题是:

问:在回答之前,我如何确保从我的网站上的表单发送请求?

到目前为止,我尝试的是在我的服务器上添加一个额外的 PHP 文件,该文件将“签署”请求 (authenticate.php),然后将其发送到 API。那行得通,但是当然,它只是将问题转移到了这个新文件。这个脚本会愚蠢而愚蠢地签署所有扔给它的东西并将其传递给 API.php

我也考虑过在表单中​​添加额外的变量,但这也无济于事。黑客只需要识别和复制这些变量。

我不需要终极安全,因为它“只是”一幅画。但是 any 检查总比没有检查好。什么是明智的?

编辑:

我最关心的是使用我的 API 的其他网站。由于内容是免费的,我不太关心访问 API 的机器人或脚本。虽然防止这种情况也很好。

【问题讨论】:

  • 你不能。这基本上相当于DRM,它从来没有工作过。无论您要求客户端尝试检查什么,它都可能欺骗您的服务器。
  • @JosephSible 感谢您的回答/评论! @“所有其他人”,为什么投反对票?不是每个人都是专家......我觉得我的问题很具体,我表明我已经完成了我的研究并试图解决它。这真的是一个低质量的问题吗?如果是这样:为什么?
  • “我也考虑过在表单中​​添加额外的变量,但这也无济于事。黑客只需要识别和复制这些变量。” - 你可以让这更难,不是每次都使用(并检查)same 值,而是使用只能在有限的时间内使用一次。这基本上就是所谓的 CRSF 令牌……stackoverflow.com/questions/5207160/…
  • 另一种方法当然是使用验证码。这些不是很用户友好,但“机器人”在大多数情况下仍然很难绕过它们。
  • @misorude CRSF 听起来确实是迄今为止最好的解决方案。谢谢,我不知道这种技术的名称,现在我可以进一步研究它。事实上,验证码也是一个非常明显的开始。

标签: javascript php authentication


【解决方案1】:

我也考虑过在表单中​​添加额外的变量,但这也无济于事。黑客只需要识别和复制这些变量。

您可以通过不每次都使用(并检查)相同的值,而是使用只能在有限时间内使用一次的令牌来增加难度。这基本上就是所谓的 CRSF 令牌。

一些关于该主题的更多信息的链接:

What is a CSRF token ? What is its importance and how does it work?
https://en.wikipedia.org/wiki/Cross-site_request_forgery
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)

您尝试使用 CSRF 令牌应对的典型攻击/问题是某人触发了允许登录用户以他们的名义执行的操作;但是在像您在这里遇到的情况下,您可以以非常相似的方式实现它,以尝试阻止人们或机器人在不使用您的表单的情况下将数据发送到您的端点。

【讨论】:

  • CSRF 令牌在这里没有帮助。提问者想要防御不是网站的东西(例如客户端本地机器上调用 wget/curl 的脚本),因此不受同源策略的约束。这样的脚本可以只获取表单,抓取值,然后在提交时使用它。
  • @JosephSible 正如所说,这使得它更难,机器人将无法只分析一次表单结构,他们必须每次都请求一个新的表单获得一个有效的令牌。如果有人真的付出努力,这不能阻止事情,这是显而易见的。有人建议将 CAPTCHA 用作将其限制为人类的替代方法,但被认为具有侵入性。
【解决方案2】:
   Use google Captcha in your form
   https://www.google.com/recaptcha
   //take a leaf out of payment gateway validation
    $acceptfrom = array(
        'www.yourserver.com',
        'yourserver.com'
    );



    if( !in_array( $_SERVER['REMOTE_ADDR'], $acceptfrom ) )
    {
        //break and redirect to another page here
    } else {
    //include Captcha validation here
    //validate form variables and send to API

    } 

【讨论】:

  • 这(严重)试图确保有人在循环中,但根本没有尝试验证请求来自网站自己的表单。
  • @Suzie 如果您能解释一下您的脚本是 API 的示例实现,那就太好了。
  • @Suzie 不,你的答案现在仍然和编辑前一样糟糕。您的代码的任何读者都应该清楚他们如何完全绕过它提供的所有“安全性”。
  • 请帮助我们。我实际上在我自己的网站上使用了 SERVER_NAME 示例,我使用它来包装我的所有页面内容。我一直想改进,给我们举个例子,我看你自己就是个优秀的程序员。
猜你喜欢
  • 2017-01-04
  • 2016-04-06
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多