2009-01-19 65 views
2

我的onclick函数工作的很好,当我传递一个变量,并且一旦我尝试传递两个变量就不响应。我的语法有问题吗?当传递两个变量时,onclick语法问题,传统的asp

支持此代码的所有内容都已经过测试,并且工作正常,所以我确定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 
%> 
+0

可以StoredPath包含双引号?你能发布这个HTML生成吗? – Tomalak 2009-01-19 14:12:17

+0

此代码易受sql注入影响 – 2011-12-01 22:56:51

回答

3

的onclick = “” deleteRecordAtt( “& AttID &”, “& StoredPath & ”)“”

连接字符串没有逃脱 - 从来就不是一个好主意。推测AttID是一个整数,这就是为什么你用这一个参数逃脱,但StoredPath是一个字符串。正如你也没能逃脱或包裹该字符串,你上面的写操作将结束与HTML代码所示(假设“storedpath”的,例如,文件名):

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

带引号的“file.gif中”是当然不能作为JavaScript进行分析:语法错误结果。确保你的浏览器已经打开了脚本错误,这样你就可以看到类似这样的事情出错了,而不是只是默默地失败。

天真的解决方案是增加包装纸报价:

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

导致:

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

这将正常工作。但是如果你的StoredPath变量有一个单引号呢?或者<或&字符 - 无论如何,这些总是需要使用Server.HTMLEncode()进行编码,除非您希望在应用程序中存在跨站点脚本安全漏洞。

通过将带外字符转义为JavaScript \ xNN十六进制字符转义符,您将需要一个VBScript函数来将字符转义为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集附件=更换(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的越狱()不应该永远被使用,因为它是巧妙地与烦人不兼容由encodeURIComponent()执行的正确的URL编码。

同样位置 - window.location的缩写 - 实际上是document.location的一个不同的对象,并且如果您希望将浏览器移动到新页面,则是正确的。写入document.location不应该起作用,尽管如果幸运的话,它在某些浏览器中仍然可以使用。

0

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

+0

如你所愿...我刚刚发布了详细信息.... – 2009-01-19 14:44:28