`
yiminghe
  • 浏览: 1466266 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

tokenization of html

 
阅读更多

html 符号解析问题

 

场景:

 

在页面上输出包含已有数据的 textarea ,一般的做法即是,将所有的数据从数据库取出后都 escapeHtml 一下:

 

<textarea>&lt;script&gt;if(a&amp;&amp;1)alert(1);&lt;script&gt;</textarea>

 

页面瞬时增大了很多,特别是对于富文本情况(包含了很多 < > &) 等,但这又是必须做的,否则会被恶意结束 textarea 标签而造成 script 注入问题,但还是存在可以进一步减少体积的余地。

 

 

规范:

 

查看 html 对 textarea 标签及其内容的解析规则 :实际上textarea 的内容解析规则是按照 RCDATA 类型(一系列状态),简单描述如下

 

1. 遇到 & ,尽力得到实体字符 代表的值

2. 遇到 < , 如果下一个字符为 / 则结束当前标签

3. 否则作为 textarea 内容

 

恶意结束标签主要发生在 2 ,那么我们只要打破 2 ,保证 < 和 / 不相连即可,在服务器端渲染页面事先只做一点处理,再把处理后的内容放在 textarea 中:

 

"<a>x</>".replace(/<\//gi,"&lt;/")

 

而如果允许用户输入 &gt; 等代表实体字符的字符串,则还要进行 & 替换:

 

"<a>x</>".replace(/&/gi,"&amp;")

 

最终页面体积也能减小不少.

 

其他类型:

 

 tokenization 部分还存在其他特殊类型的解析规则,比如常见的 script ,在 xhtml 时代,推荐的写法是:

 

<script type="text/javascript">
/* <![CDATA[ */
// TODO
/* ]]> */
</script> 

 

这在 html 中也是支持的, cdata 的解析规则 比较简单:在遇到 ]]> 之前都算作 script 的内容,并不解析实体字符.

 

而 html 则是完全可以不用 cdata 这个规则的 ,script 解析本身就是一种单独规则了:

 

1. 类似 rcdata (因此代码中不能出现类似 "</script>",必须改做 "<\/script>"),但是不解析实体字符

2. 还识别了 <!-- ,似乎是为了兼容不支持js的远古浏览器的注释:

 

 

<script type="text/javascript">
<!-- // hide from really old browsers that noone uses anymore
// TODO
// -->
</script> 

 

这在现在看来则是完全不必要了。

 

 

 

 

分享到:
评论
2 楼 deng131 2011-09-24  

1 楼 lifesinger 2011-08-30  
顶,很不错的文章。

相关推荐

    Python Text Processing with NLTK 2.0 Cookbook.pdf

    Get started off with learning tokenization of text. Receive an overview of WordNet and how to use it. Learn the basics as well as advanced features of stemming and lemmatization. Discover various ...

    浅谈Python NLP入门教程

    **词性标注(Part-of-Speech Tagging):** - 识别每个词的语法类别(名词、动词等)。 - NLTK库提供了多种词性标注的方法。 **命名实体识别(Named Entity Recognition, NER):** - 自动识别文本中的实体名称...

    [深度学习] 自然语言处理 --- NLP入门指南_小墨鱼的专栏-程序员宅基地 - 程序员宅基地1

    4. **词性标注(Part-of-Speech tagging)**:识别每个词的语法角色。 5. **命名实体识别(NER)**:识别文本中的专有名词,如人名、地名、组织名。 6. **分块(Chunking)**:识别文本中的短语结构,如名词短语、...

    NLP自然语言中英文本预处理

    6. ** Out-of-Vocabulary (OOV) 处理**:处理未在训练集中出现的新词,可以使用词嵌入技术来近似表示。 7. ** 数字和特殊字符处理 **:将数字和特殊字符转换为文本表示或移除,防止干扰模型训练。 在实际应用中,...

    搜索引擎技术教程 网络搜索引擎原理-第3章 网络搜索与信息检索 共103页.pptx

    - **文档预处理**:在处理文档之前,需要对其进行一系列预处理操作,包括分词(Tokenization)等步骤。 - **分词**:将文本流分解成有意义的基本单元,如单词、短语或符号等。这些单元被称为“令牌”(Tokens)。 - **...

    Text Mining and Visualization

    1. **文本预处理**:包括分词(Tokenization)、去除停用词(Stop Words Removal)、词干提取(Stemming)和词形还原(Lemmatization)等步骤,目的是将原始文本转换为适合后续处理的形式。 2. **特征提取**:如词袋...

    Natural-Language-Processing-Part-1-

    在NLP的初步学习中,常见的任务包括词性标注(Part-of-Speech Tagging)、命名实体识别(Named Entity Recognition)、停用词移除(Stop Word Removal)和词干提取(Stemming/Lemmatization)。词性标注是给每个单词...

    PYTHON自然语言处理中文翻译 NLTK 中文版.pdf

    - 分词(Tokenization) - 词干提取与词形还原(Stemming & Lemmatization) 5. **特征抽取与表示** - 特征选择的重要性 - Bag of Words模型 - TF-IDF向量化 - Word Embeddings(如Word2Vec、GloVe) 6. **...

    PYTHON自然语言处理 NLTK 中文版

    - 分词(Tokenization)与词干提取(Stemming) - 停用词(Stop Words)处理 - 词形还原(Lemmatization) 4. **特征抽取与表示** - 特征选择的重要性和方法 - Bag of Words模型 - TF-IDF(Term Frequency-...

    Natural.Language.Processing.Python.and.NLTK

    **词性标注**(Part-of-Speech Tagging, POS tagging)是指给每个词加上其对应的词性标记。这是NLP中的基础任务之一,对于后续的高级应用非常重要。 - **斯坦福词性标注器**(Stanford Tagger): 使用最大熵模型实现的...

    nlp:NLP实验

    - **分词(Tokenization)**:将句子拆分成单词或标记的过程。 - **停用词(Stop Words)**:常见但不包含太多信息的词语,如“的”、“是”等,通常在预处理时被移除。 - **词干提取(Stemming)**:减少单词到...

    NLP100

    1. 分词(Tokenization):将文本分割成有意义的单元,如单词或短语。 2. 停用词移除(Stop Word Removal):去除常见的无意义词汇,如“的”、“在”、“和”等。 3. 词干提取(Stemming)与词形还原...

Global site tag (gtag.js) - Google Analytics