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 не должна работать, хотя в некоторых браузерах она может иногда работать, если вам повезет.