【问题标题】:Safe unicode string / name安全的 unicode 字符串/名称
【发布时间】:2017-04-14 05:59:48
【问题描述】:

假设我有一个表单元素,它应该允许几乎任何合理的字符串命名某些东西(例如这个问题的标题)。

我如何验证字符串是合理的,而不是奇怪或不安全的东西? (这里假设像Unicode表情符号☺这样的东西是合理的)

检查所有转义字符,如换行符、换页符等,当然是给定的。长度之类的东西虽然比较难,因为只有 1 个字符的英文描述性名称非常难,但在中文中微不足道。

大约有 31 个 Unicode 类,哪些是安全的?

在 Javascript 或 C# 中完整的正则表达式或类似检查是什么样的?

【问题讨论】:

  • 就上下文而言,您试图使其安全的是什么?插入数据库、XSS 或未经验证的用户输入是否安全?
  • 以上所有。
  • 只要你对你的sql命令使用参数化查询,任何输入都可以安全地防止sql注入。此时,您只需要在数据库中指定要存储数据的列是 unicode。当您显示任何内容时,您需要确保使用 HTML 编码程序,这些程序可用于 javascript 以及大多数服务器端脚本语言。
  • [A-Z] 是唯一一个对于所有可能和合理的地方都可以发送此类数据的选项。即使是小写字母也可能使用不正确的 UTF-7 编码来破坏代码......绝对数字可能会被错误地视为带有错误代码的数字...... {拖钓结束} - 您需要定义比“安全”更好的目标让问题得到回答。
  • @AlexeiLevenkov 输入类似于此问题的标题

标签: javascript c# unicode


【解决方案1】:

我如何验证字符串是合理的,而不是奇怪或不安全的东西?

不清楚您所说的“不安全”是什么意思。正如@gmiley 所说,您无法通过过滤输入来防止XSS 等注入问题;这是一个输出转义问题。

至于“合理”,一个好的起点应该是:

  • 正如您所提到的,不允许使用控制字符:U+0000–U+001F 和 U+007F–U+009F,如果您想允许这些,请减去换行符和制表符。

  • 特别是对于 Web 应用程序,根据 unicode-xml 注释,不允许使用“不适合在标记中使用”的字符。这可以防止像 Right-to-Left-Override 这样的布局技巧。

  • Unicode 规范化(C# 中的String.Normalize),例如用于标准化组合重音的代码点的范式 C,或用于扁平化诸如 fullwidth 文本之类的怪异的范式 KC,您可能会也可能不会想做什么取决于观众。

  • 如果你不喜欢 Zͪa̻͍l̀g̐ͦ͢oͬ̓ṯ̺ͮěͧ̚͞x͕̀̇ṱ̢͖̩̮̆̃ͤ,你可以考虑limiting consecutive combiners

【讨论】:

    猜你喜欢
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2018-11-03
    • 2011-11-20
    相关资源
    最近更新 更多