如何检查收到的请求是否从同一个服务器发送?如何检查来自同一服务器或不同服务器的请求?
说,我在www.domain.com上有我的域名。现在我已经php处理文件,它将处理通过此域托管的表单。只有当请求从域内发送时,这个过程才会被执行。 www.domain.com和从其他域发送的任何其他请求都将被丢弃。
如何检查收到的请求是否从同一个服务器发送?如何检查来自同一服务器或不同服务器的请求?
说,我在www.domain.com上有我的域名。现在我已经php处理文件,它将处理通过此域托管的表单。只有当请求从域内发送时,这个过程才会被执行。 www.domain.com和从其他域发送的任何其他请求都将被丢弃。
基本上:你不行。
使用HTTP协议,每个请求都是独立于其他请求的。
第一个想法是将检查的Referer HTTP标头,但要注意:
所以:不是一个可靠的解决方案。
一种可能,并远远超过了Referer的想法更好,解决方案可以是使用一个nonce:
如果这两个值不一样,请拒绝使用提交的数据。
注:这个想法经常被用来帮助对抗CSRF战斗 - 并集成在一些框架的“表”组件(Zend Framework,例如)。
这是针对此问题的完整且准确的答案。 – tplaner 2011-03-23 19:07:53
但是,当您在不同的选项卡中打开相同的网页时,这是一个问题。由于随机值是在每个选项卡中再次生成的,因此用户必须坚持使用其当前选项卡。 – Jordy 2016-06-09 22:29:15
在制作API时如何实现这一点? – VishalParkash 2017-01-04 04:57:00
我知道这是一个旧线程,但其他人可能会发现它相关。
答案是:是的,你可以。但这取决于您的Apache/nginx服务器是否设置为使用所需的信息填充$ _SERVER变量。大多数服务器是,所以你可以使用这种方法。
您需要做的是从$ _SERVER变量中提取HTTP_REFERER并与您的域进行比较。
<?php
function requestedByTheSameDomain() {
$myDomain = $_SERVER['SCRIPT_URI'];
$requestsSource = $_SERVER['HTTP_REFERER'];
return parse_url($myDomain, PHP_URL_HOST) === parse_url($requestsSource, PHP_URL_HOST);
}
这将检查是否有引用者,那么就会将其与当前的域进行比较,如果不同,则是从外部引用者
if ((isset($_SERVER['HTTP_REFERER']) && !empty($_SERVER['HTTP_REFERER']))) {
if (strtolower(parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST)) != strtolower($_SERVER['HTTP_HOST'])) {
// referer not from the same domain
}
}
您的意思是检查域的网址被请求php文件 – KoolKabin 2011-03-23 19:05:51
我会发表评论,因为我不确定,但难道你不能只是得到请求者的IP并且看它是否与你的服务器的IP相匹配?我在我的一个asp中做类似的事情。net apps – 2011-03-23 19:11:21