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

pta*_*mzz 16 php

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

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

Pas*_*TIN 60

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


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

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

所以:不是可靠的解决方案.


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

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

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

注意:这个想法通常用于帮助对抗CSRF - 并集成在某些框架(例如Zend框架)的"表单"组件中.

  • 对于这个问题,这是一个完整而准确的答案. (4认同)
  • 但是,当您在不同的选项卡中打开同一网页时,这是一个问题。由于随机值会在每个选项卡中再次生成,因此用户必须坚持使用当前选项卡。 (2认同)

Ash*_*raf 10

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

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
}
}
Run Code Online (Sandbox Code Playgroud)

  • 这是可以伪造的。它缺乏对 TCP/IP 工作原理的深入了解。 (5认同)

小智 7

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

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

  • 这是可以伪造的。它缺乏对 TCP/IP 工作原理的深入了解。 (9认同)