1

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

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

非常感谢

4

5 回答 5

5

您需要对传递给 sql 查询的每个字符串进行转义,无论其来源如何。

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

于 2012-05-18T00:09:09.260 回答
2

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

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

您绝对应该养成假设系统中的每条数据都是脏的习惯,直到您逃脱它为止。请注意,如果您使用的是动态表名,则转义对您没有帮助。 永远不要在查询中使用曾经靠近用户的任何地方的表名或列名。各种转义机制不会逃脱反引号。如果你有一个准备好的查询说:

"SELECT * FROM `:aTable`;"

和 aTable 来自用户,用户输入类似

` WHERE id IN (DELETE FROM user);

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

于 2012-05-18T00:17:50.447 回答
1

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

于 2012-05-18T00:07:05.753 回答
1

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

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

于 2012-05-18T00:17:49.573 回答
1

一个黄金法则是永远不要相信用户输入,除非数据来自您(即您的系统),否则它应该被视为“用户输入”,这当然包括会话数据。

它涉及为 SQL 转义会话数据,您可以并且应该有效地清理数据以供 sql 使用,例如使用 mysql_real_escape_string() 但根据会话中包含的数据,我还将根据您期望的内容来验证会话应该包含.

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

于 2012-05-18T00:18:00.573 回答