sql >> データベース >  >> RDS >> Sqlserver

このコードはSQLインジェクションを防ぎますか?

    あなたの直接の質問への答え:このコードはSQLインジェクションを防ぎますか:いいえ

    これが証明です-この文字列をPrepareStringメソッドにプッシュします:

    Dim input = "'" & Chr(8) & "; Drop Table TableName; - " & Chr(8) & "-"
    Dim output = PrepareString(input)
    
    Console.WriteLine(input)
    Console.WriteLine(output)
    

    投稿したGetRecordメソッドを変更して、データベースからレコードを取得するのではなく、完全に準備されたSQL文字列を返すようにしました。

    Console.WriteLine(GetRecord(output))
    

    そしてこれが出力です

    Input  = ; Drop Table TableName; --
    Output = '; Drop Table TableName; --
    Query  = SELECT * FROM TableName WHERE Key = ''; Drop Table TableName; --'
    

    コードを1行追加します:

    My.Computer.Clipboard.SetText(input)
    

    そして、SQLインジェクションを完了するために、必要な文字列をクリップボードに直接コピーしてWebサイトの入力フィールドに貼り付けることができます。

    '; Drop Table TableName; - -
    

    [StackOverflowによって出力されたポストから制御文字が省略されていることに注意してください。そのため、出力を作成するにはコード例に従う必要があります]

    PrepareStringメソッドを実行すると、まったく同じ出力が得られます。Chr(8)ASCIIコードは、文字列を閉じるために追加している余分な「'」を削除するバックスペースであり、最後に好きなものを自由に追加してください。スペースを削除するためにバックスペース文字を使用して実際に使用しているため、PrepareStringには私の--が表示されません。

    作成した結果のSQLコードは、Drop Tableステートメントを妨げられずに実行し、残りのクエリをすぐに無視します。

    これの面白いところは、印刷できない文字を使用して、基本的に、発明できる文字チェックをバイパスできることです。したがって、パラメータ化されたクエリを使用するのが最も安全です(これはあなたが尋ねたものではありませんが、これを回避するための最良の方法です)。



    1. PostgreSQLの命名規則

    2. MyBatisを使用してOracleで最後の挿入IDを取得するにはどうすればよいですか?

    3. PostgreSQLのMIN()関数

    4. SQL ServerのFORMAT()でサポートされている標準の数値形式の文字列