在我的网站上,我有一个用户登录系统,当他们登录时,他们会被带到他们的个人资料页面,这是由他们的 uid 吞噬的自然神论。问题是,没有什么可以阻止用户只是更改 uid 并转到其他人的个人资料并扮演他们的角色。为了阻止这种情况,我实现了一个 URL/MySQL 系统,如果用户的 uid 不是 URL 中的 uid,他们将被重定向到他们自己的配置文件。这里的问题是,在配置文件上有一些表单可以更改 URL,这样做会删除 uid 查询,导致页面(因为缺少 uid)将您带到您的配置文件并忽略表单输入。
代码是:
<?php
mysql_connect ('x', 'x', 'x');
mysql_select_db ('x');
if(isset($_COOKIE['wd_un'])) {
$un = $_COOKIE['wd_un'];
$pass = $_COOKIE['wd_pass'];
$cook = "SELECT * FROM x WHERE username = '$un' AND password = '$pass' limit 1";
$cookr = mysql_query($cook) or die (mysql_error());
if(mysql_num_rows($cookr) == 0) {
header ("Location: index.php");
}
else {
$urluid = mysql_real_escape_string($_GET['uid']);
$uidcheck = "SELECT * FROM x WHERE username = '$un' AND password = '$pass'";
$uidcheckq = mysql_query($uidcheck) or die (mysql_error());
while($rcu = mysql_fetch_assoc($uidcheckq)) {
$dbuid = $rcu['uid'];
if($urluid != $dbuid) {
header ("location: home.php?uid=$dbuid");
}
else {
}
}
}
}
mysql_close();
?>
有变通办法吗?
最佳答案
你这里的代码块充满了错误。
首先,绝对不要将用户密码存储在 cookie 中。 您应该只在 cookie 中存储一个 session ID,然后将其余 session 数据存储在数据库中的 session 表中,其中包含用户 ID 以及您可能希望基本访问的任何其他内容......密码不应该也可以在这张表中。
现在,您可以安全地在 URL 中使用 user_id,因为交叉引用会将人们拒之门外。
当然,在加载时,您会交叉引用根据您的 cookie id 提取的 session 表中的 mysql 结果。如果它们不匹配,显然会启动它们。
至于您的表单重定向,您需要重组处理发布的方式。您可以让您的个人资料页面始终只提取与您的 cookie 中的 session ID 相关的个人资料。这将消除对 URL 的依赖并彻底解决这个问题。
此外 - 请查看 mysql_real_escape_string() 以清理您的输入。盲目接受 mysql 查询的 cookie 信息是非常危险的。除非您确实打算在您的站点中留下巨大的注入(inject)孔。
关于php - 将用户限制在他们的个人资料页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9026908/