Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 防止主机头攻击_Php_Security - Fatal编程技术网

Php 防止主机头攻击

Php 防止主机头攻击,php,security,Php,Security,我用Acunetix Web漏洞扫描器扫描了我的网站,发现了主机头攻击漏洞 在描述中说我写了 (_服务器[“HTTP_主机”]在PHP中) 但我没有,我也不知道如何解决这个问题 这是我受影响文件的头 <?php include 'core/init.php'; if($user->is_loggedin()){ redirect('index.php'); exit(); } if($detect->isMob

我用Acunetix Web漏洞扫描器扫描了我的网站,发现了主机头攻击漏洞

在描述中说我写了

(_服务器[“HTTP_主机”]在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>';
                }           
            }
        }       
    }
?>

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

普里爪哇

有两种方法可以防止主机头攻击:

  • 使用
    $\u SERVER['SERVER\u NAME']
    并在httpd(Apache、nginx等)配置级别强制执行它

    这意味着你应该为你服务的每个域都有一个显式配置的虚拟主机。或者换句话说,不允许“一网打尽”的配置

  • 检查它是否与您服务的域的白名单匹配:

    // Just in case there's more than one ...
    $domains = ['abc.example.com', 'foo.bar.baz'];
    if ( ! in_array($_SERVER['SERVER_NAME'], $domains)) {
        // error
    }
    
  • 不管它的名字意味着什么,除非您遵循第一个解决方案,
    $\u SERVER['SERVER\u name']
    在PHP运行“catch all”配置时,也将由
    主机
    头值填充。

    因此,除非您的HTTP服务器配置正确,否则它们都是相等的,因此上述两种解决方案都引用了
    $\u服务器['server\u NAME']
    -如果您使用该解决方案或
    $\u服务器['HTTP\u主机']

    这是解决主机头攻击的代码。必须指定URL

    $allowed_domains=array('yourdomain1','yourdomain2','yourdomain3');
    $default_domain='yourprimedomain';
    if(在_数组中($_服务器['HTTP _主机'],允许的_域,TRUE))
    {
    $domain=$\u服务器['HTTP\u主机'];
    }
    其他的
    {
    $domain=$default\u domain;
    }
    如果(!空($_服务器['HTTPS']))
    {
    $config['base_url']='https://'。$domain;
    }
    其他的
    {
    $config['base_url']='http://'。$domain;
    
    }
    这只是一个如何使用此标题的示例。我会检查php.ini的标题相关设置。另外,您是否使用了一些框架?@Alfabravo不要使用任何框架,我没有访问php.ini的权限,我应该向我的主机提供商询问吗?我仍然有相同的漏洞。我刚刚编辑了答案,请放入标题。对不起答案不完整。