用暴力攻擊法找出長度不足的Oracle欄位
2 |
搞破解的人大概都知道什麼叫暴力攻擊法吧!
今天被一個ORACLE Error搞得極度火大,利用OracleCommand INSERT資料,ORACLE冷冷地說: "ORA-01401 inserted value too large for column",很好,給的字串太長? 為何不說哪個欄位有問題? 我用OracleParamer沒法直接轉出SQL語法去SQLPLUS驗證,而且總共有三四十個欄位耶~~ 你不要光搖頭!! 你倒是說呀!! 你給我說呀!!(猛力搖晃肩膀)
網路上查到ORACLE 10g會比較親切地指出問題出在哪一個欄位,雖然現在用的是9i,只要花少少幾百萬就可以讓ORACLE更親切耶! 真是太超值! 太划算了... orz
可想而知,解決這問題的正途是人工逐一檢查比對各欄位的長度。不過今天在盛怒之下,我做了一件不理性的事,寫了一小段暴力攻擊法,逐一縮短字串長度,直到指令執行成功為止,如此就可以知道那一個欄位長度要多短才會過關。
不過,這裡有幾個假設:
1.所有欄位中只有一個超出長度
2.你想知道明確的值位長度上限(不然直接將欄位設成空字串會比較有效率)
3.使用的ORACLE資料庫是測試開發性質,經得起你催殘
(換句話說,使用風險自負,不管被DBA譙、被老板罵、被公司開除都與我無關)
4.你知道將catch Block當成正常流程極無效率,會這麼做只是為了洩憤
5.使用完畢後應前往寺廟為自己的嗔怒業障懺悔贖罪
適度的宣泄情緒有助於程式開發人員的心理健康,想了想,還是把這段跑起來很爽的Code跟大家分享一下,阿彌陀佛!
//Log Command Error
System.Diagnostics.Debug.WriteLine("Command Error!!");
System.Diagnostics.Debug.WriteLine("CommandText=" + cmd.CommandText);
foreach (OracleParameter p in cmd.Parameters)
{
System.Diagnostics.Debug.WriteLine(
string.Format("Parameter[{0}](Type:{1})(Len:{2})={3}",
p.ParameterName,
p.DbType.ToString(),
p.Value.ToString().Length, p.Value.ToString())
);
}
//Brute Force Attack
(Warning: Never run these unless you know what you are doing)
using (OracleConnection bfcn = new OracleConnection(_cnnString))
{
bfcn.Open();
cmd.Connection = bfcn;
foreach (OracleParameter p in cmd.Parameters)
{
if (p.OracleType == OracleType.VarChar ||
p.OracleType == OracleType.NVarChar)
{
string v = p.Value.ToString();
string origVal = v;
for (int i = v.Length - 1; i >= 0; i--)
{
p.Value = v.Substring(0, i);
try
{
cmd.ExecuteNonQuery();
System.Diagnostics.Debug.WriteLine("Hallelujah");
System.Diagnostics.Debug.WriteLine(
string.Format("Parameter[{0}]-Len[{1}]",
p.ParameterName,
i));
break;
}
catch
{
}
}
p.Value = origVal;
}
}
}
Comments
# by 榮
可以請妳教我破解日盛證券的spe檔鎖碼嗎?多少費用?winhsu888@gmail.com 謝謝
# by Joy
是否可請破解日盛證券SPE檔的密碼? 報價多少? 我的MAIL: kimberly2008@livemail.tw 謝謝您