PHP变量黑客

时间:2015-07-22 00:52:41

标签: 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
}

有没有办法可以将用户名更改为"超级用户"?

我计划能够快速查看和编辑人员在安全代码部分中的客户服务选项的帐户详细信息,因此我不希望一些随机用户能够查看和编辑其他用户数据

由于

2 个答案:

答案 0 :(得分:7)

id真的建议修复你的sql,只是使用PDO并不能保证安全,任何在sql体内使用php变量都应该避免

"select username from usernames where " . $number . " = '$session'"

这也不安全

 "select username from usernames where " . $number . " = :session"

如果$number变为username = 'superuser' --

,会发生什么情况
 "select username from usernames where username='superuser' -- = :session"

--之后的任何内容都是sql中的注释,就像php中的//一样。突然间我成了一名超级用户。是的,它可以而且确实很容易发生。

这是正确的方法,

 "select username from usernames where session_id = :session"

不确定$number是什么,重点是在sql体中没有php变量插值。我讨厌继续(不要暗自我喜欢它)但是正确使用PDO是必不可少的。我看到来自网页的'ASC''DESC'订单的代码并没有考虑到PDO注入,它没有比MySQL旧风格更安全,甚至因为他们认为它是安全的。

例如

"select username from usernames where username=1 order by $order"

如果订单是这样的话,请考虑会发生什么

"Desc; Drop table usernames;"

您可以使用if if例如

过滤数据
if( strtoupper($_POST['order']) ==  'DESC' ){
      $order = 'DESC';
}else{
      $order = 'ASC';
}

但是,无论何时在任何形式的sql中使用php变量,都必须非常小心。而且通常最好避免。您会注意到,在上面的用户数据永远不会被放入sql中,只有在评估if条件时才会使用它。

关于手头的实际问题,我会完全分开管理部分,单独的用户表,单独的会话数据,分开一切。这里有几个原因,最重要的是您不必担心管理员功能泄漏到普通用户帐户。如果登录会话单独存储,则以管理员和用户身份登录会更容易。您可以将管理员链接登录为(用户),例如在不知道其密码的情况下。您可以记录管理操作,而不会被用户的数据污染。您可以拥有不同级别的管理员用户,同样不必担心普通用户将获得对此功能的访问权限,因为它们是分开的。这是一项很重要的工作。

  

或者我可以合法地构建超级用户帐户,以便我可以从我的网站内的帐户访问数据

这并不意味着存储他们的信用卡号码,然后偷看他们,但这是你的网站(你可以随心所欲地制作),所以这是隐含的,当然有限制,就像有人来到你的房子你不能抢劫他们或在他们不知情的情况下出售他们的个人信息......他们对安全有一定的期望,对你如何处理购买和账单信息有一定的期望。但是,如果是出于支持或合法的商业原因,这只是很好的客户支持,可以看到他们做了什么(以类型能力登录)。现在以他们身份登录并运行他们的账单通常会不受欢迎,但你明白了。

答案 1 :(得分:0)

在将数据传递给SQL语句之前,您可以使用filter_values()。