2017-09-25 44 views
0

我使用这个代码在我登录form.Everything工作:登录表单的安全防范措施

$username = trim($_POST['username']); 
$password = trim($_POST['password']); 
$pass=md5($password); 
$stmt = $mysqli->prepare("SELECT id FROM users WHERE username = ? AND password = ?"); 
$stmt->bind_param('ss', $username, $pass); 
$stmt->execute();  
$stmt->store_result(); 
$stmt->bind_result($id); 
$stmt->fetch(); 

if ($stmt->num_rows == 1) { $_SESSION['name']=$id; echo'user logged in';} 
else {echo'invalid username/password';} 
$stmt->close(); 

但我应该用别的东西吗?还是够了?我是新准备的语句,所以我想知道语法是否写得很好。

+2

首先,你应该使用password_hash/password_verify而非MD5。 (不过,如果你已经将密码存储为md5,它将不起作用。) –

+0

准备好的声明怎么样?写得好吗? – rimas

+0

准备好的语句部分对我来说看起来很好,但是在保存密码时需要确保它们不包含任何将被'trim'删除的前导/尾随空格。如果切换到使用password_hash + password_verify,则需要将其更改为仅根据用户名进行选择,获取记录,然后验证密码。 –

回答

0

一方面你使用准备好的语句,这是防止SQL注入(除了可能的性能提升)是非常有用的,有关准备语句的好处是犯了一个错误可以给你不正确的结果,但不开门攻击者连接查询字符串do。

但另一方面,您正在使用md5()散列密码是不推荐几年。正如评论PHP建议现在有专门为管理密码,password_hash()password_verify()这是很简单的使用创造了两个功能。

我强烈建议比你的菜md5()即使这意味着存储在数据库中的密码的再生,因为该功能几乎是无用的nowdays(与MD5的攻击者可以很容易地在一两天破解都是你的密码,只需配备一台计算机与高端显卡)。

编辑:要使用password_hash()老调重弹你原有的密码,你可以做这样一个渐进的过渡,东西:

  • 您在数据库添加一个字段输入新密码,默认为空。
  • 加入新用户存储在新密码字段password_hash()获得的散列,和离开旧字段为空。
  • 对于现有用户更改登录代码,使其双向
    • 如果新的字段为空,你核对旧的密码,如果密码正确,你老调重弹的密码password_hash(),其存储在新的领域和清空旧值。最后一步对于摆脱不安全的散列很重要。
    • 如果新的字段不为空,则该用户已被迁移或者它是一个新的用户,所以你检查对新场password_verify()。在投入生产之前

当然,仔细检查这一点,因为你是删除旧的哈希值。这可能需要一些时间,如果有很多用户或他们偶尔登录,但如果您有足够的杠杆作用,您可以订购强制登录以加快此过程。

+1

使用md5,你可以在一台或两台_minutes_上用一台只装有_a web浏览器的计算机破解大部分密码._; –

+0

@ Don'tPanic好的,我没有想到云计算机。 –

+0

嗯,你知道,crackstation等。我有一天在其他工作时使用它来恢复遗留系统的一些密码。 easy peasy –