将错误的字符串作为javascript参数传递

时间:2009-12-31 20:16:06

标签: javascript jstl

我遇到了传递参数的问题,我认为我应该能够优雅地解决(使用1行代码),但我似乎无法解决问题。我有一个删除项目的链接,如下所示:

<a href="javascript:confirmDelete('${result.headline}',${result.id});">

当result.headline包含像'或'等字符或其他破坏javascript调用的字符时出现问题。我已经尝试${fn:replace(result.headline,"'","")}修复了问题'但是我想做某种URLEncode(我认为)所以这些角色不会打破javascript调用。有关如何在不改变后端任何内容的情况下修复此问题的任何想法?

2 个答案:

答案 0 :(得分:3)

避免在元素中放入内联JavaScript,特别是javascript:伪URL(除了永远不应该使用的邪恶之外)是HTML-in-URL-in-HTML。你必须采取标题:

  1. JavaScript字符串文字编码。 (替换\',控制字符和可能的Unicode字符,或者只使用JSON编码器为您执行此操作。)然后,
  2. 对其进行网址编码。然后,
  3. HTML编码。
  4. 最好将数据放在标记中,您只需要像其他地方一样担心简单的HTML编码,以避免跨站点脚本:

    <a href="#" class="confirmdelete-${fn:escapeXml(result.id)}" title="${fn:escapeXml(result.headline)}">Delete</a>
    

    让JavaScript解压缩它们:

    <script type="text/javascript">
        for (var i= document.links.length; i-->0;) {
            var link= document.links[i];
            if (link.className.indexOf('confirmdelete-')===0) {
                link.onclick= function() {
                    confirmDelete(this.title, this.className.substring(14));
                    return false;
                };
            }
        }
    </script>
    

    (使用实用程序函数或框架可能有更简单,更简洁或更清晰的方式来编写上述内容,并且有一个争论是关于链接是否真的是这种操作的正确标记,但这是基本的想法。)

答案 1 :(得分:0)

只要您可以依赖字符串没有换行符这一事实,您只需要将所有反斜杠加倍并转义所有单引号。

例如:

replace(replace(result.headline, "\\", "\\\\"), "'", "\\'")

这可能不是您服务器端语言中的有效语法;我不承认。