此登录脚本是否安全


Is this login script safe?

好的,基本上我的问题是使用下面的登录脚本是否存在任何重大安全威胁,如果是,我可以使用什么来防止任何SQL注入或用户在没有提供正确详细信息的情况下登录我的服务?我知道我使用的是过时的PHP版本,但是我的整个网站都是基于以前的版本构建的,并且我知道使用过时的版本会带来风险。

登录表格

<form method="post" action="login.php?login=login">
<input type='text' placeholder="username" class='form-control' name='username' required autofocus/>
<input type='password' placeholder="password" class='form-control' name='password' required/>
<input class='btn btn-default btn-block'  type='submit' value='Login' class='submit' />
</form>

表格发布

<? if($login==login)
      {
      $username = clean($_POST[username]);
      $password = md5($_POST[password]);
      $date = date("Y-m-d");
      $time = date("H:i:s");
      $sql = mysql_query("select * from users where username = '$username' AND password = '$password'");
      $check = mysql_num_rows($sql);
      if($check!=1)
      {
      echo 'Incorrect username or password.';
      echo('<meta http-equiv="refresh" content="3;url=/login" />');
      $success = "Failed";
      if($content[loginlog]==1)
      $sqllog = mysql_query("insert into usr_logs(user, ip, time, date, success) values('$username', '$ip', '$time', '$date', '$success')");
      }
      else
      {
      $user = mysql_fetch_array($sql);
      $_SESSION[usr_name] = $user[username];
      $_SESSION[usr_level] = $user[level];
      $_SESSION[usr_ip] = $ip;
      $success = "Success";
      echo('<meta http-equiv="refresh" content="1;url=/home" />');
      if($content[loginlog]==1)
        $sqllog = mysql_query("insert into usr_logs(user, ip, time, date, success) values('$username', '$ip', '$time', '$date', '$success')");
      }
      }
      if($login==logout)
      {
      session_unset();
      session_destroy();
      echo 'logged out';
      echo('<meta http-equiv="refresh" content="3;url=/login" />');
      }?>

感谢您帮助我提高代码的安全性并防止任何SQL注入。

首先,什么是clean()函数?

其次,不要使用MD5加密方法,至少使用sha256。这是因为 MD5 由于其安全漏洞和速度太快而不适合散列密码。如果你想要更多的安全性,请使用

salt与sha256结合使用 password_hash()函数。原因如下。

第三,您将用户输入传递到数据库,就像它们一样,这意味着您的脚本容易受到SQL注入的攻击。应使用预准备语句。此处的官方文档解释了如何使用它们。

第四,您应该替换这些行:

echo('<meta http-equiv="refresh" content="3;url=/login" />');
echo('<meta http-equiv="refresh" content="1;url=/home" />');

有了这些:

header('Location: /login');
header('Location: /home');

原因是万维网联盟不鼓励使用元刷新。更多信息可以在这里找到。

最后但并非最不重要的一点是,您正在使用旧的已弃用的mysql扩展。您应该使用 mysqli 或 PDO 扩展来访问数据库。

代码的最大问题是使用MD5,它可以在几秒钟内被彩虹表打破。在SQL注入方面,看起来你有一些大问题

'

'mysql_query("插入usr_logs(用户、IP、时间、日期、成功)值('$username'、'$ip'、'$time'、'$date'、'$success')");

假设 $username='删除表用户...'什么的。不好。

理论上讲,从 5 岁开始的 php 版本应该为您解决这个问题,但就我个人而言,我宁愿相信银行抢劫犯会照顾我的钱包。