我想知道在我在SQL查询中使用它之前是否需要转义$ _SESSION数组中的任何内容。
请注意,我在我的应用程序中不使用cookie,因为我听说它们可能用于会话劫持(?)
非常感谢
答案 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纯粹作为指向用户会话的指针。