我想知道在 SQL 查询中使用 $_SESSION 数组中的任何内容之前是否需要对其进行转义。
请注意,我没有在我的应用程序中使用 cookie,因为我听说它们可以用于会话劫持(?)
非常感谢
您需要对传递给 sql 查询的每个字符串进行转义,无论其来源如何。
即使它是您从数据库中检索到的数据。
假设 PHP 中尚未发现漏洞,在您允许任何东西接触您的数据库之前,应该使用准备好的语句或 mysql_real_escape_string 对所有内容进行转义。
存储在 $_SESSION 中的数据并不总是干净的。对于多页表单,您可以将用户输入存储在 $_SESSION 中,直到您将其全部写入数据库时的最后一页。如果你养成任何认为 $_SESSION 是“干净”的习惯,你最终会给自己带来麻烦。
您绝对应该养成假设系统中的每条数据都是脏的习惯,直到您逃脱它为止。请注意,如果您使用的是动态表名,则转义对您没有帮助。 永远不要在查询中使用曾经靠近用户的任何地方的表名或列名。各种转义机制不会逃脱反引号。如果你有一个准备好的查询说:
"SELECT * FROM `:aTable`;"
和 aTable 来自用户,用户输入类似
` WHERE id IN (DELETE FROM user);
可能刚刚删除了您的所有用户记录。
如果使用不正确,变量与变量$_SESSION
相同$_GET
,因此您的问题的答案是肯定的,如果您在会话中存储 RAW 用户输入(您不应该这样做),那么您需要转义它。
会话变量就像任何其他变量一样。那里的数据必须来自某个地方。如果您直接将发布的变量存储在那里,那么它基本上就像使用发布的变量一样。
唯一的区别是会话变量在不同的访问中持续存在,仅此而已。
一个黄金法则是永远不要相信用户输入,除非数据来自您(即您的系统),否则它应该被视为“用户输入”,这当然包括会话数据。
它涉及为 SQL 转义会话数据,您可以并且应该有效地清理数据以供 sql 使用,例如使用 mysql_real_escape_string() 但根据会话中包含的数据,我还将根据您期望的内容来验证会话应该包含.
不太清楚您对 cookie / session 劫持评论的意思,我假设您的意思是您只使用 session 来存储数据?在典型的 php 安装会话中,仍然使用 cookie 纯粹作为指向用户会话的指针。