[英]API requests: how to be sure only 'allowed' webforms will receive an answer?
我经营一个免费创建数字内容的网站。 我的访客也不需要帐户即可开始下载。 它的工作原理非常简单:最终用户填写表格,表格将请求发送到PHP脚本(“ API”),然后PHP脚本返回结果。
?
+---------+ +---------+
| | -----------> | |
|FORM.html| | API.php |
| |<-------------| |
+---------+ +---------+
digital
content
此刻,PHP脚本将发送对任何使用正确参数调用它的答案。 这使其他网站可以轻松窃取我的表单并劫持我的服务。 另外,足够熟练的人可以通过CURL,WGET或任何自动化脚本来请求此“数字内容”。 所以,我的问题是:
问: 我怎样才能确保请求已经从一种形式发送给我的网站上回答过吗?
到目前为止,我尝试在服务器上添加一个额外的PHP文件,该文件将“签名”请求(authenticate.php),然后再将其发送到API。 那行得通,但是当然,它只是将问题移到了这个新文件中。 这个脚本会很愚蠢地对抛出的所有内容进行签名,并将其传递给API.php。
我还考虑过向表单添加额外的变量,但这也无济于事。 黑客只需要识别并复制这些变量。
我不需要最终的安全性,因为它“只是”一张图纸。 但是任何检查总比没有好。 什么是明智的?
编辑:
我最关心使用API的其他网站 。 由于内容仍然是免费的,因此我不再关注访问API的机器人或脚本。 尽管也可以防止这种情况。
我还考虑过向表单添加额外的变量,但这也无济于事。 黑客只需要识别并复制这些变量。
通过每次都不使用(并检查)相同的值,而是使用只能在有限的时间内使用一次的令牌,可以使此操作变得更加困难。 这基本上就是所谓的CRSF令牌。
一些链接包含有关该主题的更多信息:
什么是CSRF令牌? 它的重要性是什么?它如何工作?
https://zh.wikipedia.org/wiki/跨站点_请求_伪造
https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)
您尝试使用CSRF令牌应对的典型攻击/问题是有人触发了允许登录用户以其名义执行的操作; 但是在这种情况下,您可以采用非常类似的方式来实现它,以尝试防止人们或机器人在不使用表单的情况下将数据发送到您的端点。
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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.