这个登录脚本安全吗?

时间:2016-04-23 20:54:01

标签: php

好吧,基本上我的问题是使用下面的登录脚本是否有任何重大安全威胁,如果是这样,我可以使用什么来阻止任何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注入。

2 个答案:

答案 0 :(得分:2)

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

其次,不要使用MD5加密方法,至少使用sha256。这是因为MD5由于其安全性弱而且由于速度太快而不适合散列密码。如果您想要更多安全性,请使用 salt与sha256 password_hash()函数。并here原因。

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

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

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

有这些:

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

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

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

答案 1 :(得分:0)

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

&#39;&#39; mysql_query(&#34;插入usr_logs(用户,IP,时间,日期,成功)值(&#39; $ username&#39;,&#39; $ ip&# 39;,&#39; $ time&#39;,&#39; $ date&#39;,&#39; $ success&#39;)&#34;);

Say $ username =&#39; drop table users ...&#39;或者其他的东西。不好。

理论上,从5ish开始的php版本应该为你处理这个问题,但我个人更愿意相信一个银行抢劫犯来照看我的钱包。