验证重试

时间:2019-08-15 08:37:54

标签: php

即使字段为空白或不正确,也会继续进行身份验证。

我正在使用Kali Linux,一切正常,php正常运行。

<?php

$auth = 1;

$user1='14c4b06b824ec593239362517f538b29';       //username
$pass1='5f4dcc3b5aa765d61d8327deb882cf99';       //password

if($auth==1)
{
    if(!isset($_SERVER['PHP_AUTH_USER']))
    {
        if(md5($HTTP_SERVER_VARS['PHP_AUTH_USER'])!=$user1 || md5($HTTP_SERVER_VARS['PHP_AUTH_PW'])!=$pass1)
        {
            header("WWW-Authenticate: Basic");
            header("HTTP/1.0 401 Unauthorized");
            die("Unauthorized access!");
        }
    }
}

?>

如果输入的用户名=用户名和密码=密码,则继续加载页面,否则,请重试

但是我遇到的是,即使输入为空白或不正确,它也会继续加载页面。

2 个答案:

答案 0 :(得分:1)

  

但是我遇到的是,即使输入为空白或不正确,它也会继续加载页面。

因为在这种情况下设置了$_SERVER['PHP_AUTH_USER']

那应该可以解决您的问题:

if($auth==1)
{
    if(md5($_SERVER['PHP_AUTH_USER'])!=$user1 ||
       md5($_SERVER['PHP_AUTH_PW'])!=$pass1)
    {
        header("WWW-Authenticate: Basic");
        header("HTTP/1.0 401 Unauthorized");
        die("Unauthorized access!");
    }
}

旧答案:

这里有些鱼。

在一行中,您正在检查是否设置了$_SERVER['PHP_AUTH_USER'],在另一行中,您正在从$HTTP_SERVER_VARS['PHP_AUTH_USER']计算md5。

注意区别。

可能应该是:

if(md5($_SERVER['PHP_AUTH_USER'])!=$user1 || md5($_SERVER['PHP_AUTH_PW'])!=$pass1)

答案 1 :(得分:0)

我想添加到现有答案中,由于timing attacks,您不应该使用相等运算符比较机密(例如密码)。 PHP具有专门为避免这种情况而设计的功能:hash_equals()

if ($auth == 1) {
    if (!hash_equals(md5($_SERVER['PHP_AUTH_USER']), $user1) || !hash_equals(md5($_SERVER['PHP_AUTH_PW']), $pass1)) {
        header("WWW-Authenticate: Basic");
        header("HTTP/1.0 401 Unauthorized");
        die("Unauthorized access!");
    }
}

我也建议不要使用MD5,因为它的quite a weak algorithm不足以提供密码。使用免费的在线工具,使用查找(彩虹)表“逆向”这些哈希值非常容易,该查询表包含大量哈希值和它们的纯文本等效项,可以在几秒钟内进行查询。

  

Free Password Hash Cracker Enter up to 20 non-salted hashes, one per line: 14c4b06b824ec593239362517f538b29 5f4dcc3b5aa765d61d8327deb882cf99 Supports: LM, NTLM, md2, md4, md5, md5(md5_hex), md5-half, sha1, sha224, sha256, sha384, sha512, ripeMD160, whirlpool, MySQL 4.1+ (sha1(sha1_bin)), QubesV3.1BackupDefaults Hash   Type    Result 14c4b06b824ec593239362517f538b29 md5 username 5f4dcc3b5aa765d61d8327deb882cf99   md5 password Color Codes: Green: Exact match, Yellow: Partial match, Red: Not found.

如果您选择提高脚本的安全性,我建议您看一下password_hash,这是一对password_verify(),这对定时攻击是安全的。

您可以制作一个独立的脚本来为您生成哈希:

<form method="POST">
  <input name="data[Username]" placeholder="Username">
  <input name="data[Password]" placeholder="Password">
  <input type="submit">
</form>
<?php
if (!empty($_POST['data']) && is_array($_POST['data'])){
  $hashes = array_map(function ($value) {
    return password_hash($value, PASSWORD_DEFAULT);
  }, $_POST['data']);
  echo '<p>Your hashes:</p><pre>';
  print_r($hashes);
  echo '</pre>';
}

这将为您提供两个输入,您可以在其中输入所需的值,并在提交表单时输出哈希。这些散列是不可逆的,类似于MD5,但是它们不太容易出现上面展示的查找攻击。

  

Input username Input password Submit button Your hashes: Array ( [Username] => $2y$10$5dt0CX73JcgLfAbrMAuFdeboEl5SQzkFDf9Uqwr/5I7OQaJdNiUl2 [Password] => $2y$10$E/fhcug/XuA0bQ5SVJXFS.b9nxeLpPM5r.hgCHcyVXx/4P6/u4QSO )

您可能会注意到,即使在浏览器中单击刷新时,每次的值也不会相同。这是由于加盐处理,通过确保您不仅可以获取哈希并将其与具有其纯文本等效项的已知哈希表进行比较,还可以进一步提高任何哈希算法的弹性。使用您获得的值代替脚本的MD5哈希,然后将验证码替换为以下内容:

if ($auth == 1) {
    if (!password_verify($_SERVER['PHP_AUTH_USER'], $user1) || !password_verify($_SERVER['PHP_AUTH_PW'], $pass1)) {
        header("WWW-Authenticate: Basic");
        header("HTTP/1.0 401 Unauthorized");
        die("Unauthorized access!");
    }
}