Может кто-нибудь сказать, пожалуйста, что не так с этим утверждением? - PullRequest
1 голос
/ 30 июля 2010

Я использую это, чтобы вставить несколько вещей в мою таблицу, и она продолжает выдавать мне эту ошибку:

Microsoft VBScript compilation error '800a03ee'
Expected ')'
/thanks.asp, line 63

Set rstSimple = cnnSimple.Execute("insert into SALT (Email, Username, FirstName, LastName, ActivationCode) VALUES ('"Request.QueryString("payer_email") & "', '" & Request.QueryString("payer_email") & "', '" & Request.QueryString("first_name") & "', '" & Request.QueryString("last_name") & "', '" & Request.QueryString("hash")"'))
---------------------------------------------------------------------------------------------------------------------^

Это код, который я использую:

Set rstSimple = cnnSimple.Execute("insert into SALT (Email, Username, FirstName, LastName, ActivationCode) VALUES ('"Request.QueryString("payer_email") & "', '" & Request.QueryString("payer_email") & "', '" & Request.QueryString("first_name") & "', '" & Request.QueryString("last_name") & "', '" & Request.QueryString("hash")"'))

Можеткто-нибудь, пожалуйста, помогите мне?

Спасибо

Ответы [ 4 ]

3 голосов
/ 30 июля 2010

Я бы предложил разбить ваш код следующим образом, чтобы он стал читабельным и понятным:

Dim execSql
execSql = "insert into SALT (Email, Username, FirstName, LastName, ActivationCode)"
execSql = execSql & " VALUES ('"
execSql = execSql & Request.QueryString("payer_email") 
execSql = execSql & "', '" 
execSql = execSql & Request.QueryString("payer_email") 
execSql = execSql & "', '" 
execSql = execSql & Request.QueryString("first_name") 
execSql = execSql & "', '" 
execSql = execSql & Request.QueryString("last_name") 
execSql = execSql & "', '" 
execSql = execSql & Request.QueryString("hash")
execSql = execSql & "')"

Set rstSimple = cnnSimple.Execute(execSql)

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


Редактирование в SQL-инъекции и безопасности

Как уже упоминал кто-то другой, ваш код очень восприимчив к атакам SQL-инъекций. Даже если не предусмотрена атака (то есть удаление вашей базы данных), она потерпит неудачу, если кто-то с именем d'Amour (французский) или in 't Huys (голландский) потерпит крах вашей страницы. Чтобы обойти это, не пытайтесь отфильтровать код, а переписать его с помощью команды и параметров SQL. Это просто, ваш код просто становится таким:

Set dbCommand = Server.CreateObject("ADODB.Command")
Set dbCommand.ActiveConnection = cnnSimple
dbCommand.CommandType = adCmdText
dbCommand.CommandText = _
    "INSERT INTO SALT (Email, Username, FirstName, LastName, ActivationCode) " + _ 
    "VALUES (@email, @user, @firstname, @lastname, @code)"
With dbCommand.Parameters
    .Add("email", adVarChar, adParamInput, , Request.QueryString("payer_email"))
    .Add("user", adVarChar, adParamInput, , Request.QueryString("payer_email"))
    .Add("firstname", adVarChar, adParamInput, , Request.QueryString("first_name"))
    .Add("lastname", adVarChar, adParamInput, , Request.QueryString("last_name"))
    .Add("code", adVarChar, adParamInput, , Request.QueryString("hash"))
End With

Set rstSimple = dbCommand.Execute()

Примечание: обязательно загрузите и включите ADOVBS.INC , чтобы вам не приходилось заменять константы adVarChar и adParamInput и т. Д. Их числовыми эквивалентами.

Для получения дополнительной информации см. этот SO-ответ Хосе Базилио , Google на «SQL Injection ASP» или «SQL Prepared Statement Classic ASP», он должен найти вас.

0 голосов
/ 30 июля 2010

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

0 голосов
/ 30 июля 2010

Отсутствующие амперсанды и кавычки могут быть наименьшей из ваших проблем.

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

0 голосов
/ 30 июля 2010

У вас есть & здесь:

VALUES ('"Request.QueryString("payer_email") & "'

должно быть:

VALUES ('" & Request.QueryString("payer_email") & "'

И даже в последней части вашего утверждения у вас есть пропущенный & и пропущенный ":

Request.QueryString("hash")"'))

должно быть:

Request.QueryString("hash") & "')")

Поэтому вы можете попробовать следующее утверждение:

cnnSimple.Execute("insert into SALT (Email, Username, FirstName, LastName, ActivationCode) VALUES ('" & Request.QueryString("payer_email") & "', '" & Request.QueryString("payer_email") & "', '" & Request.QueryString("first_name") & "', '" & Request.QueryString("last_name") & "', '" & Request.QueryString("hash") & "')")
...