清理 PHPSESSID

9
我正在将PHPSESSID通过POST传递到一个PHP页面,并想知道最好的净化输入的方法。使用mysql_real_escape_string是否足够?在处理会话ID时,我需要注意什么(我的意思是,它们只能是字母和数字,对吗?)?
编辑:为了澄清问题,我真正想知道的是:如果有人篡改POST数据,他可以发送恶意字符串作为PHPSESSID吗?当我调用session_id($_GET['PHPSESSID'])时,它会执行一些危险操作吗? 我个人想不出任何情况,但谨慎总比后悔好...
谢谢 nico

你为什么想要对其进行清洗?它(在大多数情况下)是自动生成的。 - fabrik
1
+1 针对良好的安全意识思考。 - Pekka
@abrik:当然它是自动生成的,我只是担心有人可能会欺骗POST数据并利用它做一些恶意的事情。虽然不确定他们能做什么,但这就是我提出问题的原因! - nico
他们甚至可以伪造会话Cookie。 - jduncanator
3个回答

7

很好的想法,但据我所见,没有必要对此输入进行清理。PHPSESSID将传递给session_id()

确实,session_id有一些限制:

取决于会话处理程序,会话ID中不允许所有字符。例如,文件会话处理程序仅允许范围在a-z A-Z 0-9、,(逗号)和 - (减号)之间的字符!

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

我能看到的唯一真正的危险是当您使用自定义会话处理程序(例如连接到数据库的处理程序)时。在这种情况下,您需要对输入进行清理,例如使用mysql_real_escape_string()。但是,这是应该在自定义会话处理程序内部进行的操作。

不用说,如果您在其他上下文中使用会话ID - 比如作为HTML表单中的参数 - 您需要采取特定输出所需的消毒措施(在这种情况下,使用htmlspecialchars())。


4
谢谢Pekka,这正是我所想的,但我认为提出一个愚蠢的问题比犯一个愚蠢的错误要好! :) - nico

2
如果您真的需要通过POST传递会话ID(我真的不知道为什么需要这样做...),并且您知道允许使用哪些字符,我建议使用正则表达式来检查。 mysql_real_escape_string用于数据库输入,需要数据库连接,并且不会对任何内容进行净化,只是转义一些特殊字符。

谢谢您的回答。我正在使用一个依赖于Flash的脚本,我需要传递PHPSESSID,因为Flash不会自动为我执行此操作...这只是一个页面,我不确定PHPSESSID的危险性(如果有的话)。无论如何,该脚本都连接到数据库,所以我想到了mysql_real_escape_string,但我不确定是否需要它。 - nico

1
mysql_real_escape_string足够吗?不对,你应该始终使用适当的方法对数据进行清理以将值写入的位置。只有在将值写入MySQL数据库时才会使用mysql_real_escape_string()。从您的评论中不清楚您到底在做什么。如果您是在PHP中使用curl创建POST,则不需要进行清理(不严格的说-但curl会为您执行此操作),如果您将CURLOPT_POSTFIELDS作为字符串传递,则需要对值进行urlencode。您是否要将该值写入浏览器以使用户可以提交该值?如果是这样,您将使用htmlentities()将该值写入表单字段。还是其他事情?

你关于htmlentities提出了很好的观点,谢谢。正如我对jeroen所说的那样,页面是由Flash调用的,并且会话不会被传递,因此我只是POST PHPSESSID,以便在Flash调用的PHP文件中重新创建会话。(我正在使用JQuery Uploadify http://www.uploadify.com/并使用scriptData参数传递会话ID,正如他们建议的那样)。 - nico

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