好的,基本上我的问题是使用下面的登录脚本是否存在任何重大安全威胁,如果是,我可以使用什么来防止任何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 由于其安全漏洞和速度太快而不适合散列密码。如果你想要更多的安全性,请使用
第三,您将用户输入传递到数据库,就像它们一样,这意味着您的脚本容易受到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 版本应该为您解决这个问题,但就我个人而言,我宁愿相信银行抢劫犯会照顾我的钱包。