use*_*510 0 php security cookies login session-variables
我目前正在测试一个简单的登录系统.该脚本的作用是检查我输入的用户名和密码与我的数据库中的用户名和密码,如果它们都匹配,则将用户名设置为会话变量.当我转到"仅限会员"页面时,它将检查会话变量是否存在,如果不存在,则用户无法查看内容.它似乎按预期工作.根据以上信息,以下是我的问题:
我的方法有哪些漏洞/漏洞?
饼干能让它更安全吗?如果是这样,它将如何与我的代码相关?
这是我到目前为止所做的工作:
用户名和密码检查:
<?
session_start();
$username = $_POST['username'];
$password = $_POST['password'];
if ($username && $password){
$query = mysql_query("SELECT * FROM user WHERE username='$username' ");
$numrows = mysql_num_rows($query);
//if user exists
if ($numrows !=0){
while ($row = mysql_fetch_array($query)){
$dbusername = $row['username'];
$dbpassword = $row['password'];
}
if ($username == $dbusername && md5($password) == $dbpassword){
echo 'You\'re in! <a href="member.php">Click</a> here to enter the member page.';
$_SESSION['username'] = $dbusername;
}
else
echo "incorrect password!";
}
else
die("sorry, that user doesn't exist!");
}
?>
Run Code Online (Sandbox Code Playgroud)
仅限会员页面:
<?
session_start();
if ($_SESSION['username']){
echo "Welcome, ".$_SESSION['username']."!<br>
<a href='changepassword.php'>Change password</a>
";
}
else{
echo "please log in";
}
?>
Run Code Online (Sandbox Code Playgroud)
目前最大的安全问题是SQL注入,这是当前脚本中的一个巨大缺陷.任何人都可以使用您发布的脚本在没有任何凭据的情况下登录.改变这一行:
$username = $_POST['username'];
Run Code Online (Sandbox Code Playgroud)
看起来像:
$username = mysql_real_escape_string($_POST['username']);
Run Code Online (Sandbox Code Playgroud)
就cookie而言,会话使用cookie,因此您已经在使用它们.其次,您放入cookie中的任何内容都会通过网络传输,因此它们不安全.
其他安全措施可能是使用bcrypt或至少一个sha2变体,而不是md5用于散列密码.
在通过网络发送密码之前,最好使用javascript哈希密码,如果您不使用SSL,这一点非常重要.
那会让你开始.在您处理这些问题之后,您可以继续进行CSRF和会话劫持攻击.