我试图在调用session_start()
之前检查PHPSESSID的值。我不喜欢这些消息。 session_start(): The session id is too long or contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in
非法字符可以通过简单的正则表达式preg_replace("/[^a-zA-Z0-9]/", "", $input_lines);
但是如何检查最大长度?在我的本地XAMPP安装中,我得到一个26个字符的PHPSESSID,但在部署服务器上我得到一个32个字符的PHPSESSID。
PHP manual只是对允许的字符说了些什么,但注意到了长度。
根据会话处理程序,会话ID中不允许所有字符。例如,文件会话处理程序仅允许a-z A-Z 0-9,(逗号)和 - (减号)范围内的字符!
修改 在这种情况下,最大的问题是,即使禁用了error_reporting,也会发出警告。该错误还会抛出文件位置的路径。这是不必要的!
答案 0 :(得分:1)
会话ID的确切特征取决于您使用的session handler。
在您的生产环境中,您可能有一个不同的会话处理程序(例如,一个添加加密,或将会话infor存储在不同的地方,需要不同的密钥)。此外,最大长度并不是说每个id应该是那个确切的长度,所以即使使用相同的会话处理程序,不同的id 也可以有效。
据我所知,没有办法'询问'会话处理程序id是有效的还是它支持的特性,所以我个人不会验证id,只是尝试加载会话并捕获消息如果失败,则可以在没有会话的情况下继续,或者正常关闭请求。
如果您仍然认为自己检查会话ID是个好主意,可以查看this question,其中人们试图通过应用正则表达式来解决问题。
答案 1 :(得分:1)
正如我在评论中所说,最好不要做你最初想做的事情。相反,尝试转动警告。
您可以配置php打印和/或记录的错误或警告:PHP Error reporting,PHP display errors,PHP Log errors
答案 2 :(得分:0)
我完全赞同@Misch诊断,但我认为解决方案必须是其他的。在检测到无效的PHPSESSID之后,只需执行die()脚本。当您受到攻击或安全测试(模拟攻击)时,无需输出任何内容。顺序应为:
check a valid PHPSESSID cookie
if it is not valid {
set a valid arbitrary new PHPSESSID cookie // this is a courtesy, and a sign that you manage the issue
die()
}
start the session
对于长度问题,正如所说的那样,不同的处理程序可能存在不同的值,只需在有效会话中观察您的值并使用该长度。
答案 3 :(得分:0)
您可以在php.ini文件中指定session.sid_length=...
。通过phpinfo();
检查正在使用哪个ini文件。
进行更改后,请不要忘记重新启动Apache并清除要测试的站点上的cookie。