投稿者 社会人  (社会人) 投稿日時 2014/6/10 17:21:40
>魔界の仮面弁士さん

返事が遅くなりすみません。
自分の予想より話が難しくなっている為、確認したい事がいくつかあります。

>SQLの脆弱性について
指摘通りに、Textbox1に「' OR 1 = 1 -- 」、Textbox2はデータベース上に無い値を入力してもログイン出来るようになっていました。
ネットでいくつか調べてみると対策方法などが乗っていましたので、IFで両方のTextboxに「'」から始まる場合はSQLServerに参照せずにエラーメッセージの表示を考えています。
下のコードだと、片方に「' OR 1 = 1 --」を入力してもログイン失敗するようになりました。

※一旦、6月5日のコードに戻して修正しています。

Imports System.Data.SqlClient

Public Class FmLogin
    Dim FLG As Integer = 0
    Const ConnectString As String = "Data Source=user;Initial Catalog=データベースシステム;Integrated Security=True"

    Private Sub btnGo_Click(sender As System.Object, e As System.EventArgs) Handles btnGo.Click

        If CheckUser(TextBox1.Text.Trim, TextBox2.Text.Trim) Then
            Me.Hide()
            Dim Main As New FmMain
            Main.ShowDialog(Me)
            Me.Show()
            Me.Close()
        Else
            If FLG = 1 Then
                MsgBox("その入力方法は違法です。")
            Else
                MsgBox("ID,パスワードが一致しません")
            End If
        End If
    End Sub

    Private Function CheckUser(id As String, pass As StringAs Boolean
        Dim RESULT As Integer = 0
        Dim SQL As String = "SELECT COUNT(ユーザーID) FROM ユーザー情報" _
                                & " WHERE ユーザーID='" & id & "' AND パスワード='" & pass & "'"
        If 0 <= TextBox1.Text.IndexOf("'"Or 0 <= TextBox2.Text.IndexOf("'"Then
            FLG = 1
        Else
            Using conn As New SqlConnection(ConnectString)
                Dim CMD As New SqlCommand(SQL, conn)
                Try
                    conn.Open()
                    RESULT = Convert.ToInt32(CMD.ExecuteScalar())
                Catch ex As Exception
                    MsgBox(ex.Message)
                End Try
            End Using
        End If

        Return RESULT <> 0
    End Function

    Private Sub btnQuit_Click(sender As System.Object, e As System.EventArgs) Handles btnQuit.Click
        Me.Close()
    End Sub
End Class


>Sub Mainをスタートアップした後にログインフォームを呼ぶ。
Sum Mainの方でログインフォームを呼ぶ設定に修正しましたが、扱いやすい理由がピンと来ません。
メインフォーム経由のログインフォームより、ログインフォームの方が良いのでは無いかと思います。

>一つはエラーメッセージにあるように、Integer 型変数に対して、IsNot 演算子で If 問い合わせを行おうとしている点です。

根本的な話になりますが、

Public Class UserInfo
    Public Shared Property Id As String
    Public Shared Property UserName As String
End Class


るきおさんが示したコードは新規でフォームを作成し、そのフォーム名を「UserInfo」にして上記のコードを入力するという意味でしょうか?
もしそうだとすると、「UserInfo」を現在作成中の「FmLogin」のコードに組む込む事と勘違いして入力していました。

>もう一つは、そのIf 文を一体何のために記載しているのかです。
恐らくですが、ユーザー名が無いデータを探していると思います。
SQLServerにはID、パスワード、ユーザー名は全て入力されています。


>(1) 変数 RESULT は、どのような状態を管理するために宣言しましたか?
元は、半角英数字のみで作られたパスワードとIDの二つだけを参照するログインコードでした。
その場所は現時点で一回も修正していません。
ここまで、影響するとは思っていませんでした。

>(2) その変数に、どういった値をセットしようとしていますか?
RESULTはユーザー名(山田太郎などの日本人の名前)を値を入力したいと思っていますのでstring型でセットしたいと思っています。

>(3) その変数に値をセットするのはどの時点ですか?
自分の考えでは、遅くてもFmMainが表示される前にユーザーIDとユーザー名をセットしたいと思っています。