您希望如何处理<script>元素?</script>

时间:2008-11-12 14:15:08

标签: javascript html dom parsing serialization

想象一下以下内容。

  1. 将Html解析为dom树
  2. Dom Nodes以编程方式提供
  3. Dom节点可能或不可能以编程方式增加
  4. 增强节点被重新序列化为html。
  5. 我主要关于如何让“script”标签表现出来的问题。

    my $tree = someparser( $source ); 
    ....
    print $somenode->text(); 
    $somenode->text('arbitraryjavascript');
    ....
    print $tree->serialize(); 
    

    或者那个效果。

    在决定如何在易用性和便携性/可用性方面对该领域的内容进行适当处理时会出现问题。

    我自己想要做的是:

     $somenode->text("verbatim"); 
    

    - &GT;

      <script>
      // <!-- <![CDATA[ 
      verbatim
      // ]]> -->
      </script>
    

    所以我生产的东西都有点安全,而且验证友好。

    但是我犹豫不决,如果神奇地做这个是一个好主意,我是否应该有代码试图检测'安全块'的现有副本并在'解析'阶段替换它们/剥离它们。

    如果我不从输入中删除它,我可能会在输出阶段加倍,特别是如果稍后想要重新解析此代码的输出时会出现问题。

    如果我从输入中删除它将会产生有益的效果,即以编程方式获取脚本元素的内容,不会在任何一端看到安全块。

    最终会有一种方法可以解决这种行为,但问题是/ default /处理方式应该是什么,以及为什么。

    可能我的整个推理在这里有缺陷,除非想要处理,否则文本内容应该完全未经处理。

    在这样的工具中寻找什么行为?请指出我可能忽略的任何理由。


    TLDR摘要: 我应该如何以编程方式处理这些脚本中的转义机制,即输入/输出方面两端的“//<!--<![CDATA[”安全填充

2 个答案:

答案 0 :(得分:1)

我在这里添加了自己的答案,所以我更加明显地想要找到答案。我已经确定的当前想法将表现如下:

my $html=<<'EOF'
<script>
//<!--<![CDATA[
foo
//]]>-->
</script>
EOF
#/# this line is here for the syntax highlighter
my $obj = parse($html); 
print $obj->text(); 
# foo
$obj->text("bar");
print $obj->text(); 
# bar
print $obj->html(); 
# <script>
# //<!--<![CDATA[
# bar
# //]]>-->
# </script>

重点是:

  1. 为内部代码视图删除了xml / html / legacybrowser / bot保护机制。
  2. 因此可以操纵内联代码,就好像它们不在那里一样。
  3. 重新导出修改后的代码会重新启用保护机制。
  4. 如果有

    1. 无保护机制
    2. 不同(即:没有//,或没有<!-,或没有<!)部分
    3. 现有的保护措施将被剥夺并替换为上述沼泽标准。

答案 1 :(得分:0)

我能想到的唯一类似的是ASP.NET的寄存器脚本块函数。它们都有一个重载,它是否应该添加脚本标记。

以下是一个文档的链接:

http://msdn.microsoft.com/en-us/library/bahh2fef.aspx