2

httprequestsから直接変数を取得する約2000の異なる手作りのSQL文字列を備えた古いWebサイトを継承しました。このサイトは、SQLインジェクション攻撃によって定期的に侵害されています。明らかに、このサイトはこのセキュリティの悪夢を回避するためにSQLパラメータを使用してコーディングされている必要がありますが、これらの変更に伴う作業負荷のため、着信要求を「クリーンアップ」する別の方法を探しています。

メインクリーン機能:-

Public Function myRequest(ByRef Request As HttpRequest, ByVal param As String) As String
        Return CleanRequest(Request(param))
End Function

Public Function CleanRequest(ByVal requestString As String) As String
        Dim badChars() As String = {"select", "drop", ";", "--", "insert", "delete", "xp_", "update"}
        Dim newChars As String = requestString

        For i = 0 To UBound(badChars)
            newChars = Replace(newChars, badChars(i), "", 1, -1, vbTextCompare)
        Next

        CleanRequest = Replace(newChars, "'", "''")
End Function

そのように呼ばれる:-

Dim details As DataSet

detailsSQL = "select * from mytable where tableid = '" & myRequest(Request, "tableid") & "'"
details = sql.sqlSelect(detailsSQL)

コードは構造化されており、簡単に見つけて置き換えることができるように名前が付けられていることに注意してください。このコードを使用すると、サイトは引き続き定期的に侵害されます。これらのインジェクション攻撃を阻止するのに役立つメインの「クリーン」機能への追加を誰かが推奨できますか?

4

2 に答える 2

5

SQLインジェクションを防ぐ唯一の信頼できる方法は、ハードワークを投入し、すべてのリクエストをSQLパラメータを使用するように変換することだと思います。

ただし、質問に答えるために、クリーンなメソッドにはSQLインジェクションの基本的なトリガー(エスケープされていない文字)がないようです。現時点では、サイトはまださまざまな種類の攻撃の影響を受けやすくなっています。たとえば、次のようになります。

"password' or 1=1; --"
"password'; DROP Table Users; --"

少なくとも、悪い文字をエスケープしていることを確認してください。ただし、これは必ずしも十分ではないことに注意してください。SQLインジェクションを完全に根絶したい場合は、繰り返します。SQLパラメータを使用してください。

于 2013-01-21T10:48:12.397 に答える
1

以下のSQLの一部は間違っています。SQLパラメータを使用してください:最も明白な種類のSQLインジェクション攻撃を取り除くのに役立ちます。

detailsSQL = "select * from mytable where tableid = '" & myRequest(Request, "tableid") & "'"
details = sql.sqlSelect(detailsSQL)

これを:に置き換えます

detailsSQL = "select * from mytable where tableid = @tableid"
details = sql.sqlSelect(detailsSQL, new SqlParameter(@tableid, myRequest(Request, "tableid")))

仮定

  • sqlは、SQLServerデータベースクエリのラッパーです。
  • sqlSelect関数は、SQLパラメーターも持つように適合されています
  • ジェームズが提案したように、myRequestはエントリを適切にエスケープします

パラメータを正しい方法で使用すると、SQLステートメントの各エントリを解析する必要がなくなります。

于 2013-01-21T10:56:22.187 に答える