如何检查来自同一服务器或不同服务器的请求?

时间:2011-03-23 19:01:17

标签: php

如何检查是否从同一服务器发送了收到的请求?

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

4 个答案:

答案 0 :(得分:57)

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


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

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

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


一个可能的,远比Referer想法好得多的解决方案可能是使用nonce

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

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

注意:此提示通常用于帮助对抗CSRF - 并集成在某些框架(例如Zend Framework)的“表单”组件中

答案 1 :(得分:8)

这将检查是否有引用,然后它将它与当前域进行比较,如果不同则它来自外部引用

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
}
}

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

使用curl我可以将REFERER设置为'www.domain.com',然后从我的服务器(www.domain.com)调用表单url(在www.mrhacker.com),但是调用$ _SERVER [' HTTP_REFERER']将给出www.domain.com

的值

(几乎)来自客户端的任何东西都可以被欺骗!我说差不多了,因为普通的Joe不能欺骗IP地址,所以只能通过代理发送。