1

外部の Oracle データベースからのデータを事前入力したい Web フォームを作成しています。Rails OCI8 プラグインを使用しています。

クエリで URL パラメーターを直接使用することで、インジェクションの危険にさらされないようにしたいと考えています。

たとえば、コントローラーでは次のようになります。

  def new
    if params[:provider] && u = findByUserName(params[:provider])
        monkey = {
            :employeeEmail => u['EMAIL_ADDRESS'],
            :employeeFirst => u['FIRST_NAME'],
            :employeeLast => u['LAST_NAME'],
            :userID => u['LOGIN_ID'],
            :supervisorUserID => u['SUPERVISOR_ID'],
            :supervisorName => u['SUPERVISOR_NAME'],
            :supervisorEmail => u['SUPERVISOR_EMAIL']
        }
        @service = Service.new(monkey)
    else
        @service = Service.new
    end
  end

ご覧のとおり、params[:provider] は OCI8 クエリに直接渡されます。

def findByUserName(id)
    if id
        cursor = cursor_exec("SELECT DISTINCT 
                    <QUERY INFO HERE>
            AND external_user = :id
            ORDER BY last_name, first_name", id)
        collection = cursor.fetch_hash()
        cursor.close
        logoff
        collection
    end
end

Cursor_exec 関数

def cursor_exec(sql, *params)
  @conn = OCI8.new('user','pass','server')
  if params.length > 0
    cursor = @conn.exec(sql, *params)
  else
    cursor = @conn.exec(sql)
  end 
end

OCI8はバインドを介してパラメータを適切にサニタイズしますか、またはより安全にするために使用できる方法はありますか?

4

1 に答える 1

1

内部で を呼び出しているためOCI8#exec()、渡された 2 番目のパラメーターはパラメーターとしてクエリにバインドされます。追加のエスケープについて心配する必要はありません。呼び出しによって内部的に保護する必要がありexec()ます。

ドキュメントから:

exec(sql, *bindvars)

SQL ステートメントを実行します。戻り値のタイプは、SQL ステートメントのタイプによって異なります。挿入、更新、および削除。作成、変更、削除。およびPL/SQL。

bindvars を指定すると、実行前にバインド変数としてバインドされます。

于 2012-04-09T14:51:00.463 に答える