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

时间:2009-01-19 14:07:26

标签: javascript asp-classic ado

当我传递一个变量时,我的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 个答案:

答案 0 :(得分:3)

  

onclick =“”deleteRecordAtt(“&amp; AttID&amp;”,“&amp; StoredPath&amp;”)“”

连接字符串而不转义 - 绝不是个好主意。大概是AttID是一个整数,这就是你逃避这一个参数的原因,但StoredPath是一个字符串。由于您没有转义或包装该字符串,因此您的上面的代码将以HTML代码结尾(例如,假设'storedpath'是文件名):

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

未加引号的'file.gif'当然不能解析为JavaScript:语法错误结果。确保在浏览器中打开了脚本错误,这样您就可以看到这样的错误,而不是只是默默地失败。

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

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

导致:

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

哪个会奏效。但是如果你的StoredPath变量中有一个单引号怎么办?或者&lt;或者&amp;字符 - 无论如何,这些始终需要使用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)),”&amp; StoredPath&amp;“','')WHERE EMAIL_LETTERS_HOLD_ID =”&amp; AttID&amp;“”)

再次,连接字符串而不转义。这个给你一个SQL注入错误 - 你的StoredPath变量中的单引号字符会导致查询爆炸。如果攻击者说了类似的话:

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

转义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(),因为它与encodeURIComponent()执行的正确的URL编码巧妙地和烦人地不兼容。

另外,location - window.location的缩写 - 实际上是document.location的一个不同对象,如果你想将浏览器移动到一个新页面,它是正确的。写入document.location不应该起作用,尽管如果你幸运的话,它有时候仍会在某些浏览器上运行。

答案 1 :(得分:0)

这是javascript deleteRecordAtt函数中的问题吗?
也许第二个参数被视为不存在的变量? 如果您添加Javascript函数也会有所帮助。