在 PHP Web 应用程序中,我使用会话 ID 作为文件名。在某个时刻,这些文件被删除,代码如下
unlink('tmp/'.session_id());
我知道用户可以更改他/她的会话 ID。因此我想知道会话ID是否可以更改为“/../../etc/passwd”之类的东西。
我现在的问题是,如果这种“黑客攻击”是可能的,以及如何最好地保护我的代码。
提前感谢您的回答!
评论:我知道用户劫持其他用户会话的危险和预防方法,目前这不是我的问题。
除非您的设置非常糟糕,否则用户将永远无法直接更改他的会话 ID,因为这不应该是直接参数 - 它应该用于验证它是否存在,但永远不要创建基于任意会话的在那个名字上。
但是,如果您的系统不是这种情况,建议对以下内容进行清理:preg_replace("#([^0-9a-f]+)#i","",session_id());
您可以使用 Regex 替换所有坏字符:
$sess = session_id();
$clean_sess = preg_replace("/[^a-zA-Z0-9]/Uis", "", $sess);
unlink('tmp/'.$clean_sess);