既然是discuz6,肯定是指php版本了.但是一直是用c#在做程序,想必这里志同道合者会比较多.
还是cookie的问题.好象nt下cookie的设置与php的又不同了,但大概思路都差不多吧应该.只是个猜测.
我的目的是完全自主控制discuz的cookie设置,否则也不会在办公室加班到这么晚.
事先说一句:我还没实现呢.
d6的登陆原理,我所知道的大概是这个样子:
检测晚用户名密码后,dsetcookie,并对$value做authcode加密.
authcode加密函数的工作原理是:将authkey做md5加密然后再把要加密的字串与加密后的key连接后再做一次md5加密,然后取前8位放到要加密的内容之前.然后用ascii开始打散,然后将打散的字串恢复成string之后再做一次base64加密,最后把=号都replace了.具体代码我不贴了.
解密时,将base64码转回来,然后将打散过程重复一遍,就回到8位md5+string的状态,然后取前8位.
下面是c#改写的authcode函数,网上的代码我所搜到的都不能正常运行,是因为decode64的时候,会对asc码有不正确的转换,某些双字节被认成单个的汉字,造成字符串数量判断不正确,所以无法正确转码.以下是我改进的代码,照着authcode写的
///str 要处理的字串
///ENCODE 判断加密或者解密
private string DiscuzEncode(string str, bool ENCODE)
{
string key = md5("1cf91aNAqrlWXaAE");
int key_length = key.Length;
byte[] rndkey = new byte[256];
int[] box = new int[256];
string result = "";
//以下为打散过程
byte[] keyBytes = Encoding.ASCII.GetBytes(key.ToCharArray());
for (int i = 0; i < 256; i++)
{
rndkey[i] = keyBytes[i % key_length];
box[i] = i;
}
for (int i = 0, j = 0; i < 256; i++)
{
j = (j + box[i] + rndkey[i]) % 256;
int tmp = box[i];
box[i] = box[j];
box[j] = tmp;
}
byte[] strBytes =
ENCODE ?
Encoding.ASCII.GetBytes((md5(str + key).Substring(0, 8) + str).ToCharArray()) //加密字串算法 并转换为char[]
:
Convert.FromBase64String((str.Length % 4 == 0) ? str : (str + "====".Substring(str.Length % 4))); //补齐base64
byte[] resultBytes = new byte[strBytes.Length];
for (int a = 0, i = 0, j = 0; i < strBytes.Length; i++)
{
a = (a + 1) % 256;
j = (j + box[a]) % 256;
int tmp = box[a];
box[a] = box[j];
box[j] = tmp;
resultBytes[i] = (byte)(strBytes[i] ^ (box[(box[a] + box[j]) % 256]));
}
char[] resultChar = ASCIIEncoding.Default.GetChars(resultBytes);
foreach (char c in resultChar)
{
result += c;
}
if (ENCODE)
{
return Convert.ToBase64String(Encoding.Default.GetBytes(result));
}
else
{
return result.Substring(8);
}
}
所做的改进无非是在转换的时候不以string的形态出现,一直用byte[].
这个最后生成的代码应该是一段base64代码.
在d6官网中,cookie的auth段代码如下
cdb_auth
zHm7lonB4aS00zUgzIk%2FtdVjXHECRP4KD98hg%2FRoGrqYwhJ12M031XDpQMJeUgMu
discuz.net/
1536
1786759808
30634227
3156944288
29899972
以下的代码是否就是加密的那段代码?
zHm7lonB4aS00zUgzIk%2FtdVjXHECRP4KD98hg%2FRoGrqYwhJ12M031XDpQMJeUgMu
但这不是一段base64代码.我现在卡在这里了,不知道这段代码又是从哪里来的.还是我根本就没弄明白cookie.
请各位不吝回贴,告诉我怎么具体来读取处理cookie数据.别惊讶,我真的水平很一般,连怎么读取都是一盆糨糊.request.cookies["cdb_auth"]?怎么读取不出来呢?