認証中のASCII以外のユーザー名またはパスワードの問題

1388 ワード

実際の環境では、一部のユーザーがASCIIコードではないユーザ名またはパスワードを使っています.ここで2つの問題が発生しました.
  • は、非NLA検証において、これらの文字列をUnicodeに正常に変換して送信しないと、RDPプロトコル検証中に失敗する.Javascriptでこのことをしたので、この点に特に注意しなければなりません.JavascriptはUTF-16を使っています.この場合、String.prototype.charCodeAt()が取得した値はASCIIの範囲内か、それともこの範囲外かを区別して、正しい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;
    }
    
  • はNRA検証のもう一つがあり、この場合問題を引き起こす可能性があるのはCharUpperWというタイプの関数です.NLA検証では、プロトコル要件(可能性があります.既存のオープンソースコードから推定されます)が、ユーザ名とパスワードをフル大文字の文字列に変換するためです.問題は、Windows以外のシステムでこれを達成するのは難しいということです.FreeeRDPの中にこれに関するIssueがあります.最後に見つけられるソリューションは実はWineというプロジェクトから得られたものです.Windows以外のシステムでCharUpperWを達成するには、Wineの同じ機能の関数が必要です.また、自動生成Mapを導入する必要があります.Mapファイルの位置はcasemap.cです.大文字にしか関心がない人にとっては、wine_を導入すればいいです.casemap_up perというMapでいいです.