LoginSignup
0
0

プレースホルダーを設定し、不正なパラメータを無効化する(VB.NET)

Last updated at Posted at 2023-04-12

この記事の注意事項

この記事の内容はこちらの記事の内容を修正した内容となります。

修正後のコード

Imports System.Data.SqlClient

Public Class clsSqlServerRespoder

    Public Function getAutenticate(ByRef systemErrorFlag As Boolean, ByRef userID As String, ByRef password As String, ByRef isAuthenticated As Boolean) As Boolean
        Dim cn As New SqlClient.SqlConnection

        Try

            Dim devDataSource As String = System.Environment.GetEnvironmentVariable("DEV_DATA_SOURCE")
            Dim devInitialCatalog As String = System.Environment.GetEnvironmentVariable("DEV_INITIAL_CATALOG")
            Dim devUserID As String = System.Environment.GetEnvironmentVariable("DEV_USER")
            Dim devPassword As String = System.Environment.GetEnvironmentVariable("DEV_PASSWORD")
            Dim devTimeout As String = System.Environment.GetEnvironmentVariable("DEV_TIMEOUT")

            Dim connectionString As String = ""
            connectionString &= String.Format("Data Source = {0};", devDataSource)
            connectionString &= String.Format("Initial Catalog = {0};", devInitialCatalog)
            connectionString &= String.Format("User ID = {0};", devUserID)
            connectionString &= String.Format("Password = {0};", devPassword)
            connectionString &= String.Format("Connect Timeout = {0};", devTimeout)

            cn.ConnectionString = connectionString
            cn.Open()

            Dim SQL As String = ""
            SQL &= String.Format("SELECT COUNT(*) AS COUNT ")
            SQL &= String.Format("FROM UserInfo  ")
            SQL &= String.Format("WHERE user_id = @userID ")
            SQL &= String.Format("AND ")
            SQL &= String.Format("password = @password ")

            Dim cd As New SqlCommand(SQL, cn)
            cd.Parameters.AddWithValue("@userID", userID)
            cd.Parameters.AddWithValue("@password", password)

            Dim dr As SqlDataReader = cd.ExecuteReader

            Dim count As Integer
            While dr.Read
                count = dr("COUNT")
            End While

            If count = 1 Then
                isAuthenticated = True
            Else
                isAuthenticated = False
            End If

        Catch ex As Exception
            systemErrorFlag = True
            MessageBox.Show("エラーが発生しました: " & ex.Message)
        Finally
            cn.Close()
            cn.Dispose()
        End Try

        Return systemErrorFlag
    End Function

End Class

ユーザー情報

SQLインジェクションを試み、確認をするために、ユーザー情報を以下のように準備しています。
※本来、パスワードをハッシュ化して管理したり、パスワードのテキストフォームは見えないように配慮しなければなりませんが、この時点では実装していません。
データベース.png

修正箇所

SQLにプレースホルダーを設定し、パラメータの安全性を確保します。SQL文の中にある変数に該当する部分(ユーザーIDとパスワードに相当する部分)を、"@"で始まる名前付きパラメーターを設定し、Parameters.AddWithValueのメソッドでパラメータの値を渡しています。これによって、不正な文字が送られてきても、無効化することができます。(これをサニタイズと言うらしいですが、仕事でこの言葉を使ったことがないので、カッコで補足しています)

修正前
コード1.png
修正後
AddWithValue.png

結果①

ユーザーIDの後ろに、[' --]を追加しても、認証に失敗するようになった。
無題1.png
実行されるSQL

SELECT COUNT(*) AS COUNT FROM UserInfo  WHERE user_id = @userID AND password = @password 

結果②

ユーザーIDの後ろに、[' or 1 = 1 --']を追加しても、認証に失敗するようになった。
無題2.png
実行されるSQL

SELECT COUNT(*) AS COUNT FROM UserInfo  WHERE user_id = @userID AND password = @password 

補足確認

正しいユーザーIDとパスワードを入力しても、問題なくログインができます。
無題3.png

注意事項

  • この記事では、SQL Server、SSMS、visual studioを使用しているので、試してみたい方は事前に準備が必要です。
  • 本記事に掲載されているコードは掲載用にサンプルとして掲載しているものです。したがって本記事を参考にし、コーディングを進める場合は作成しているアプリに応じて、各自で判断して、適応してください。
  • 関連する記事の一覧はこちら
    ※参照先のリンクが切れている場合は、トップページから確認してください。

この記事は誰向けの記事か?

  • SQLインジェクション対策をコードに実装したい人

環境

本記事における注意事項

  • 本記事は、備忘録としてまとめたものになります。
  • 他の方の参考になる可能性も踏まえて、一般公開も行なっております。
  • また記載内容はすべて、正しい内容が記載されているとは限りません。
  • 誤った内容を見つけた場合は、ご指摘をお願いいたします。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0