如何检查收到的请求是否从同一服务器发送?
说,我的域名是www.domain.com.现在我有php处理文件,它们将处理通过这个域托管的表单.只有在域内发送请求时才会执行此过程,即.www.domain.com以及从其他域发送的任何其他请求将被丢弃.
Pas*_*TIN 60
基本上:你不能.
使用HTTP协议,每个请求都独立于其他请求.
第一个想法是检查Referer HTTP标头,但请注意:
所以:不是可靠的解决方案.
一个可能的,远比Referer想法好得多的解决方案可能是使用一个nonce:
如果这两个值不相同,则拒绝使用提交的数据.
注意:这个想法通常用于帮助对抗CSRF - 并集成在某些框架(例如Zend框架)的"表单"组件中.
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)
小智 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)