4

私は現在、セキュリティが大きな問題となっている従来の ASP プロジェクトに取り組んでいます。暗号化方式(md5)が安全でないだけでなく、SQL インジェクションの問題も心配です。私はまだインジェクションが苦手で、知っている基本的なことしか試していません。ユーザー入力を「保護」する機能を見つけましたが、実際にインジェクション攻撃を防ぐために何かをしているのか疑問に思っています。関数は次のとおりです。

function sqlfix(input)
    if not isnull(input) and input <> "" then
        input = replace(input, ";", "&#59;")
        input = replace(input, "'", "&#39;")
        input = replace(input, """", "&#34;")
        input = replace(input, "(", "&#40;")
        input = replace(input, ")", "&#41;")
        input = replace(input, "|", "&#124;")
        input = replace(input, "<", "&#60;")
        input = replace(input, ">", "&#62;")
        input = replace(input , "'", "''")
        'input = Server.HTMLEncode(input)
        'input = Server.UrlEncode(input)
        sqlfix = input
    else
        sqlfix = ""
    end if
end function

何年も前に mysql_* 関数を使って初めて PHP を始めたとき、このようなことをしたことを覚えていますが、今では PDO とパラメーター バインディングに移行しています。ただし、これが ASP アプリケーションにとってどれほど安全かはわかりません。ご意見ありがとうございます。

4

4 に答える 4

6

文字列補間の罠にはまらないように! 安全ではありません。

ASP Classic でも実際の SQL クエリ パラメータを使用できます。

私は ASP プログラマーではありませんが、パラメーター化された SQL クエリに ADODB.Command オブジェクトを使用し、実行前に値をパラメーターにバインドする明確な例が記載されたこのブログを見つけました。

http://securestate.blogspot.com/2008/09/classic-asp-sql-injection-prevention_30.html

名前付きパラメーターの使用例については、この SO の質問も参照してください。

パラメーター化されたクエリの ASP クラシック名前付きパラメーター: スカラー変数を宣言する必要があります

于 2012-11-26T21:36:33.263 に答える
3

これは、ASPクラシックでPDOに到達できる限り近いものです...

with createobject("adodb.command")
    .activeConnection = application("connectionstring")
    .commandText = "select * from sometable where id=?"
    set rs = .execute( ,array(123))
end with

SQLインジェクションを防ぐクラシックASPでプリペアドステートメントを作成するにはどうすればよいですか?

于 2012-11-26T21:41:02.617 に答える
1

この線

input = replace(input , "'", "''")

ほとんどの作業を行っています。私が安全なサイトのために行ったことは、データ型ごとにいくつかの異なる関数です

fn_validstring replacing single quotes
fn_validnumber testing isnumeric 
fn_validint leveraging fn_validnumber and rounding
fn_bool 
etc ... 

dynamic をストアド プロシージャに置き換え、execute 以外のすべてのアクセス許可を削除すると、環境は関係なく保護されます。

于 2012-11-26T21:36:48.330 に答える
0

PDOとプリペアドステートメントは、SQLインジェクションを防ぐための最良の方法です。上記のコードのような手書きのSQLサニタイズコードは、見逃しがちなものがたくさんあるため、非常に危険です。

プリペアドステートメントを使用すると、SQLステートメントが安全になります。

于 2012-11-26T21:32:03.370 に答える