消毒PHPSESSID

时间:2010-09-17 13:41:14

标签: php session sanitization

我将PHPSESSID传递给PHP页面(通过POST),我想知道什么是消毒输入的最佳方法。 mysql_real_escape_string会满足吗?处理会话ID时我应该考虑一些特殊问题(我的意思是,它们只能是字母和数字吗?)?

修改 为了澄清这个问题,我真正想知道的是:如果有人篡改POST数据,他是否可以发送一个恶意字符串作为PHPSESSID,当我打电话给session_id($_GET['PHPSESSID'])时会发生一些令人讨厌的事情? 我个人想不出任何东西,但比抱歉更安全......

由于

尼科

3 个答案:

答案 0 :(得分:7)

良好的思考,但据我所知,没有必要对这一输入进行消毒。 PHPSESSID将传递给session_id()

session_id确实有some limitations:

  

根据会话处理程序,会话ID中不允许所有字符。例如,文件会话处理程序仅允许a-z A-Z 0-9,(逗号)和 - (减号)范围内的字符!

但是session_id()应该通过错误消息来处理与这些规则的偏差。 (您可能希望捕获该错误消息并在出错时终止脚本。)

我能看到的唯一真正的危险是当你使用自定义会话处理程序时,例如连接到数据库。在这种情况下,您 必须清理输入,例如使用mysql_real_escape_string()。但是,这应该发生在里面自定义会话处理程序。

不言而喻,如果您在其他某些环境中使用会话ID(例如,作为HTML表单中的参数),您需要采取特定输出所需的卫生措施(在这种情况下,{{1} })。

答案 1 :(得分:2)

如果你真的需要通过POST传递一个会话ID(不知道为什么真的......)并且你知道你想要允许哪些字符,我会使用正则表达式来检查它。

mysql_real_escape_string用于数据库输入,需要数据库连接,并且不会清理任何内容,只是转义一些特殊字符。

答案 2 :(得分:1)

  

mysql_real_escape_string会满足吗?

错误。您应始终使用适当的方法将数据清理到要写入值的位置。如果/当您将值写入MySQL数据库时,您只使用mysql_real_escape_string()。

从你的评论中不清楚你究竟在做什么。你的意思是你在PHP中使用curl来创建POST吗?如果是这样,那么如果你将CURLOPT_POSTFIELDS作为一个数组传递,则不需要进行清理(不是严格正确 - 但curl会为你做) - 但如果你将CURLOPT_POSTFIELDS作为一个字符串传递,你需要对该值进行urlencode。

您是否正在将值写入浏览器,以便用户可以提交值?在这种情况下,您将使用htmlentities()将值写入表单字段。

还有别的吗?