2009-08-19 1 views
1

Это моя хранимая процедура:MS SQL Server ошибка хранимая процедура «неправильный синтаксис»

ALTER PROCEDURE its.sp_WriteTransaction 

    (
    @LoginID int, 
    @PersonID int, 
    @BusinessID int, 
    @TransType smallint, 
    @LastHost varchar(15), 
    @TransData varchar(255) 
) 

AS 

DECLARE @TransDate DATETIME 
SET @TransDate = GETDATE() 

INSERT INTO Transactions (LoginID, PersonID, BusinessID, TransDate, TransType, LastHost, TransData) 
VALUES (@LoginID, @PersonID, @BusinessID, @TransDate, @TransType, @LastHost, @TransData) 
RETURN 

Это мое призвание линия:

sql = "sp_WriteTransaction" & " " & Session("UserID") & "," & Session("PersonID") & "," & Session("bizID") & "," & TransType & "," & ClientIP & "," & TransData 

Но каждый раз, когда я запускаю его я получаю следующее сообщение об ошибке :

сообщение об ошибке:

Тип ошибки: Microsoft OLE Поставщик БД для SQL Server (0x80040E14) Строка 1: Неправильный синтаксис около '.0'. /etearsheets/authorize/CheckAccess.asp, строка 1163

Что не так в IP-формате, вызывающем ошибку «.0» и как его исправить?

Благодаря Р.

+1

** НЕ КОГДА-ЛИБО НИКОГДА ** используйте «sp_» в качестве префикса имени сохраненного параметра! Microsoft очень злится, если вы это делаете! Это префикс с поддержкой Microsoft, и вы просто просите о проблемах, если вы его используете! Используйте «proc_» или что-то еще - или никакой префикс вообще. –

+0

На самом деле у меня нет выбора. Я строю эти хранимые процедуры в соответствии с документацией компании, а проблема «sp_» относится к SQL Server 7.0 Service Pack 4, и мы находимся на V.09.00.3042. Но спасибо за хэдс-ап, я это помню. – flavour404

+0

Этот код уязвим для SQL-инъекции –

ответ

2

Вы не включая цитаты для ваших varchar столбцов.

Попробуйте это:

sql = "sp_WriteTransaction" & " " & Session("UserID") & "," & _ 
    Session("PersonID") & "," & Session("bizID") & "," & _ 
    TransType & ",'" & ClientIP & "','" & TransData & "'" 

Это не успеваю на IP-адрес, так как 127.0.0.1 не является числом. Вы в настоящее время пытаетесь передать его как float, который использует только одно десятичное число. Охват его в одинарных кавычках заставляет SQL анализировать его как строку.

+5

Хотя правильно, я не могу голосовать за это, потому что он не использует параметры запроса и, вероятно, уязвим для атаки на инъекции. Большинство из этих ценностей вы можете с ним справиться, но откуда берется TransData? –

+1

@Joel: Я не занимался разговорами по SQL-инъекциям, потому что это были все системные данные, но вы действительно поднимаете хорошую точку. – Eric

+0

Хорошо, вы правы, большинство используемых данных - это системные данные. Кроме того, да, я знаю о недостатках безопасности в системе, и я сказал клиенту так, но они кажутся a) не желающими слушать b) не хотят платить, чтобы отсортировать его, чтобы я попытался «подгонять» вещи поскольку я сталкиваюсь с ними, но в противном случае мне платят за то, чтобы «заставить его работать», хотя иногда я просто сжимаю, зная, что может произойти. – flavour404

1

вам нужно установить одинарные кавычки вокруг значения ClientIP.

1

Как и другие, вы не одиночные параметры цитирования.

Предполагая ...

Session("UserID") = 0000 
Session("PersonID") = 4321 
Session("bizID") = 1234 
TransType = "GET" 
ClientIP = "192.168.1.1" 
TransData = "xyz" 

затем выполняет следующие ...

sql = "sp_WriteTransaction" & " " & Session("UserID") & "," & Session("PersonID") & "," & Session("bizID") & "," & TransType & "," & ClientIP & "," & TransData 
response.write(sql) 

даст ...

sp_WriteTransaction 0,4321,1234, GET, 192.168.1.1, xyz

Что еще более беспокоит то, что вы передаете незакодированные строки в SQL, потому что это оставляет вас уязвимыми для атак SQL Injection. В этом случае похоже, что все данные могут быть получены без какого-либо происхождения клиента, но, учитывая природу/наивность вашего вопроса, я подозреваю, что вы, вероятно, уязвимы в других местах.

Вот пример того, как вы можете защитить ваш SQL

Session("UserID") = 11111 
Session("PersonID") = 4321 
Session("bizID") = 1234 
TransType = "GET" 
ClientIP = "192.168.1.1" 
TransData = "xyz" 

sql = "sp_WriteTransaction {0},{1},{2},{3},{4},{5}" 
parameters = Array(Session("UserID"),Session("PersonID"),Session("bizID"),TransType,ClientIP,TransData) 

Function BuildSQL(query, params) 
    Dim result : result = query 

    If Not IsArray(params) Then 
     BuildSQL = Null 
     Exit Function 
    End If 

    Dim i 
    For i = lbound(params) to ubound(params) 
     result = replace(result,"{" & i & "}",SQLEncode(params(i))) 
    Next 

    BuildSQL = result 
End Function 

Function SQLEncode (uVar) 
    If IsNull(uVar) Then 
     SQLEncode = "null" 
    Else 
     SQLEncode = "'" & replace(uVar,"'","''") & "'" 
    End If 
End Function 

Response.Write BuildSQL("sp_WriteTransaction {0},{1},{2},{3},{4},{5}",parameters) 

Этот код выводит следующее ...

sp_WriteTransaction '11111', '4321', '1234',» GET '' 192.168.1.1' , „хуг“

Вы можете взять это шагом вперед, поставив SQLEncode и BuildSQL в свой собственный файл DataAccess.inc и сделать его доступным во всех ваших ASP-файлы с включаемым заявлением.

например.

<!-- #include file="DataAccess.inc"--> 

Для этого вам необходимо иметь на стороне сервера Включает включен в IIS и убедитесь, что относительный путь в #include утверждение верно.

+0

Было бы безопаснее и проще использовать параметризованный SQL, а не пытаться самостоятельно кодировать поля. – LukeH

+0

@ Luke: Я не знаю, что вы можете выполнить параметризованный SQL в классическом ASP. – MyItchyChin

+1

@CptSkippy: Вы можете это сделать. Взгляните на http://msdn.microsoft.com/en-us/library/ms675101(VS.85).aspx – LukeH

 Смежные вопросы

  • Нет связанных вопросов^_^