Помогите с защитой от SQL-инъекций - PullRequest
0 голосов
/ 09 марта 2011

Мне нужна помощь по SQL-инъекции.Я читал об этом, но все еще не понимаю, как защитить себя от этого.

У меня есть простая база данных Access с таблицей («курсом»), содержащей имена и даты, среди прочего.Затем у меня есть старая страница ASP с формой поиска.Ниже формы поиска у меня есть div («схема»), который я хочу заполнить результатами поиска через AJAX.Все работает нормально, но есть ли что-то, что мне нужно сделать, чтобы защитить меня от SQL-инъекции?Вот упрощенная версия моего кода:

Страница поиска ASP с AJAX и формой (index.asp)

$("#search").keyup(function() {
 var varSearch; 
 varSearch = $("#search").attr("value").replace(/\s/g,"+");
$("#schema").load('ajax.asp?q=' + varSearch + ''); 
});

<input type="text" name="search" id="search" value="Search.." />
<div id=”schema”></div>

Страница результатов ASP (ajax.asp):

q = request.querystring("q")
SQL = "SELECT * FROM course WHERE startDate >= #" & Now & "# AND (courseName like '%" & q & "%');"
While Not dbRS.EOF
str courseName = dbRS("courseName ")
Respone.Write courseName
dbRS.MoveNext
Wend

Любая помощь будет высоко ценится.Спасибо.

Обновление:

Вот что у меня так далеко.Это вся страница.Я не вижу, чего не хватает.Нужно ли что-то делать с базой данных Access, или она работает сразу?

<!--#include file="includes/adovbs.inc" -->
<%
q = request.querystring("q")

SQL = "SELECT * FROM info WHERE (cNamn Like '%?%');"

Set cn = Server.CreateObject("ADODB.Connection")
set comm = CreateObject("ADODB.Command")
set parameter1 = CreateObject("ADODB.Parameter")

cn.Open ("db.mdb")
Set cn.ActiveConnection = cn

parameter1.Type=adVarChar 'for example
parameter1.Size=25 'for example
parameter1.Direction=adParamInput
parameter1.Value=q

comm.Parameters.Append parameter1
Set recordset  = comm.Execute 

recordset.Close
cn.Close
Set recordset= Nothing
Set comm = Nothing
Set cn = Nothing
%>

Ошибка, которую я получаю прямо сейчас: «[Microsoft] [ODBC Driver Manager] Имя источника данных не найдено, и нетдрайвер по умолчанию указан "на линии" cn.Open ("db.mdb") ".Я пытался с "cn.Open server.mappath (" db.mdb ")", но затем я получаю ошибку "[Microsoft] [ODBC Driver Manager] Слишком длинное имя источника данных"

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Внедрение SQL происходит, когда вы делаете то, что у вас есть: берете пользовательский ввод и напрямую помещаете его в команду SQL.Кто-то со злонамеренным намерением может попытаться отправить текст, который добавит дополнительные операторы SQL к тому, который вы пытаетесь запустить.

Первая линия защиты - попытаться разобрать символы, которые допускают внедрение.Например, кто-то, добавив одиночную кавычку ('), завершит вашу строку в операторе SQL и позволит им попытаться начать новый оператор.Если вы запустите свою переменную q через функцию разбора, вы можете попытаться предотвратить это.Замена одной одинарной кавычки двумя одинарными кавычками пропустит одинарную кавычку в соответствии с намерениями пользователя и предотвратит внедрение SQL-кода кем-то вредоносным.

Кроме того, вам лучше использовать хранимые процедуры и параметры, если вы можете.

0 голосов
/ 09 марта 2011

Опасность заключается в том, что переменная q может обрабатываться SQL как инструкция.Вы можете защитить себя, выполнив:

q = request.querystring("q")
SQL = "SELECT * FROM course WHERE startDate >= #?# AND (courseName like '%?%');"
ConnStr = "driver=Microsoft Access Driver (*.mdb);uid=;dbq=" & Server.MapPath ("db.mdb")    
Set cn = Server.CreateObject("ADODB.Connection") 

set comm = CreateObject("ADODB.Command")
set parameter1 = CreateObject("ADODB.Parameter")
set parameter2 = CreateObject("ADODB.Parameter")

cn.Open ConnStr 
Set comm.ActiveConnection = cn
comm.CommandText = SQL

parameter1.Type=adVarChar 'for example
parameter1.Size=25 'for example
parameter1.Direction=adParamInput
parameter1.Value=value1

parameter2.Type=adVarChar 'for example
parameter2.Size=25 'for example
parameter2.Direction=adParamInput
parameter2.Value=value2

comm.Parameters.Append parameter1
comm.Parameters.Append parameter2
Set recordset  = comm.Execute 

...you ASP code here...

'when your done dont forget to clean up the resources
recorderset.Close
cn.Close
Set recordset= Nothing
Set comm = Nothing
Set cn = Nothing

Кроме того, если вы знаете, что параметр будет числом или датой, проверка того, что это действительно так, также является хорошей защитой.

...