gpt4 book ai didi

javascript - 传递两个变量时的onclick语法问题,经典asp

转载 作者:行者123 更新时间:2023-11-29 20:26:19 24 4
gpt4 key购买 nike

我的 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
%>

最佳答案

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

在不转义的情况下连接字符串——从来都不是一个好主意。大概 AttID 是一个整数,这就是为什么你不用那个参数,但 StoredPath 是一个字符串。由于您没有转义或包装该字符串,您上面的 Write 将以 HTML 代码结束,例如(假设“storedpath”是一个文件名):

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

当然,未加引号的“file.gif”不能解析为 JavaScript:会导致语法错误。确保您在浏览器中打开了脚本错误,这样您就可以看到何时出现此类错误,而不是静静地失败。

天真的解决方案是添加包装引号:

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

结果是:

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

这会起作用。但是,如果您的 StoredPath 变量中包含单引号怎么办?或 < 或 & 字符 - 这些总是需要使用 Server.HTMLEncode() 进行编码,除非您希望应用程序中存在跨站点脚本安全漏洞。

您需要的是一个 VBScript 函数,通过将带外字符转义为 JavaScript\xNN 十六进制字符转义,将字符转义为 JavaScript 字符串文字。一个简单的版本将以类似的东西开始(未经测试,我不是 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 注入(inject)错误 - StoredPath 变量中的单引号字符导致查询失败。如果攻击者说了类似的话:

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

然后哎呀,再见数据库!更有可能的是,您会受到目前在网络上传播俄罗斯恶意软件的众多自动 SQL 注入(inject)攻击之一的攻击。<​​/p>

转义您的 SQL 字符串文字,或者更好的是,使用参数化查询。

i click yes, and nothing happens

再次确保 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() 不应该被使用,因为它与 encodeURIComponent() 执行的正确 URL 编码微妙且恼人地不兼容。

还有 location - window.location 的缩写 - 实际上是与 document.location 不同的对象,如果您希望将浏览器移动到新页面,它是正确的使用对象。写入 document.location 应该不起作用,但如果幸运的话,有时在某些浏览器上它可能仍然可以。

关于javascript - 传递两个变量时的onclick语法问题,经典asp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/457669/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com