|
■No72974 (キム さん) に返信
> ■No72964 (mo さん) に返信
>
> 横槍失礼します。
>
> SQL文を作るのに文字列連結を使っているようですが、これは危険なので避けたほうがよいです。
> テキストボックスに悪意を持った入力を行うと、不正にデータを入手したり削除したり出来てしまう可能性があります。
> また、ログイン画面に応用すると、パスワード無しで簡単にログインすることも出来てしまいます。
> 悪意が無くても、誤入力や SQLでは特別な意味を持つ文字を知らずに入力してしまう場合もあり、思わぬ結果を招くことになります。
> SQLインジェクションで検索すれば、具体例が沢山出てきます。
>
> ユーザーが入力したパラメーターは、文字列連結ではなく、静的プレースホルダーによってバインドした方がよいです。
> .NETであれば、System.Data.SqlClient.SqlParameter を使えばよいです。
> SqlCommand.Prepare の例なども理解に役立つと思います。
返信が遅くなってすみません。
http://www.websec-room.com/2013/03/03/365
こちらのサイトに記載していたログインコードを開発環境に合わせる様にコードを変更することで、%を入力しても担当者名を全て表示されないように出来ました。
ログインは本当に必要なのか考えてから作成しようと思っています。
キムさん、PANG2さん、Hongliangさん、ご協力有難うございます。
以下が修正したコードです。
Private Sub TextBox1_Validating(sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
If TextBox1.Text.Length = 0 Then
Label1.Text = ""
Exit Sub
End If
Dim count As Integer = 0
Dim connectionString As String = "Data Source=PC名;Initial Catalog=テーブル;Integrated Security=True"
Dim con As SqlConnection = New SqlConnection(connectionString)
Dim sql As String = "SELECT COUNT(*) AS CNT FROM 担当者一覧 WHERE 担当者コード = @code"
Dim code As String = Me.TextBox1.Text
Dim command As SqlCommand = New SqlCommand(sql, con)
Dim pcode As SqlParameter = New SqlParameter("@code", code)
command.Parameters.Add(pcode)
con.Open()
Dim reader As SqlDataReader = command.ExecuteReader()
If reader.HasRows Then
While reader.Read()
count = CType(reader("CNT"), Integer)
End While
End If
reader.Close()
con.Close()
If count = 1 Then
Try
Using con2 As New SqlConnection
con2.ConnectionString = "Data Source=PC名;Initial Catalog=テーブル名;Integrated Security=True"
con2.Open()
Dim HC As System.Data.SqlClient.SqlCommand = con2.CreateCommand()
HC.CommandText = "SELECT * FROM 担当者一覧 WHERE (担当者コード LIKE '" & TextBox1.Text & "')"
Dim CR As System.Data.SqlClient.SqlDataReader = HC.ExecuteReader()
HC.Dispose()
Dim stP As String = String.Empty
While (CR.Read())
stP &= CR("担当者名").ToString()
End While
CR.Close()
Label1.Text = stP
End Using
Catch ex As Exception
End Try
Else
MessageBox.Show("該当する得意先がありません。再度入力して下さい。", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
TextBox1.Select()
TextBox1.SelectAll()
End If
End Sub
|