在进入SQL查询之前,是否需要转义$ _SESSION ['username']?

时间:2012-05-18 00:01:11

标签: php mysql

我想知道在我在SQL查询中使用它之前是否需要转义$ _SESSION数组中的任何内容。

请注意,我在我的应用程序中不使用cookie,因为我听说它们可能用于会话劫持(?)

非常感谢

5 个答案:

答案 0 :(得分:5)

你需要转义你传递给sql查询的每个字符串,而不管它的来源。

即使是您从数据库中检索到的数据。

答案 1 :(得分:2)

假设PHP中尚未发现漏洞,所有应该在允许任何内容触及数据库之前使用预准备语句或mysql_real_escape_string进行转义。

存储在$ _SESSION中的数据并不总是干净的。对于多页表单,您可以将用户输入存储在$ _SESSION中,直到最后一页将其全部写入数据库。如果你有任何一种习惯,认为$ _SESSION是“干净的”,你最终会遇到麻烦。

你应该完全养成假设系统中的每一段数据都是脏的习惯,直到你将其转义为止。请注意,如果您使用的是动态表名,则转义不会对您有所帮助。 从不在查询中使用表名或列名,这些名称曾经在用户附近。各种逃逸机制不会逃脱反叛。如果你有一个准备好的查询:

"SELECT * FROM `:aTable`;"

和aTable来自用户,输入类似

的用户
` WHERE id IN (DELETE FROM user);

可能刚刚删除了所有用户记录。

答案 2 :(得分:1)

$_SESSION变量与$_GET变量相同如果使用不正确,那么问题的答案是肯定的,如果您在会话中存储RAW用户输入(您不应该这样做你需要逃避它。

答案 3 :(得分:1)

会话变量就像任何其他变量一样。那里的数据必须来自某个地方。如果你直接在那里存储一个已发布的变量,那么它基本上就像使用发布的变量一样。

唯一的区别是会话变量在不同的访问中持续存在,而且就此而言。

答案 4 :(得分:1)

一个黄金法则是从不信任用户输入,此外,除非数据源自您(即您的系统),否则它应被视为“用户输入”,这当然包括会话数据。

对于SQL的转义会话数据的条款,您可以并且应该有效地清理sql使用的数据,例如使用mysql_real_escape_string()但是根据会话中包含的数据,我还会根据您的预期验证会话它应该包含。

对于cookie /会话劫持评论你的意思不太清楚,我猜你的意思是你只使用会话来存储数据?在典型的PHP安装会话中,仍然使用cookie纯粹作为指向用户会话的指针。