这些字符在 HTML、Postgres 和 Bash 中使用是否安全?

Are these characters safe to use in HTML, Postgres, and Bash?

我有一个项目,我试图让其他可能有敌意的编码人员以小写形式标记将在不同上下文中显示的各种属性,包括嵌入 HTML、保存和操作Postgres,在 JavaScript 中用作属性标签,并在 shell 中进行操作(例如,将数据文件保存为 продажи.zip)以及各种数据分析工具,如 graph-tool 等。

我以前参与过多语言项目,但他们要么是不需要特别担心复杂攻击的较小客户,要么是我在之后才参与的项目多语言方面已经到位,所以我不是负责验证安全性的人。

我很确定这些应该是安全的,但我不知道是否有我需要注意的陷阱,比如汉字中的特殊 [TAB] 或 [QUOTE] 字符设置可能逃过我的转义。

我可以在我的正则表达式过滤器中使用这些吗?

dash       = '-'
english    = 'a-z'
italian    = ''
russain    = 'а-я'
ukrainian  = 'ґї'
german     = 'äöüß'
spanish    = 'ñ'
french     = 'çéâêîôûàèùëï'
portuguese = 'ãõ'
polish     = 'ąćęłńóśźż'
turkish    = 'ğışç'
dutch      = 'áíúýÿìò'
swedish    = 'å'
danish     = 'æø'
norwegian  = ''
estonian   = ''
romainian  = 'șî'
greek      = 'α-ωίϊΐόάέύϋΰήώ'
chinese    = '([\p{Han}]+)'
japanese   = '([\p{Hiragana}\p{Katakana}]+)'
korean     = '([\p{Hangul}]+)'

如果您限制自己使用 7 位 ASCII 兼容子集的文本编码,那么在与最健全的编程语言和工具。如果你使用 perl6,那你就不走运了 ;)

您应该避免支持或特别注意使用文本编码 Shift-JIS 的文本输入或输出,其中 ¥ 符号位于 0x5c,其中 \通常会居住。这为利用编码转换进行恶意欺骗提供了机会。

避免或格外小心其他非 ascii 兼容的编码。 EBDIC 就是其中之一,但您不太可能在野外遇到它。 UTF-16 和 UTF-32 很明显,但如果你处理不当,结果会非常明显。

阅读:

我个人认为你的做法是倒退的。您应该根据每个目标工具或语言的词法语法定义输入和输出函数以转义和取消转义字符串,而不是试图禁止任何可能的元字符。但是我不知道你的情况,也许这对你所做的事情来说是不切实际的。

我不太确定您的实际问题是什么。如果您正确地将文本转换为目标格式,那么您就不会关心文本可能是什么。这将确保正确的转换和安全。

例如:

  • 如果您的文本要包含在 HTML 中,应该使用适当的 HTML 引用函数对其进行转义。

    示例:

    错误

    // XXX DON'T DO THIS XXX
    echo "<span>".$variable."</span>"
    

    右:

    // Actual encoding function varies based your environment
    echo "<span>".htmlspecialchars($variable)."</span>"
    

    是的,这也能正确处理包含 &< 的文本。

  • 如果要在 SQL 查询中使用您的文本,则应使用参数化查询。

    示例:

    错误

    // XXX DON'T DO THIS XXX
    perform_sql_query("SELECT this FROM that WHERE thing=".$variable")
    

    // Actual syntax and function will vary
    perform_sql_query("SELECT this FROM that WHERE thing=?", [$variable]);
    
  • 如果您的文本要包含在 JSON 中,只需使用适当的 JSON 编码函数即可。

    示例:

    错误

    // XXX DON'T DO THIS XXX
    echo '{"this":"'.$variable.'"}'
    

    // actual syntax and function may vary
    echo json_encode({this: $variable});
    

shell 有点棘手,在许多环境中处理非 ASCII 字符通常很痛苦(例如 FTP 或在不同环境之间执行 scp ).所以不要为文件使用显式名称,使用标识符(数字 id、uuid、哈希...)并将映射存储到其他地方(在数据库中)的实际名称。