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--
「bobby」は無効なユーザー名です。
1=1 は常に true であり、残りの SQL ステートメントはコメントアウトされているため、アプリは偽のユーザー名でログインすると思いました。
しかし、「ログに記録されていません」と表示されます。
ありがとう