2011-04-06 63 views
7

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

那么,安全吗? $ _SESSION ['id']可以消失,或者黑客可以编辑它吗?

谢谢。

+0

如果有一个代码路径可能会导致此查询在未经过设置会话变量的代码的情况下执行,那么“是”,变量可能会“消失”,只需强制一个新会话,然后沿着该代码路径。 – 2011-04-06 14:21:02

回答

6

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

2

理论上,客户端无法影响$ _SESSION数组,因为会话数据存储在服务器上。但是在实践中,绝对不要相信这一点,因为黑客可以使用另一个安全漏洞和$ _SESSION ['id']代替坏东西。

做到这一点,把ID即可查询之前:

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

+1。没有理由*不*这样做。 – 2011-04-06 14:18:17

+0

你的意思是intval吧? – DShook 2011-04-06 14:19:28

+1

什么样的安全漏洞?要远程更改会话,您需要直接访问会话存储介质,或者在OP代码中找到一些中间漏洞。只要不存在'$ _SESSION ['id'] = $ _GET ['hidden_​​s33krit_id_overrride']',我看不到远程恶意用户如何更改会话变量。 – 2011-04-06 14:20:01

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; 
?> 
+0

会话无法更改,但一些如何被黑客攻击,如果你有Firefox和COOKIE编辑器,你可以看到PHPSESID的内容,这是存储会话数据的文件名,如果用户修改成功然后他攻击他人会话! – Sourav 2011-04-06 14:18:36

+0

如果你喜欢mysqli_query,你可以尝试使用mysqli_real_escape_string:P – Sourav 2011-04-06 14:22:07

+0

黑客会猜测一个有效的会话ID,这不是一件容易的事情......除非他可以注入一些JavaScript(这被称为XSS)来让一些可怜的灵魂饼干发送给黑客。 – 2011-04-06 15:05:42

0

你是对的,因为头瓦尔都在用户的控制就值得怀疑。

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

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

+0

'$ _SESSION ['id']'不是标题变量? – 2011-04-06 14:52:42

0

正如已经暗示的那样,您绝不应该假定类型安全。不是因为有人可以攻击你,也可能是因为你可能犯了错误或配置你的服务器的人。由于PHP会话可以存储在文件系统中(默认),因此可以将它们存储在Memcache中,也可以编写自己的会话存储处理程序(以db为单位存储会话)。 假设发生了一个错误 - 您将会话保存到数据库,您篡改了数据库,并且错误地将值更改为其他值,而不是整数(或浮点类型),您收到带有逗号的字符串, - 这不符合你上面发布的查询 - 并且瞧,你会得到错误。没有人喜欢得到错误和阅读错误描述 - 尤其是不是你的用户。

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

-1

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

+1

程序员应该始终知道变量可以包含哪些值并且不能包含哪些值。你怎么知道程序应该对它执行什么样的检查? – 2011-04-06 14:50:58

+0

downvote不是我的,但我不明白你的意思。你会不同意在将变量放入查询之前在变量上做一个intval'至少是有用的吗? – 2011-04-06 17:37:45

+0

是的,我愿意。但我不同意上面提出的广泛声明。不思考导致假设,这正是导致安全错误的原因。做intval并且知道你为什么这样做。不仅仅是通过intval无意识地运行所有的东西,然后假设世界上的所有东西都是安全的。 – 2011-04-07 10:15:15

-1

什么是和不在$_SESSION基本上是在你的控制之下。除了使用一些诸如黑客入侵服务器和编辑临时PHP存储文件之类的高级内容之外,浏览器无法控制这一点。

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

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

等。

尽管如此,其他人回答说永远不要通过字符串连接构造数据库查询是有效的。 总是通过mysql_real_escape_string()运行的东西是一个很好的做法,所以作为一名优秀的程序员,您可以使用一个包装函数/类来为您自动执行该操作,所以您永远不会错误。

相关问题