Monday, December 31, 2007 - 文章

用暴力攻擊法找出長度不足的Oracle欄位

搞破解的人大概都知道什麼叫暴力攻擊法吧!

今天被一個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;
        }
    }
}

搜尋

Go

<December 2007>
SunMonTueWedThuFriSat
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345
 
RSS
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


BlogLook Score and Rank

Syndication