2011-03-23 107 views
13

如何检查收到的请求是否从同一个服务器发送?如何检查来自同一服务器或不同服务器的请求?

说,我在www.domain.com上有我的域名。现在我已经php处理文件,它将处理通过此域托管的表单。只有当请求从域内发送时,这个过程才会被执行。 www.domain.com和从其他域发送的任何其他请求都将被丢弃。

+0

您的意思是检查域的网址被请求php文件 – KoolKabin 2011-03-23 19:05:51

+0

我会发表评论,因为我不确定,但难道你不能只是得到请求者的IP并且看它是否与你的服务器的IP相匹配?我在我的一个asp中做类似的事情。net apps – 2011-03-23 19:11:21

回答

49

基本上:你不行。
使用HTTP协议,每个请求都是独立于其他请求的。


第一个想法是将检查的Referer HTTP标头,但要注意:

  • 它可以伪造(它是由浏览器发送)
  • 并不总是存在。

所以:不是一个可靠的解决方案。


一种可能,并远远超过了Referer的想法更好,解决方案可以是使用一个nonce

  • 当显示形式,把一个隐藏的输入字段中它包含一个随机值
  • 同时,将该随机值存储到与用户对应的会话中。
  • 提交表单时,请检查隐藏字段的值是否与存储在会话中的值相同。

如果这两个值不一样,请拒绝使用提交的数据。

注:这个想法经常被用来帮助对抗CSRF战斗 - 并集成在一些框架的“表”组件(Zend Framework,例如)

+3

这是针对此问题的完整且准确的答案。 – tplaner 2011-03-23 19:07:53

+0

但是,当您在不同的选项卡中打开相同的网页时,这是一个问题。由于随机值是在每个选项卡中再次生成的,因此用户必须坚持使用其当前选项卡。 – Jordy 2016-06-09 22:29:15

+0

在制作API时如何实现这一点? – VishalParkash 2017-01-04 04:57:00

0

我知道这是一个旧线程,但其他人可能会发现它相关。

答案是:是的,你可以。但这取决于您的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); 
} 
4

这将检查是否有引用者,那么就会将其与当前的域进行比较,如果不同,则是从外部引用者

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 
} 
} 
相关问题