安全考虑
了解Unicode文本转换和处理的安全影响。
输入验证
Unicode范围验证
- 有效范围:0 ≤ code ≤ 0x10FFFF
- 无效代码:拒绝或清理范围外的代码
- 代理对:验证正确的高/低代理配对
格式验证
- 十进制输入:确保数值在有效范围内
- 十六进制输入:验证十六进制格式和范围
- 转义序列:检查格式正确的转义序列
- HTML实体:验证实体语法和数值
字符编码安全
同形异义攻击
Unicode允许看起来相同但不同的字符:
拉丁文'a'(U+0061)vs 西里尔文'а'(U+0430)
拉丁文'o'(U+006F)vs 希腊文'ο'(U+03BF)
缓解策略:
- 使用Unicode规范化(NFC/NFD)
- 实现字符集限制
- 针对已知字符集进行验证
双向文本
某些Unicode字符可以改变文本方向:
- RTL覆盖:U+202E(从右到左覆盖)
- LTR覆盖:U+202D(从左到右覆盖)
- 弹出方向格式:U+202C
安全影响:
- 可以隐藏恶意内容
- 可能绕过文本过滤器
- 可能混淆用户
XSS防护
HTML实体编码
将Unicode转换为HTML实体时:
<!-- 安全 -->
<script>alert('XSS')</script>
<!-- 如果未正确转义则危险 -->
<script>
alert('XSS');
</script>
JavaScript转义序列
在JavaScript上下文中:
// 安全
var text = "\u003Cscript\u003Ealert('XSS')\u003C/script\u003E";
// 如果被评估则危险
var text = "<script>alert('XSS')</script>";
数据清理
输入清理
- 移除控制字符:过滤危险的控制字符
- 规范化Unicode:使用Unicode规范化形式
- 验证编码:确保正确的UTF-8编码
- 长度限制:实施合理的长度限制
输出清理
- 上下文感知转义:根据输出上下文进行转义
- 格式验证:确保输出格式有效
- 字符过滤:移除或替换危险字符
隐私考虑
数据存储
- 本地存储:转换历史存储在浏览器本地
- 无服务器传输:数据不会离开用户设备
- 自动清理:历史自动限制为50条记录
数据处理
- 内存管理:高效处理大输入
- 临时存储:浏览器会话结束时清除数据
- 无日志记录:不记录或传输转换数据
最佳实践
输入处理
// 验证Unicode码点
function isValidUnicode(code) {
return code >= 0 && code <= 0x10ffff && !(code >= 0xd800 && code <= 0xdfff); // 无代理
}
// 清理输入
function sanitizeInput(input) {
return input.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, '');
}
输出处理
// 安全的HTML实体编码
function encodeHTML(text) {
return text.replace(/[&<>"']/g, function (match) {
return '&#' + match.charCodeAt(0) + ';';
});
}
// 安全的JavaScript转义
function escapeJS(text) {
return text
.replace(/\\/g, '\\\\')
.replace(/'/g, "\\'")
.replace(/"/g, '\\"')
.replace(/\n/g, '\\n')
.replace(/\r/g, '\\r');
}
常见漏洞
Unicode规范化攻击
- 规范等价:同一字符的不同表示
- 兼容等价:视觉相似但不同的字符
- 缓解:始终规范化Unicode输入
缓冲区溢出防护
- 长度验证:处理前检查输入长度
- 内存限制:实施合理的处理限制
- 错误处理:优雅处理超大输入
注入攻击
- SQL注入:为数据库查询清理Unicode输入
- 命令注入:在系统命令中验证Unicode输入
- 模板注入:在模板引擎中转义Unicode
合规和标准
Unicode标准
- Unicode 15.0:最新Unicode标准合规
- UTF-8编码:正确的UTF-8处理
- 规范化:Unicode规范化支持
安全标准
- OWASP指南:遵循OWASP Unicode安全指南
- 输入验证:实施全面的输入验证
- 输出编码:使用适当的输出编码
监控和日志
安全监控
- 输入模式:监控可疑输入模式
- 错误率:跟踪转换错误率
- 性能:监控处理性能
审计跟踪
- 转换历史:用户参考的本地历史
- 错误日志:记录转换错误(无敏感数据)
- 使用统计:匿名使用统计
建议
- 始终验证:处理前验证所有Unicode输入
- 上下文重要:为输出上下文使用适当的转义
- 保持更新:保持Unicode库和标准更新
- 彻底测试:使用各种Unicode字符和边缘情况测试
- 记录安全:为团队记录安全考虑
- 定期审查:定期审查和更新安全措施