ASP Classic - объект набора записей и объект команды - PullRequest
4 голосов
/ 06 августа 2010

Я использую ASP Classic и SQL Server 2000 для создания динамических веб-сайтов.

Я немного озадачен тем, когда использовать объект набора записей и когда использовать объект команды при запросе базы данных.

Мне сказали, что если хранимая процедура будет возвращать записи из оператора SELCT, тогда я должен использовать набор записей, однако, если я выполняю обновление или вставку, тогда я должен использовать объект команды и передавать все данные в качестве параметров в хранимуюпроцедура.

При использовании набора записей я часто передаю любые необходимые данные, например, так:

rs.Source = "spTest "   & id

Я всегда проверяю данные, которые я передаю, чтобы убедиться, что это то, что я ожидаю, и приведуэто его правильный тип.

С тех пор мне сказали, что вышеупомянутый метод оставляет мой код открытым для атак SQL-инъекций и что я всегда должен использовать объект команды.

Это правильно?

Спасибо

Ответы [ 2 ]

3 голосов
/ 06 августа 2010

Да, все верно.

Представьте, что кто-то передает строку: '0; удалить * из пользователей; '

Ваш запрос будет:

spTest 0; delete * from users;

Если вам повезет, у вас не будет таблицы пользователей. Лично я бы все время использовал объект команды для согласованности. Вы можете получить все, что вам нужно от него.

Вот краткий пример того, как вы можете сделать это с помощью объекта команды:

    Dim oStoredProc : Set oStoredProc = Server.CreateObject("ADODB.Command")

    With oStoredProc
        .ActiveConnection = oDBConnection
        .CommandType = adCmdStoredProc
        .CommandText = "up_procname"
        .Parameters.Append(.CreateParameter("@Param1", ADODB.adInteger, ADODB.adParamInput, 22, 11))
        .Parameters.Append(.CreateParameter("@Param2", ADODB.adInteger, ADODB.adParamOutput, 22, 12)

        Call .Execute()

        myVal = .Parameters("@Param2")
    End With

    Set oStoredProc = Nothing
1 голос
/ 06 августа 2010

То, что вам сказали, действительно верно: вы должны всегда использовать объекты commande для предотвращения SQL-инъекций. Используя параметризованные запросы, вы оставляете всю безопасность и проверку параметров на уровне ADO (хотя вы все равно должны выполнять свою собственную надлежащую проверку), и вы можете даже получить некоторое улучшение производительности (эти параметризованные запросы кэшируются SQL Server)

Когда вы выполняете команду, у вас есть две опции: либо выполняемый вами SQL возвращает строки (оператор SELECT, либо некоторые хранимые процедуры), тогда вы должны использовать набор записей для хранения этих строк, либо это не так (ОБНОВЛЕНИЯ , DELETES, другие процедуры), то вы просто выполняете команду и не беспокоитесь о наборах записей.

Редактировать: просто чтобы убедиться, что вам все ясно, я использовал приведенный выше код Джеймса Вайзмана и адаптировал его к вашему примеру:

Dim oStoredProc : Set oStoredProc = Server.CreateObject("ADODB.Command")

With oStoredProc
    .ActiveConnection = oDBConnection
    .CommandType = adCmdStoredProc
    .CommandText = "spTest ?"
    .Parameters.Append(.CreateParameter("id", ADODB.adInteger, ADODB.adParamInput, id, 11))
    Dim rs : Set rs = .Execute()
End With

Set oStoredProc = Nothing

Не проверял, но должно быть в порядке: -)

И последнее, но не менее важное: несмотря на то, что вы сейчас достаточно хорошо защищены, не забывайте, что если вы используете динамический SQL внутри хранимой процедуры, у вас все еще может быть дыра в безопасности SQL-инъекции (как только вы конкатенируя строки для создания SQL, вы можете быть уязвимы, я бы сказал)!

...