form submit { email|password }
php filter/check { mysql_real_escape_string etc... }
php set/login.php {
$hash_logged = sha1(rand(100000,999999).$_SERVER["REMOTE_ADDR"].time());
$_SESSION["hl"] = $hash_logged;
mysql_query("UPDATE `users` SET `hash_logged`='".$hash_logged."' WHERE
`email`='".$emailLogin."'")or die(mysql_error());
setcookie("hlc", sha1($emailLogin."longstringtoguess"), time() + 600);
}
在所有files.php之上的php脚本,以验证用户是否已登录:
if(isset($_SESSION["hl"], $_COOKIE["hlc"]))
{
$ext_hl =$_SESSION["hl"];
$ext_cookie = $_COOKIE["hlc"];
if(empty($ext_hl)) { header("location: logout.php"); exit(); }
if(empty($ext_cookie)) { header("location: logout.php"); exit(); }
$mysqlQ = mysql_query("SELECT `id`, `username`, `email`, `password` FROM `users`
WHERE `hash_logged`='".$ext_hl."'")or die(mysql_error());
if(mysql_num_rows($mysqlQ) == 1)
{
$row = mysql_fetch_array($mysqlQ);
if(sha1($row["email"]."longstringtoguess") == $ext_cookie)
{
$logged = "yes";
}
else {
header("location: logout.php");
exit();
}
}
else { header("location: logout.php"); exit(); }
}
logout.php
session destroy / unset header location:index.php
这种方法足够安全吗?你这样做的方法是什么?
谢谢
这方面的一个问题是想要从两个设备(以及两个不同的IP地址之前)连接的用户或者在IP地址可能改变的连接(cuch as mobile / dialup)上的用户。理想情况下,您有一个记录hash_id和user_id的“sessions”表,然后用户连接到“session”,然后您知道从该表连接的用户。
鼓励使用PDO进行数据库输入。 http://php.net/manual/en/book.pdo.php起初可怕但很有意义并且很快变成了第二天性(“容易”)。
如果需要,您还可以确保会话“过期”。
您的代码受制于可能窃取cookie并欺骗REMOTE_ADDR的人,或者如果有人知道电子邮件地址并且可以破解密钥 - 但在大多数情况下,这就足够了。您可以添加其他投影,例如对会话存储user_agent(再次可欺骗)或向哈希添加更多(旋转密钥)等等,以使其难以破解。
这种方法足够安全吗?你这样做的方法是什么?
$emailLogin
中通过set/login.php
进行SQL注入。我更喜欢使用预备语句,通过EasyDB。session_start()
而不是试图建立一个看似安全的随机值。如果我需要直接创建随机性,我使用random_bytes()
。==
来比较字符串。
我用hash_equals()
代替。
违规线:if(sha1($row["email"]."longstringtoguess") == $ext_cookie)