實(shí)際的環(huán)境中罚渐,有些用戶使用了非ASCII碼的用戶名或者密碼,這里引發(fā)了兩個(gè)問題:
- 在非NLA驗(yàn)證中,如果沒有把這些字符串正常的轉(zhuǎn)換成Unicode并發(fā)送出去,會(huì)導(dǎo)致在RDP協(xié)議驗(yàn)證過程中失敗件甥。因?yàn)槭窃贘avascript端做的這個(gè)事情,所以要格外注意這一點(diǎn)言缤。Javascript使用的是UTF-16 (也就是Windows里所謂的Unicode)嚼蚀。這種情況下禁灼,要注意區(qū)分
String.prototype.charCodeAt()
獲取到的值是 ASCII 范圍內(nèi)的管挟,還是超出這個(gè)范圍的,以組成正確的Windows可讀的Unicode的字符串弄捕。
示例:
function rdp_write_unicode_string(stream, string, len) {
var j=0, i=0;
while(i < len) {
var code = string.charCodeAt(j++);
if (code > 256) {
code &= 0xffff;
stream.data[stream.p+i] = code & 0xff;
i++;
stream.data[stream.p+i] = (code>>8) & 0xff;
i++;
}
else {
stream.data[stream.p+i] = code;
i++;
stream.data[stream.p+i] = 0;
i++;
}
}
stream.data[stream.p+i] = 0;
i++;
stream.data[stream.p+i] = 0;
i++;
stream.p += len + 2;
}
- 還有一種是NLA驗(yàn)證僻孝,這種情況下有可能引起問題的是CharUpperW這個(gè)類型的函數(shù)导帝。因?yàn)樵贜LA驗(yàn)證中,協(xié)議要求(可能如此穿铆,根據(jù)現(xiàn)有的開源代碼進(jìn)行的推斷)把用戶名和密碼轉(zhuǎn)換成全大寫的字符串您单。問題在于,在非Windows系統(tǒng)中想要做到這點(diǎn)(支持非ASCII碼)是比較困難的荞雏。FreeRDP中有個(gè)關(guān)于這個(gè)的Issue虐秦。最后能找到的解決方案實(shí)際上是從Wine這個(gè)項(xiàng)目中得到的。在非Windows系統(tǒng)中想要做到CharUpperW凤优,需要使用Wine的相同的功能的函數(shù)悦陋。并且,需要引入一個(gè)自動(dòng)生成的Map筑辨,Map文件的位置是casemap.c俺驶。 對于只關(guān)心轉(zhuǎn)化到大寫的人來說,只要引入wine_casemap_upper 這個(gè)Map就可以了棍辕。