0

SQL ステートメントをパラメーター化することで、従来の ASP/VBScript Web サイトをより安全にしようとしています。

私は次の機能を持っています:

Function OpenUpdateableRS(strSQL)
    Dim rs
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open strSQL, cnDZ, adOpenKeyset, adLockPessimistic, adCmdText
    Set OpenUpdateableRS = rs
    Set rs = Nothing
End Function

私はそれを次のようなものに変換するつもりです:

Function SecureOpenUpdateableRS(strSQL, strParam1, strParam2)
    Dim rs
    Dim cmdOB
    Set cmdOB = Server.CreateObject("ADODB.CommandObject")
    With cmdOB
        .ActiveConnection = cnDZ
        .CommandText = strSQL
        .Parameters(0).value = strParam1
        .Parameters(0).value = strParam2
    End With
    Set rs = Server.CreateObject("ADODB.Recordset")
    rs.Open cmdOB.Execute, , adOpenKeyset, adLockPessimistic
    Set SecureOpenUpdateableRS = rs
    Set rs = Nothing
End Function

関数を次のように呼び出すと:

Set rs = SecureOpenUpdateableRS("SELECT CustID, LastActive, LoggedIn, SessionID FROM tblLogins WHERE EMail = ? AND PWord = ?", strEMail, strPassword)

「500 - 内部サーバー エラー」が表示されますが、これはおそらくサーバーでのデバッグを無効にしたためです。
元の機能を壊すことなくより安全にする方法についてのアイデアはありますか?

4

1 に答える 1

1

パラメータを作成し、コマンドのパラメータ コレクションに追加する必要があります。(同じ!) パラメータに値を代入するだけでは、うまくいかない可能性があります。サンプルについてはGoogle; おそらくこのVBです!サンプルで開始できます。

追加した:

パラメーターの型を派生させるには、次の 2 つの方法が考えられます。

  1. 正しい/最大に指定されたパラメーター値を関数に渡すと、VarType(value)定数をパラメーター型定数にマップできます
  2. コマンド テキストのフィールド名に基づいて SELECT を実行すると、レコードセットのフィールド.Types をパラメーター型の定数にマップできます。

考えられるすべてのケースでこれを正しく行うことは簡単ではありません。値と目的の型のペアを関数に渡します。

于 2013-03-28T09:53:01.697 に答える