Синтаксическая проблема Onclick при передаче двух переменных, классический asp - PullRequest
2 голосов
/ 19 января 2009

Моя функция 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 голосов
/ 19 января 2009

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 содержит одинарную кавычку? Или символ <или & - для этого всегда требуется кодировка с использованием Server.HTMLEncode (), если только вы не хотите, чтобы в вашем приложении были дыры в безопасности межсайтовых сценариев. </p>

Вам понадобится функция 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);

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

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

0 голосов
/ 19 января 2009

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

...