1

MS SQL 2008 R2(Express Edition)を使用して、古いクラシックasp Webサイト(約1,000(.asp)ページ)を保護しようとしています。

パラメータ化されたクエリの方法に関するコード(以下を参照)を見つけました。このコードは、変更が必要なすべてのページで理解して使用するのが最も簡単なようです。

私の質問は次のとおりです。すべてのmssqlクエリ(以下のコードのようになります)を変換する場合、ms sqlインジェクション攻撃から保護するのに十分でしょうか?または、追加/変更する必要があるものは他にありますか?

助けてくれてありがとう...

ここにコードがあります:

    set objCommand = Server.CreateObject("ADODB.Command")  
    strSql = "SELECT * FROM users WHERE username=? AND password=?"
    ...  
    cmd1.Parameters(0) = Request.Form("login")
    cmd1.Parameters(1) = Request.Form("password")
    ... 
4

2 に答える 2

3

古いAdodbコマンド構文を見てからしばらく経ちましたが、次のようなものが必要になると思います。

set objCommand = Server.CreateObject("ADODB.Command")
strSql = "Select * From users where username=@username and password=@password"
objCommand.Parameters.Append.CreateParameter
         ("@username", adVarChar, adParamInput, 50, Request.Form("login"))
objCommand.Parameters.Append.CreateParameter
         ("@password", adVarChar, adParamInput, 50, Request.Form("password"))

いつものように、タイプセーフなパラメータエンコーディングなしで動的SQLステートメントを作成しないでください。古い学校のADOでさえCreateParameterを介してこれを提供していると思います。

于 2012-08-01T21:54:25.937 に答える
1

はい、質問で提供したコードはSQLインジェクションから保護されています。

ただし、SQLインジェクションの軽減に関するこの記事で説明したように、コードには「クエリを実行する前にADODBがパラメータタイプを把握するためにSQLにラウンドトリップする必要があるため、パフォーマンスに小さな問題があります」。

これを解決するには、コードでパラメータタイプを明示的に指定します。CreateParameter

于 2012-08-01T21:54:08.803 に答える