在查询中使用$ _SESSION ['id']是不是很糟糕?

时间:2011-04-06 14:09:41

标签: php mysql

当人登录时,他获得$_SESSION['id']并且它成为他从mysql表中获取的id。然后我做SELECT * FROM members WHERE member_id = {$_SESSION['id']}之类的mysql查询。

那么,这样安全吗? $ _SESSION ['id']能否以某种方式消失或黑客编辑?

谢谢。

7 个答案:

答案 0 :(得分:6)

我认为通过简单地插入或连接变量来创建查询总是总是。相反,您应该使用Prepared Statement来保证防止SQL注入类型攻击。恕我直言,他们也使代码看起来更好。

答案 1 :(得分:2)

理论上,客户端无法影响$ _SESSION数组,因为会话数据存储在服务器上。但在实践中,永远不要相信这一点,因为黑客可以使用另一个安全漏洞和次级$ _SESSION ['id']来处理坏事。

在将id放入查询之前执行此操作:

$_SESSION['id'] = intval($_SESSION['id']);

答案 2 :(得分:0)

<?php
$stmt = mysqli_prepare($con, "SELECT Name FROM members WHERE member_id = ? LIMIT 1");
mysqli_stmt_bind_param($stmt, "s", $_SESSION['id']);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $name);
mysqli_stmt_fetch($stmt);
mysqli_stmt_close($stmt);

echo 'name is '.$name;
?>

答案 3 :(得分:0)

由于标题变量在用户控制之下,因此您是正确的。

你生成一个有效的id,但是我可以通过例如将$ _SESSION ['id']设置为1234 OR 1==1来篡改它,并且(理论上)将返回所有用户记录,除非你清理那个变量

获取用户数据是可以的,但始终对其进行验证。将其设置为临时变量,然后运行类似preg_replace("[^A-Za-z0-9]", "", $_SESSION['id'])的内容以删除任何非字母数字字符。仅凭这一点是不够的,但这是迈向更安全的用户输入并远离所谓的“SQL注入”的一步。

答案 4 :(得分:0)

正如已经建议的那样,你永远不应该假设类型安全。不是因为有人可以破解你,也不是因为你可能犯了错误或配置你的服务器的人。由于PHP的会话可以存储在文件系统中(默认),因此可以将它们存储在Memcache中,也可以编写自己的会话存储处理程序(在db中存储会话)。 说出错了 - 你保存了数据库的会话,你篡改了数据库并且你错误地将值改为其他东西,而不是整数(或浮点类型),你用逗号接收字符串而不是 - 哪个不符合您在上面发布的查询 - 瞧,您收到的错误。没有人喜欢错误并阅读错误说明 - 尤其不是您的用户。

所以,回答你的问题 - 任何人都不好。永远不要相信外国输入,总是有一个以上的失败点 - 为了安全而清理您的输入,无论是_POST,_GET,_SESSION还是其他任何东西。

答案 5 :(得分:-1)

认为 总是不好。考虑一些变量是否安全 你是一名程序员。让你编程思考这些小事,转向更有趣的事情。

答案 6 :(得分:-1)

$_SESSION中的内容和内容基本上由您控制。除了使用一些高级内容,如黑客攻击服务器和编辑临时PHP存储文件,浏览器无法控制它。

几乎每个身份验证都依赖于SESSION数组中某个变量的设置来跟踪当前用户。这可以被认为是安全的。只要您避免使用以下语句将控制权特别交给浏览器:

$_SESSION['id'] = $_POST['id']

等。

然而,其他关于永远不会通过字符串连接构建数据库查询的答案是有效的。优秀的做法是总是通过mysql_real_escape_string()运行,所以作为一名优秀的程序员,你使用一个包装函数/类来为你自动化,所以你永远不会错。< / p>