<p>前段时间, 完成了一个HTML危险标记删除安全项目。 项目里, 把所有必要的字符进行实体转换。 做完了心想, 这次总不会弄出什么bug吧。 这个代码经过了非常严格的测试, 也是我基于测试驱动开发的不多的尝试。 结果还是有个恶心的bug. 发现单引号(<strong>'</strong> ) 实体转化(<strong>&apos;</strong> )后, 不能被IE6解释解释,显示成原型了, FF等其他的经过测试都能正确显示。, 简直是气人, 翻阅资料后发现, 原来W3C并没有规定HTML里的单引号需要经过实体转化, 这个转义是XML的标准。 微软这回还可真遵循了标准!!!</p>
<p> 发现问题后, 为了防止出现HTML格式破损。 还是把单引号实体转化成<strong>&#39;</strong> 这样可以避免显示数据在标记属性里的问题。可能有人会问我为什么不使用jakarta commons包里的StringEscapedUtil的方法。没错, 这个东西是很好。 我的项目对性能要求非常高, 我修正了这个StringEscapedUtil。htmlEscaped()方法, 提高了很多性能。并且我原来是使用nekohtml的转义函数, 就是他对单引号做了转义。</p>
<p>==============================================</p>
<p>下面这个代码演示了节约内存分配的办法, 小技巧而已。</p>
<div class="dp-highlighter">
<div class="bar">
<div class="tools">Java代码 <a title="复制代码" href="http://sdh5724.javaeye.com/blog/336948#"><img src="http://sdh5724.javaeye.com/images/icon_copy.gif" alt="复制代码"></a>
</div>
</div>
<ol class="dp-j">
<li><span><span class="comment"><span style="color: #008200;">//大部分字符串是不需要转移的,因此避免内存分配是必要的。 </span></span><span></span></span></li>
<li>
<span class="keyword"><strong><span style="color: #7f0055;">public</span></strong></span><span>Stringescape(Stringstr){ </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">if</span></strong></span><span>(str==</span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>){ </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">return</span></strong></span><span></span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>; </span>
</li>
<li><span>} </span></li>
<li>
<span>StringBuilderbuffer=</span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>; </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">int</span></strong></span><span>len=str.length(); </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">char</span></strong></span><span>ch; </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">char</span></strong></span><span>[]entityName; </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">for</span></strong></span><span>(</span><span class="keyword"><strong><span style="color: #7f0055;">int</span></strong></span><span>i=</span><span class="number"><span style="color: #c00000;">0</span></span><span>;i<len;i++){ </span>
</li>
<li><span>ch=str.charAt(i); </span></li>
<li><span>entityName=getEntity(ch); </span></li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">if</span></strong></span><span>(entityName==</span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>){ </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">if</span></strong></span><span>(buffer!=</span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>){ </span>
</li>
<li><span>buffer.append(ch); </span></li>
<li><span>} </span></li>
<li>
<span>}</span><span class="keyword"><strong><span style="color: #7f0055;">else</span></strong></span><span>{ </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">if</span></strong></span><span>(buffer==</span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>){ </span>
</li>
<li>
<span>buffer=</span><span class="keyword"><strong><span style="color: #7f0055;">new</span></strong></span><span>StringBuilder(str.length()<<</span><span class="number"><span style="color: #c00000;">1</span></span><span>); </span>
</li>
<li>
<span>buffer.append(str,</span><span class="number"><span style="color: #c00000;">0</span></span><span>,i); </span>
</li>
<li><span>} </span></li>
<li><span>buffer.append(entityName); </span></li>
<li><span>} </span></li>
<li><span>} </span></li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">if</span></strong></span><span>(buffer!=</span><span class="keyword"><strong><span style="color: #7f0055;">null</span></strong></span><span>){ </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">return</span></strong></span><span>buffer.toString(); </span>
</li>
<li>
<span>}</span><span class="keyword"><strong><span style="color: #7f0055;">else</span></strong></span><span>{ </span>
</li>
<li>
<span></span><span class="keyword"><strong><span style="color: #7f0055;">return</span></strong></span><span>str; </span>
</li>
<li><span>} </span></li>
<li><span>}</span></li>
</ol>
</div>
分享到:
相关推荐
这有助于提高代码的可读性和减少由于转义字符使用不当导致的bug。例如,错误地使用转义字符可能会导致程序崩溃或者产生不可预见的行为,尤其是在处理字符串数据和文件路径时。 此外,在C和C++中,转义字符不仅可以...
本文将详细探讨Java中的一个特定转义字符相关的bug,以及它如何影响程序的预期行为。 在Java中,转义字符通常由一个反斜杠(\)后跟一个或多个字符组成。例如,"\n" 代表换行符(LineFeed),"\t" 代表制表符,而"\...
之前需求让解析excel表格后来用户用了有bug,大半夜起来找原因发现问题是这样的。表格中的某个值用户填写为1800(XSSFWorkbook解析为Double类型),后台解析为1800.0,但我只想保留1800对应数据库的字典表,所以就转换...
htmlspecialchars函数的主要功能是将特殊字符转换为对应的HTML实体,以防止在输出到HTML页面时被...开发者在编码过程中应勤于查阅官方文档和相关技术文章,以了解最新的函数特性与更新日志,保证代码的稳定性和安全性。
在HP-UX中,最常见的转义字符是反斜杠“\”。通过在特殊字符前添加反斜杠,可以告知系统将该字符视为普通文本的一部分,而不是具有特殊含义的指令。例如,如果密码中包含了“@”字符,正确的输入方式应该是“\@”。...
这段代码会检查全局变量 `$_POST`、`$_GET` 和 `$_COOKIE` 是否包含转义字符,并进行处理。 在使用这些方法前,需要仔细检查服务器设置和ThinkPHP框架的版本,以确保改动的安全性和适用性。对于使用ThinkPHP框架的...
在IT行业中,字符编码是处理文本数据的基础,不同的编码方式会影响程序如何存储和显示文本。本文将深入探讨UTF8和ANSI String之间的转换处理,特别关注在DELPHI7环境下如何进行这种转换,并通过动态链接库(DLL)...
当前cefNet版本105.3.22248.142,配合CefNet.Avalonia.Eleven在程序里面使用,底层库存在按键字符转义的bug,导致展示的网页里面无法输入中文的bug。异常信息: System.InvalidOperationException:“Incompatible ...
4. 对用户输入进行过滤和转义,防止XSS和SQL注入等攻击。 5. 使用最新的PHP版本和安全的第三方库,定期更新以获取安全补丁。 总结来说,PHP Bug Scanner是一款强大的代码审计工具,能有效帮助开发者发现和修复PHP...
当模版字符串中包含转义字符时,`tmpl`引擎可能会出现错误。例如,在模版中使用斜杠`/`作为分隔符时,如果数据也包含斜杠,则会导致解析失败。 **示例**: ```javascript tmpl('%=name%//%=id%', { name: '糖饼', ...
正则表达式(Regex)是计算机编程语言中用于处理字符串的强大工具,它允许我们通过模式匹配来搜索、替换和提取文本。RegTool是一款专为测试正则表达式设计的实用工具,它帮助开发者验证和调试自己的正则表达式,确保...
因为c# 自带的MaskedTextBox 控件 用'_'占位看起来很不...* 字符 0 数字 \用户转义字符 原形输出 {0,4} 表示前面一个数字或字符最少和最多出现次数(对\后的字符不起作用) 例:0{4,4}\年0{2,2}\月0{2,2}\日 为日期格式
但事实上,这样做会在正则表达式解析器抛出异常,因为它期待一个转义字符后应该跟随一个可转义的特殊字符。正确的做法是使用四个反斜杠 "\\\\",这在Python字符串中表示两个反斜杠,然后在正则表达式中被解析为一个...
10. `\`:转义字符,用于对特殊字符进行转义,如`\d`代表一个数字,`\s`代表一个空白字符。 正则表达式还可以使用预定义的字符类,如: - `\d`:等价于 `[0-9]`,匹配任何数字。 - `\D`:等价于 `[^0-9]`,匹配非...
然而,"Forms 验证的Bug"是一个常见问题,可能导致用户体验下降,甚至可能为系统安全留下隐患。在此,我们将深入探讨表单验证中的常见错误,以及如何有效地解决这些问题。 1. **验证逻辑错误**:这可能是最常见的...
7. **转义字符陷阱**:不当使用转义字符可能导致字符串解析错误。 8. **打印输出类名陷阱**:System.out.println()打印对象时默认调用toString(),可能需要覆盖该方法以得到期望的输出。 9. **随机数的问题**:...
一站式Linux C学习 本资源是关于Linux平台上的C语言...本资源详细介绍了C语言的基础知识和Linux平台上的开发环境,包括GCC编译器、警告信息、转义序列、控制字符、头文件和库函数、数学函数、C标准库和glibc等内容。
具有不可见字符显示、显示发送数据内容开关、ModBus CRC校验工具、16位算数和计算工具、字符十六位格式转换、字符个数统计、十六进制字节数统计、自动发送、自动回复等功能。支持流控功能、可以在WIN2K上使用。无比...
标题 "XSS转码 && struts2 property标签的bug" 指向的是一个关于Web安全的话题,特别是针对Struts2框架的一个特定安全问题。XSS(Cross-site scripting)是Web应用中的常见安全漏洞,而Struts2是Java开发中的流行MVC...
1. 正确处理字符串和字符常量内的转义字符,如`\n`、`\t`和`\"`。 2. 处理注释,包括单行`//`注释和多行`/* */`注释。 3. 区分标识符和关键字,尤其是在C++中,因为关键字不能作为标识符使用。 4. 检测并处理非法...