猿问

API 请求:如何确保只有“允许”的网络表单会收到答复?

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


                 ?                  

+---------+              +---------+

|         | -----------> |         |

|FORM.html|              | API.php |

|         |<-------------|         |

+---------+              +---------+

               digital              

               content              

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


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


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


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


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


编辑:


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


繁花如伊
浏览 228回答 2
2回答

牛魔王的故事

我也考虑过在表单中添加额外的变量,但这也无济于事。黑客只需要识别和复制这些变量。您可以通过不每次都使用(并检查)相同的值,而是使用只能在有限时间内使用一次的令牌来使这更难。这基本上就是所谓的 CRSF 令牌。一些有关该主题的更多信息的链接:什么是 CSRF 代币?它的重要性是什么?它是如何工作的?https://en.wikipedia.org/wiki/Cross-site_request_forgeryhttps://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)您尝试使用 CSRF 令牌应对的典型攻击/问题是有人触发了允许登录用户以其名义执行的操作;但是在您这里的情况下,您可以以非常相似的方式实现它,以尝试防止人们或机器人在不使用您的表单的情况下将数据发送到您的端点。

Smart猫小萌

&nbsp;Use google Captcha in your form&nbsp; &nbsp;https://www.google.com/recaptcha&nbsp; &nbsp;//take a leaf out of payment gateway validation&nbsp; &nbsp; $acceptfrom = array(&nbsp; &nbsp; &nbsp; &nbsp; 'www.yourserver.com',&nbsp; &nbsp; &nbsp; &nbsp; 'yourserver.com'&nbsp; &nbsp; );&nbsp; &nbsp; if( !in_array( $_SERVER['REMOTE_ADDR'], $acceptfrom ) )&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //break and redirect to another page here&nbsp; &nbsp; } else {&nbsp; &nbsp; //include Captcha validation here&nbsp; &nbsp; //validate form variables and send to API&nbsp; &nbsp; }&nbsp;
随时随地看视频慕课网APP
我要回答