我刚注意到我的主持人开始使用Suhosin Hardening,我对此并不熟悉,并且我的应用程序存在重大问题,主要是在会话中。
会话正在以下列格式存储:
_EzyqHpPJqmQbSpRmXAJTxuFq980aNQlc3XAiRkWxlZQ9B0fnV...
我不介意,但它也破坏了我的应用程序,我需要一种解码加密的方法,因为它不会让我因为这个而登录我的应用程序。
我有一个函数来反序列化会话数据,不确定我在哪里拿到但是在这里:
public function unserialize_session_data($data)
{
$variables = array();
$a = preg_split( "/(\w+)\|/", $serialized_string, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE );
for( $i = 0; $i < count( $a ); $i = $i+2 )
{
$variables[$a[$i]] = unserialize( $a[$i+1] );
}
return($variables);
}
它给出了该函数的偏移错误,因为会话数据不是它期望的格式,这就是为什么我想知道是否有人知道解密/解码上述丑陋的suhosin数据以将其呈现在其原始中的方法格式?
- 编辑 -
发布使用上述反序列化功能的功能
/***********************************************************************
# Get Session Data of a certain session id
# --------------------------------------
# This function will retrieve all session information related to a certain session id from
# the database, after that it unserializes the data and returns an array of data.
#
# @return array (Containing Session Data)
***********************************************************************/
public function get_session_data($session_id)
{
if (isset($session_id) && $session_id != "")
{
$sql = mysql_query("SELECT ses_value FROM sessions WHERE (ses_id = '$session_id');") or die ("MySQL Error : <b>" . mysql_error() . "</b><br />");
if (mysql_num_rows($sql) > 0)
{
$res = mysql_fetch_assoc($sql);
$res = $this->unserialize_session_data($res['ses_value']);
return $res;
}
}
}
提前致谢!
答案 0 :(得分:3)
我认为Suhosin的解密和加密是透明的吗?
Parameter Description
Encrypt Turns on the transparent encryption
无论如何,生成加密密钥的方式是:
cryptkey + user agent + document root + IP octets
所以:
12345Mozilla/5.0 (X11; Linux x86_64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2/var/www127.0.0.1
变量在没有分隔符的情况下连接在一起。
如果由于某种原因,cryptkey字符串为NULL,则Suhosin将默认为值“D3F4UL7”。
一旦构建,使用SHA256对字符串进行哈希处理,结果用于生成256位rijndael加密密钥。
答案 1 :(得分:1)
如果您需要恢复存储在会话中的数据,您可以使用此处提供的工具:
http://www.idontplaydarts.com/2011/11/decrypting-suhosin-sessions-and-cookies/
在PHP中没有解密Suhosin数据的本地方法 - 最简单的方法是在php.ini文件中使用session.encrypt = 0关闭加密。
答案 2 :(得分:0)
您可以使用ini_set()
关闭其使用的加密吗?
您需要指定要用于加密会话数据的确切密钥(页面指示可以通过ini_set()
执行此操作)以解密它。完成后,使用密钥解密它应该是可能的(我不确定它正在使用什么加密系统)。