Проблема синтаксиса onclick при передаче двух переменных, классический asp

Asked
Viewd10060

2

Моя функция onclick прекрасно работает, когда я передаю одну переменную, и не отвечает, когда я пытаюсь передать две переменные. что-то не так с моим синтаксисом?

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

 ------------onclick code---------------------------------------------------
    Response.Write "<td class=""alt""><input type=""button"" onclick=""deleteRecordAtt(" & AttID &","& StoredPath & " )"" value=""remove"" /></td></tr>"

-----------function reference code in main page---------------------------------------

function deleteRecordAtt(AttID, StoredPath){
if(confirm("This will delect the attachment path"))
{
document.location.href="delete_attachments.asp?EMAIL_LETTERS_HOLD_ID="+AttID+"&RedirURL="+escape(document.location.href);
}
}
-----------function code in source page ----------------------------------------------

<%


Dim AttID, RedirectURL, StoredPath
Dim objConn

AttID=request("EMAIL_LETTERS_HOLD_ID")
RedirectURL=request("RedirURL")


Set objConn = CreateObject("ADODB.Connection")
objConn.Open "DSN=MyDSN"
objConn.Execute("UPDATE EMAIL_SEND_ATTACHMENTS set ATTACHMENTS = Replace(LTRIM(RTRIM(ATTACHMENTS)), '"& StoredPath & "' ,'') WHERE EMAIL_LETTERS_HOLD_ID= "& AttID & " ")
objConn.Close
Set objConn = Nothing

response.redirect RedirectURL
%>
 

2 ответов

3

onclick = "" deleteRecordAtt ("& AttID &", "& StoredPath &") ""

Объединение строк без экранирования - плохая идея. Предположительно AttID - это целое число, поэтому вам сойдет с рук этот единственный аргумент, но StoredPath - это строка. Поскольку вы не экранировали и не обернули эту строку, ваша запись выше закончится кодом HTML, например (при условии, что «сохраненный путь» - это, например, имя файла):

 onclick="deleteRecordAtt(123, file.gif)"
 

"file.gif" без кавычек, конечно, не поддается синтаксическому анализу как JavaScript: возникает синтаксическая ошибка. Убедитесь, что в вашем браузере включены ошибки сценария, чтобы вы могли видеть, когда что-то вроде этого идет не так, а не просто тихо.

Наивное решение - добавить кавычки:

 onclick=""deleteRecordAtt(" & AttID &", '"& StoredPath & "' )""
 

что приводит к:

 onclick="deleteRecordAtt(123, 'file.gif')"
 

который будет работать. Но что, если в вашей переменной StoredPath есть одинарная кавычка? Или символ

Вам понадобится функция VBScript для экранирования символов в строковые литералы JavaScript путем экранирования внеполосных символов в экранирование шестнадцатеричных символов JavaScript \ xNN. Простая версия начинается с чего-то вроде (непроверено, я не кодировщик VBScript):

 <%
    jsLiteral= Replace(StoredPath, "\", "\x5C")
    jsLiteral= Replace(jsLiteral, "'", "\x27")
    jsLiteral= "'" & jsLiteral & "'"
%>
<input ... onclick="deleteRecordAtt(<%= AttID %>, <%= Server.HTMLEncode(jsLiteral) >)">
 

Редактировать, чтобы добавить ответ редактировать:

objConn.Execute ("UPDATE EMAIL_SEND_ATTACHMENTS set ATTACHMENTS = Replace (LTRIM (RTRIM (ATTACHMENTS))", '"& StoredPath &"', '') WHERE EMAIL_LETTERS_HOLD_ID = "& AttID &" ")

Опять же, объединение строк без экранирования. Это дает вам ошибку SQL-инъекции - одинарная кавычка в вашей переменной StoredPath вызывает взрыв запроса. И если злоумышленник сказал что-то вроде:

 StoredPath=', ''));DROP TABLE EMAIL_SEND_ATTACHMENTS;--
 

Тогда прощай, база данных! Более вероятно, что вы подвергнетесь одной из многих атак с использованием автоматизированного внедрения кода SQL, которые в настоящее время распространяют российское вредоносное ПО в Интернете.

Избегайте строковых литералов SQL или, что лучше, используйте параметризованные запросы.

Я нажимаю "Да", и ничего не происходит

Еще раз убедитесь, что ошибки JavaScript включены, чтобы вы могли видеть любые проблемы. Я не знаю, проблема ли в этом, но:

 document.location.href="delete_attachments.asp?EMAIL_LETTERS_HOLD_ID="+AttID+"&RedirURL="+escape(document.location.href);
 

следует читать:

 location.href= "delete_attachments.asp?EMAIL_LETTERS_HOLD_ID="+AttID+"&RedirURL="+encodeURIComponent(location.href);
 

JavaScript escape () никогда не следует использовать, поскольку он тонко и досадно несовместим с правильной кодировкой URL, выполняемой encodeURIComponent ().

Также location - сокращение от window.location - на самом деле является другим объектом, чем document.location, и его следует использовать, если вы хотите переместить браузер на новую страницу. Запись в document.location не должна работать, хотя иногда она может работать в некоторых браузерах, если вам повезет.

  • опять же может быть связано с отсутствием надлежащего экранирования - если вы говорите «\ t» внутри строкового литерала JavaScript, это фактически означает управляющий символ табуляции (ASCII 9). Вот почему обратная косая черта должна быть заменена двойной обратной косой чертой.

    bobince19 января 2009, 16:46
  • thanks, the onclick is responding now but now it seems there is a problem in my function. it doesn’t seem to be reading the “storedpath” and executing the delete. so onclick prompts, i click yes, and nothing happens.

    MG.19 января 2009, 15:02
  • Спасибо за информацию ... я буду продолжать работать над этим. просто расстраивает то, что функция работает, когда я вручную устанавливаю storedpath = «c: \ test \ test.txt в исходном документе, но когда я пытаюсь передать его с главной страницы, он не отвечает. таааак близко ... пока так далеко ...

    MG.19 января 2009, 15:31
0

Может быть проблема в функции javascript deleteRecordAtt?
может быть, второй параметр рассматривается как несуществующая переменная?
Было бы полезно, если бы вы также добавили функцию Javascript.