第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

參數(shù)化查詢與SQL注入

參數(shù)化查詢與SQL注入

紫衣仙女 2019-11-20 11:03:55
我是Asp.net的新手,我剛剛開始使用課程。最近,我創(chuàng)建了一個類,該類將為我處理大多數(shù)SQL查詢,從而不必在所有文件上重復(fù)創(chuàng)建新連接。我創(chuàng)建的方法之一將SQL查詢作為參數(shù)并返回結(jié)果。我知道我應(yīng)該使用參數(shù)化查詢來避免SQL注入。我的問題是,當(dāng)我將查詢作為字符串參數(shù)傳遞時,該怎么辦?例如,這是我要調(diào)用的方法:public static DataTable SqlDataTable(string sql){    using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))    {        SqlCommand cmd = new SqlCommand(sql, conn);        cmd.Connection.Open();        DataTable TempTable = new DataTable();        TempTable.Load(cmd.ExecuteReader());        return TempTable;    }}因此,從另一個文件中,我想使用這種方法:DataTable dt = new DataTable();dt = SqlComm.SqlDataTable("SELECT * FROM Users WHERE UserName='" + login.Text  + "' and Password='" + password.Text + "'");if (dt.Rows.Count > 0){   // do something if the query returns rows}這行得通,但仍然容易受到注射的侵害吧?有沒有辦法將變量作為參數(shù)傳遞給字符串?我知道如果我為查詢創(chuàng)建一個新的SQLCommand對象并使用Parameters.AddWithValue,則可以執(zhí)行此操作,但是我希望所有SQL命令都位于單獨的類中。
查看完整描述

3 回答

?
呼喚遠(yuǎn)方

TA貢獻1856條經(jīng)驗 獲得超11個贊

這行得通,但仍然容易受到注射的侵害吧?


是的,您的代碼非常容易受到SQL注入的攻擊。


我知道我應(yīng)該使用參數(shù)化查詢來避免SQL注入。


哦,是的。


我的問題是,當(dāng)我將查詢作為字符串參數(shù)傳遞時,該怎么辦?


您根本不應(yīng)該將查詢作為字符串參數(shù)傳遞。相反,您應(yīng)該將查詢作為包含占位符和這些占位符值的字符串參數(shù)傳遞:


public static DataTable SqlDataTable(string sql, IDictionary<string, object> values)

{

    using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))

    using (SqlCommand cmd = conn.CreateCommand())

    {

        conn.Open();

        cmd.CommandText = sql;

        foreach (KeyValuePair<string, object> item in values)

        {

            cmd.Parameters.AddWithValue("@" + item.Key, item.Value);

        }


        DataTable table = new DataTable();

        using (var reader = cmd.ExecuteReader())

        {

            table.Load(reader);

            return table;

        }

    }

}

然后像這樣使用您的函數(shù):


DataTable dt = SqlComm.SqlDataTable(

    "SELECT * FROM Users WHERE UserName = @UserName AND Password = @Password",

    new Dictionary<string, object>

    {

        { "UserName", login.Text },

        { "Password", password.Text },

    }

);


if (dt.Rows.Count > 0)

{

   // do something if the query returns rows

}


查看完整回答
反對 回復(fù) 2019-11-20
?
楊魅力

TA貢獻1811條經(jīng)驗 獲得超6個贊

您走在正確的道路上,我實際上也已經(jīng)完成了您在尋找自己的事情。但是,我不僅傳遞字符串給函數(shù),還傳遞了SQL Command對象...這樣,您可以正確構(gòu)建所有命令和參數(shù),然后說...在這里,運行它,準(zhǔn)備出發(fā)了。就像是


public static DataTable SqlDataTable(SqlCommand cmd)

{

    using (SqlConnection conn = new SqlConnection(DatabaseConnectionString))

    {  

        cmd.Connection = conn;   // store your connection to the command object..

        cmd.Connection.Open();

        DataTable TempTable = new DataTable();

        TempTable.Load(cmd.ExecuteReader());

        return TempTable;

    }

}


public DataTable GetMyCustomers(string likeName)

{

    SqlCommand cmd = new SqlCommand();

    cmd.CommandText = "select * from SomeTable where LastName like "@someParm%";

    cmd.Parameters.Add( "whateverParm", likeName );  // don't have SQL with me now, guessing syntax


    // so now your SQL Command is all built with parameters and ready to go.

    return SqlDataTable( cmd );

}


查看完整回答
反對 回復(fù) 2019-11-20
  • 3 回答
  • 0 關(guān)注
  • 656 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號