我找到了以下代码in a previous question on S O.在下面的代码中,如果用户提供的用户名和密码正确,则user_id和username存储在会话中以保持记录。我的问题是,为什么需要在会话中保留user_id?只有一件事(例如,用户名)足以存储在会话中? 如果启用了记住,则仅设置用户名的cookie。 现在我的问题是,仅用户名cookie是否足够?任何人都不能在浏览器中编辑或添加cookie并登录系统吗?
感谢您的回复。
<?
public function login($username, $pass, $remember) {
// check username and password with db
$result = $conn->query("select * from login where
username='".$username."' and
password=sha1('".$pass."')");
if (!$result) {
throw new depException('Incorrect username and password combination. Please try again.');
}
if ($result->num_rows>0) {
$row = $result->fetch_assoc();
$_SESSION['user_id'] = $row[user_id];
$_SESSION['username'] = $username;
// start rememberMe
$cookie_name = 'db_auth';
$cookie_time = (3600 * 24 * 30);*/ // 30 days
// check to see if user checked box
if ($remember) {
setcookie ($cookie_name, 'username='.$username, time()+$cookie_time);
}
// If all goes well redirect user to their homepage.
header('Location: http://localhost/v6/home/index.php');
} else {
throw new depException('Could not log you in.');
}
}
?>
答案 0 :(得分:5)
这个代码不安全!(对不起,但是重点是它)。 SQL语句易受SQL注入的影响。将用户名存储在cookie中也是一个坏主意,因为任何人都可以伪造cookie来获得身份验证。
答案 1 :(得分:1)
我对这个问题的答案是否安全:不。
您需要清理代码。如果有人输入'test OR 1 = 1'作为用户名,会发生什么?
答案 2 :(得分:0)
我真的不知道从哪里开始。这段代码真的不安全。
mysql_real_escape_string()
(或mysqli函数,甚至更好:使用PDO进行任何数据库连接并使用预处理语句)
用户名和密码,确保
$remember
是一个布尔值
或整数。sha1
就像破了,
所以我建议改用md5
。username=admin
cookie并以admin身份登录。答案 3 :(得分:0)
您的代码不安全。
您的数据通过初始查询对SQL注入开放,根据数据库用户的访问级别,您可以让任何人登录。您需要清理输入。
其次,通过cookie访问网站,以及其中的用户名与访问级别和权限相关?如果是这样,那么会话很容易被劫持。
答案 4 :(得分:0)
这是我用来确保一切安全的代码..它可能不是最安全的,但我也使用其他措施来验证安全登录。但是这段代码可以保护你免受SQL注入。
function secure($data) {
$data = trim(htmlentities(strip_tags($data)));
if (get_magic_quotes_gpc())
$data = stripslashes($data);
$data = mysql_real_escape_string($data);
return $data;
}
这是用法
secure($username);
例如
foreach($_POST as $key => $value) {
$get[$key] = secure($value);
}
这告诉PHP每个POST值保护它。 您也可以使用$ _GET代替$ _POST将其用于发布,但让我们面对它...使用GET命令登录将是非常愚蠢的