我用 Acunetix Web Vulnerability Scanner 扫描了我的网站,发现了 Host Header 攻击漏洞。
在描述中说我写了
(_SERVER["HTTP_HOST"] 在 PHP 中
但我没有,我不知道如何解决这个问题。
这是我受影响文件的标题
<?php
include 'core/init.php';
if($user->is_loggedin()){
redirect('index.php');
exit();
}
if($detect->isMobile()){
redirect('http://m.website.com/prijava.php');
exit();
}
if(isset($_POST['prijava'])){
$post = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
if(time() - $user->failTime($post['email']) < 600 && $user->failCount($post['email']) >= 3){
$err = '<p style="color:red;">Ra?un vam je zaklju?an na 10 minuta.</p>';
}else{
if(empty($post['email']) || empty($post['password'])){
$err = '';
}elseif($id = $user->prijava($post['email'], $post['password'])){
if($user->isActive($post['email'])){
$_SESSION['user'] = $id['id'];
$user->resetFail();
redirect('index.php');
exit();
}else{
$err = '<p style="color:red;">Korisni?ki ra?un nije aktiviran.</p>';
}
}else{
if($user->checkMail($post['email'])){
if($user->storeFail($post['email'])){
$err = '<p style="color:red;">Lozinka i email se ne poklapaju.</p>';
}
}else{
$err = '<p style="color:red;">Lozinka i email se ne poklapaju.</p>';
}
}
}
}
?>
Run Code Online (Sandbox Code Playgroud)
和 html
<head>
<meta charset="UTF-8">
<title>Prijava</title>
<link rel="shortcut icon" href="images/favicon.png" type="image/png">
<link rel="stylesheet" type="text/css" href="css/sign.css?<?php echo time(); ?>">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
Run Code Online (Sandbox Code Playgroud)
这是漏洞描述的图像:
总结一下,我该如何保护我的网站,谢谢。
有两种方法可以防止主机头攻击:
在 httpd(Apache、nginx 等)配置级别使用$_SERVER['SERVER_NAME'] 和强制执行
这意味着您应该为您服务的每个域都有一个明确配置的虚拟主机。或者换句话说 - 不允许“包罗万象”的配置。
检查它是否与您服务的域白名单匹配:
// Just in case there's more than one ...
$domains = ['abc.example.com', 'foo.bar.baz'];
if ( ! in_array($_SERVER['SERVER_NAME'], $domains)) {
// error
}
Run Code Online (Sandbox Code Playgroud)不管它的名字暗示什么,除非您遵循第一个解决方案,$_SERVER['SERVER_NAME']否则Host当 PHP 通过“catch all”配置运行时,标头值也将填充。
因此,除非您的 HTTP 服务器配置正确,否则它们都是相等的,因此为什么上面的两个解决方案都引用了$_SERVER['SERVER_NAME']- 如果您使用它或$_SERVER['HTTP_HOST'].