$_SESSION变量是否需要使用mysql_real_escape_string()函数?

5

我在MySQL查询中使用mysql_real_escape_string()函数来处理$_SESSION变量是否合适?理论上,$_SESSION变量不像$_GET$_POST变量那样可以被最终用户修改,对吗?

谢谢 :)

4个回答

4
无论用户是否能够修改数据,您可能仍然需要转义数据,以防万一您需要的数据中包含会破坏 SQL(引号等)的字符。

更好的方法是使用绑定参数,这样您就不必担心这个问题。


谢谢Andrew。我可以问一下“绑定参数”是什么意思吗? - Lyon
这是一种在SQL中声明占位符的方法,然后将数据值“离线”发送到服务器,以便它们不可能被解释为SQL,从而消除了SQL注入的可能性。例如,请参见:http://usphp.com/manual/en/function.mysqli-stmt-bind-param.php - nobody
嗯,我明白了。在你的提醒下,我开始阅读有关绑定参数及其在mysqli中的支持的相关资料。我目前正在使用ext/mysql,我相信它不支持绑定参数。非常感谢。我将在另一个线程上提出关于从mysql迁移到mysqli的查询(例如使用没有准备语句的mysqli)。 - Lyon
根据我的回答,提前转义数据是一个非常糟糕的想法 - 这预设了您知道数据将要去哪里,因此知道使用哪个函数来更改表示方式 - addslashes、htmletntities、mysql_real_escape_string、urlencode... 并不都是做同样的事情。 - symcbean

4

在需要时再进行文本转义/引用/编码。内部表示应尽可能“原始”。


3

您可以通过以下推理自己回答这个问题:

$_SESSION 中的值是否来自用户输入?

如果是,它是否已经过了净化处理?


是的,确实如此。这就是为什么我想知道在将其用于 SQL 语句之前是否应该再次转义它。 - Lyon
那么我就不会再逃避它了,最好能尽可能少地处理并将其插入到数据库中。 - Silvio Donnini
我的看法是:如果你动态生成SQL,通过将数据连接到其中,那么在同一个地方进行数据清洗和连接是很重要的。通过查看连接代码,应该明显地知道你是否正确构建了SQL,并且是否正确地对所有内容进行了清洗。 - Inshallah
嗯,没错。但是我的会话变量是在登录或其他杂项功能中分配的。在脚本的其他部分,会话变量将被使用而不是再次从数据库获取。例如用户ID等。那么我的担忧是,是否理论上可能有人操纵会话变量。谢谢 :) 这些是我在编程时必须采用的做法。 - Lyon

1
理论上,$_SESSION变量不能被最终用户修改。
不是,但数据必须来自某处。
您应该使用适当的方法转义PHP中的任何输出,在离开PHP的时候进行。
C.

谢谢Symcbean :) 我认为“离开PHP”意味着使用mysql或写入文件? 我曾经使用htmlspecialchars,但现在专门使用filter_var和mysql_real_escape_string来处理用户输入。 - Lyon
澄清:为了处理用户输入以供mysql使用,我首先对输入进行净化,然后使用mysql_real_escape_string。因此,在将任何数据输出到客户端浏览器中进行显示时,将使用htmlentities(而不是htmlspecialchars)。 - Lyon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接