2015-05-29 47 views
1

我終於明白了。這不僅僅是我用來執行ExecuteScalar方法的代碼,它主要是執行類的代碼上傳流。這就是所有調用你的代碼。也就是說,有人可以看看執行我的SQL類的代碼是否有錯誤。我仍然無法通過掃描。首先,我將向您展示調用我的代碼,然後調用代碼以及最後執行的代碼的兩個示例,這些代碼由前一篇文章制定並顯示。無法停止SQL注入錯誤

調用代碼有三個參數:

public bool isTamAsp(int aspKey, int fy, string accountCode) 
{ 
    MyParam myParam; 

    string sqlQuery = "select isTamMacom = count(macom_key) FROM hier_fy " + 
     "WHERE hier_key = @aspKey AND fy = @fy AND @accountCode NOT IN (3,4,7,8) AND macom_key IN (select hier_key from lkup_e581_MacomThatRequireTAM) AND is_visible = 1 AND is_active = 1"; 

    QueryContainer Instance = new QueryContainer(sqlQuery); 

    myParam = new MyParam(); 

    myParam.SqlParam = new SqlParameter("@aspKey", Instance.AddParameterType(_DbTypes.Int)); 

    myParam.SqlParam.Value = aspKey; 

    Instance.parameterList.Add(myParam); 

    myParam = new MyParam(); 

    myParam.SqlParam = new SqlParameter("@fy", Instance.AddParameterType(_DbTypes.Int)); 

    myParam.SqlParam.Value = fy; 

    Instance.parameterList.Add(myParam); 

    myParam = new MyParam(); 

    myParam.SqlParam = new SqlParameter("@accountCode", Instance.AddParameterType(_DbTypes._string)); 

    myParam.SqlParam.Value = accountCode; 

    Instance.parameterList.Add(myParam); 

    if (Convert.ToInt32(ExecuteScaler(Instance)) < 1) 
     return false; 

    return true; 
} 

調用代碼不帶參數:

public long GetMarinesUploadNextUploadKey() 
{ 
    string query = "SELECT MAX(upload_key) FROM temp_auth_usmc_upload"; 

    QueryContainer Instance = new QueryContainer(query); 

    string result = Convert.ToString(ExecuteScaler(Instance)); 
    if (string.IsNullOrEmpty(result)) 
     return 1; 
    else 
     return Convert.ToInt64(result) + 1; 
} 

代號叫我前面的代碼有三個參數:

public bool isTamAsp(int aspKey, int fy, string accountCode) 
{ 
    return e581provider.isTamAsp(aspKey, fy, accountCode); 
} 

方法調用SQL執行我的代碼:

DbCommand command = _provider.CreateCommand(); 

command.Connection = _connection; 
{ 
    command.CommandText = Instance.Query; 
    command.CommandType = CommandType.Text; 

    if (Instance.parameterList.Count > 0) 
    { 
     foreach (var p in Instance.parameterList) 
     { 
      command.Parameters.Add(p.SqlParam); 
     } 
    } 

    if (_useTransaction) { command.Transaction = _transaction; } 

    try 
    { 
     returnValue = command.ExecuteScalar(); 
    } 

我的班級包含SQL字符串和CMD參數列表

public enum _DbTypes 
{ 
    Int = 1, _string = 2, _long = 3, _bool = 4, _DateTime = 5, 
    _decimal = 6, _float = 7, _short = 8, _bite = 9 
} 

public class MyParam 
{ 
    public SqlParameter SqlParam { get; set; } 
} 
/// <summary> 
/// Summary description for QueryContainer SGH 
/// </summary> 
public class QueryContainer 
{ 

    string _query; 

    public List<MyParam> parameterList = new List<MyParam>(); 

    public QueryContainer(string query) { _query = query; } 

    public SqlDbType AddParameterType(_DbTypes id) 
    { 
     switch (id) 
     { 
      case _DbTypes.Int: 
       return (SqlDbType)Enum.Parse(typeof(SqlDbType), "int", true); 
      case _DbTypes._string: 
       return (SqlDbType)Enum.Parse(typeof(SqlDbType), "NVarChar", true); 
      case _DbTypes._long: 
       return (SqlDbType)Enum.Parse(typeof(SqlDbType), "SqlDbType.BigInt", true); 
      case _DbTypes._bool: 
       return (SqlDbType)Enum.Parse(typeof(SqlDbType), "SqlDbType.Bit", true); 
     } 

     return SqlDbType.VarChar; 

    } 

    public string Query 
    { 
     get 
     { 
      return _query; 
     } 

     set { _query = value; } 
    } 
} 
+0

',_bite = 9' nom nom nom – asawyer

+1

我不明白這一點。你在這裏的代碼是**不**易受到SQL注入攻擊。我看到的最糟糕的事情是'GetMarinesUploadNextUploadKey()'方法上的爭用條件(您應該使用標識列或序列)。代碼還會經歷一些不必要的工作,爲現有類型生成它自己的包裝,並且您爲該工作獲得的所有內容都比您已經擁有的更復雜。 –

+0

什麼叫第一種方法? 「accountCode」可能包含SQL注入攻擊嗎?它被放入一個最終被執行的字符串中;也許這就是爲什麼你會遇到漏洞? – johnjps111

回答

0

我沒有看到在該代碼中的漏洞,但我有一個想法是什麼掃描可能要求。問題可能在於,這段代碼讓開發人員很容易忽略班級中的parameterList集合。如果我是組織中尚未發現Sql注入的新開發人員,我會試圖忽略所有複雜的查詢參數,並在設置Query屬性之前僅使用字符串連接。

相反的一類包裝這個的,就是我更習慣看到的是,有這樣的簽名了一個方法:

IEnumerable<T> GetData<T>(string query, IEnumerable<Sqlparameter> parameters) 

...或方法簽名的某個置換可能使用數組或列表而不是IEnumerable。這迫使下游開發人員處理該方法的參數parameters。它們不能忽略它,因此使用快速,懶惰的字符串串聯調用來將用戶提供的數據替換爲查詢的誘惑力減少了。

+0

我有一個擔心的是,如果查詢字符串沒有參數可以顯示爲一個發現? –