我正在學習SQL注入並希望嘗試一種。SQL注入存儲過程
我創建了一個web應用程序並創建了一個存儲過程來訪問我的數據庫的一些信息。
這是我的存儲過程,並在ASP .NET應用程序
Create Procedure spTest
(
@UserName varchar(20),
@UserPwd varchar(max)
)
AS
Begin
Declare @sql varchar(max)
set @sql = 'select UserName,UserPwd from Users where UserName='''+ @UserName+ '''
And UserPwd = '''+ @UserPwd + ''' '
Exec(@sql)
End
C#代碼代碼:
string connString = System.Configuration.ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
using (SqlConnection con = new SqlConnection(connString))
{
SqlCommand cmd = new SqlCommand("spTest",con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@UserName",txtUserName.Text);
cmd.Parameters.AddWithValue("@UserPwd", txtPassword.Text);
con.Open();
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
if (dr.HasRows)
{
labelLogin.Text = "Logged in";
}
else
{
labelLogin.Text = "Not logged in";
}
在文本框中輸入用戶名,我輸入bobby' or 1=1--
「鮑比「是一個無效的用戶名。
現在,我認爲應用程序會用假用戶名登錄,因爲1 = 1總是爲true,而其餘的SQL語句被註釋掉了。
但是,它顯示「Not logged」我在這裏丟失了什麼?
謝謝
參數化查詢 - 就像您在此處構建的那樣 - 對其值進行編碼以防止SQL注入。如果您對編寫可注入查詢非常認真,則必須使用StringBuilder或串聯將值直接寫入查詢中。 – GalacticCowboy
如何用存儲過程做到這一點?我一直在閱讀,存儲過程不一定是從sql注入安全的,除非你使用參數化查詢。但是,我如何在代碼中使用它?我無法找到任何地方如何使用沒有參數的存儲過程。我谷歌「存儲過程SQL注入」,但我發現所有教程解釋了創建存儲過程的錯誤方式,但不是如何在asp.net代碼中使用。 – coffeeak
我用sql語句做了它,但我不知道如何用存儲過程來做到這一點。 – coffeeak