ZMH*_*ech 1 php database security
有没有办法用户可以在PHP中更改代码的vaules?我们假设他们有我的网页的完整源代码.
// make the connection
$dbhost = 'localhost';
$dbuser = 'user';
$dbpass = 'password';
$db = "db";
$conn = new PDO("mysql:host=$dbhost;dbname=$db", $dbuser, $dbpass);
// set errors
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// get the data
$stmt = $conn->prepare("select username from usernames where " . $number . " = '$session'");
$stmt->execute();
$row = $stmt->fetch();
$username = $row[0];
if ($username == "superuser") {
// code to view secure information and make changes to people accounts
}
Run Code Online (Sandbox Code Playgroud)
他们有什么办法可以将用户名更改为"超级用户"吗?
我计划能够快速查看和编辑人员在安全代码部分中的客户服务选项的帐户详细信息,因此我不希望一些随机用户能够查看和编辑其他用户数据.
谢谢
我真的建议修复你的sql,只是使用PDO并不能保证安全性,应该避免在sql体内使用任何php变量
"select username from usernames where " . $number . " = '$session'"
Run Code Online (Sandbox Code Playgroud)
这也不安全
"select username from usernames where " . $number . " = :session"
Run Code Online (Sandbox Code Playgroud)
如果$number成为会发生什么username = 'superuser' --
"select username from usernames where username='superuser' -- = :session"
Run Code Online (Sandbox Code Playgroud)
之后的任何内容--都是sql中的注释,就像//在php中一样.突然间我成了一名超级用户.是的,它可以而且确实很容易发生.
这是正确的方法,
"select username from usernames where session_id = :session"
Run Code Online (Sandbox Code Playgroud)
不知道是什么$number,重点是在sql体中没有php变量插值.我讨厌继续(不要暗自我喜欢它)但是正确使用PDO是必不可少的.我看到来自网页的'ASC''DESC'订单的代码并没有考虑到PDO注入,它不再比MySQL旧风格更安全,甚至因为他们认为它是安全的.
例如
"select username from usernames where username=1 order by $order"
Run Code Online (Sandbox Code Playgroud)
想想如果订单是这样会发生什么
"Desc; Drop table usernames;"
Run Code Online (Sandbox Code Playgroud)
例如,您可以使用if if过滤数据
if( strtoupper($_POST['order']) == 'DESC' ){
$order = 'DESC';
}else{
$order = 'ASC';
}
Run Code Online (Sandbox Code Playgroud)
但是,无论何时在任何形式的sql中使用php变量,都必须非常小心.而且通常最好避免.您将注意到,在上面的用户数据永远不会被放入sql中,它仅在评估if条件时使用.
好的,对于手头的实际问题,我会完全分开管理部分,单独的用户表,单独的会话数据,分开一切.这里有几个原因,最重要的是您不必担心管理员功能泄漏到普通用户帐户.如果登录会话单独存储,则以管理员和用户身份登录会更容易.您可以将管理员链接登录为(用户),例如在不知道其密码的情况下.您可以记录管理操作,而不会被用户的数据污染.您可以拥有不同级别的管理员用户,同样不必担心普通用户将获得对此功能的访问权限,因为它们是分开的.做得对,这是一项很大的工作.
或者我可以合法地构建超级用户帐户,以便我可以从我的网站内的帐户访问数据
这并不意味着存储他们的信用卡号码,然后偷看他们,但这是你的网站(你可以随心所欲地制作),所以这是暗示的,当然有限制,就像有人过来你的房子你在他们不知情的情况下,他们无法抢劫或出售他们的个人信息......他们对安全有一定的期望,对你如何处理购买和账单信息有一定的期望.但是,如果是出于支持或合法的商业原因,这只是很好的客户支持,可以看到他们做了什么(以类型能力登录).现在以他们身份登录并运行他们的账单通常会不受欢迎,但你明白了.