我创建了这个php登录脚本。我想知道天气是否安全,如果不是,我怎么能改善它。
PHP脚本
<?php
include_once ("ConnectToMySql.php");
session_start();
$username = $_POST['username'];
$username = mysql_real_escape_string($username);
$password = $_POST['password'];
$password = sha1($password);
$query = "SELECT password FROM users WHERE username = '$username';";
$result = mysql_query($query);
if(mysql_num_rows($result) < 1)
{
echo "This Username Is Not Registered!";
exit;
}
if(mysql_num_rows($result) == 1)
{
if ($password == $result)
{
echo "Logged In!";
}
else echo "Wrong Password!";
}
?>
由于
答案 0 :(得分:4)
第一个提示可能是显示两个无效登录案例的常见错误:invalid username or password
。这样一来,最终的攻击者就不会知道用户名是否有效。
您还可以创建一个与用户名和密码相匹配的查询。您可能需要更多用户信息(存储在会话中?),因此最好选择这些字段而不是密码(例如id
,name
)。
关于存储在数据库中的散列密码,您可以添加SALT
以提高安全性。
http://en.wikipedia.org/wiki/Salt_%28cryptography%29
答案 1 :(得分:1)
我要做的是将查询更改为以下内容:
"SELECT COUNT(*) FROM users WHERE username = '$username' AND password='$password';"
这样,您不必在事后检查密码是否正确(并且您也不必传递敏感数据),您只需要检查返回的行数是否等于1并且您可以为用户名/密码生成单个错误消息。