简短的回答,不,除了“干净”的非常具体的定义。现在您必须使用特定于语言的解决方案——对于 SQL,只需使用准备好的语句。
更长的答案是,最近有关于自动字符串清理器的工作,它找出如何将纯文本内容安全、正确地合并到其他语言的内容中。
模板语言中的 HTML 存在自动上下文自动转义符,例如 Soy、Go、jQuery 的变体、cTemplates、clearsilver 以及希望不久的其他语言。
目前正在研究推广这一点,以便可以轻松地将其扩展到其他语言。我正在研究的一个想法是采用带注释的语法来描述目标语言(如 SQL),并找出需要对可以填充用户数据的漏洞进行哪些转义。
给定如下文法,其中包含显示数据结构如何映射到语言中的子字符串的注释:
JSONValue := JSONNullLiteral
| JSONBooleanLiteral
| JSONObject
| JSONArray
| JSONString
| JSONNumber ;
JSONObject := @KeyValueMap ([{] JSONMemberList? [}]) ;
JSONMemberList := JSONMember ([,] JSONMemberList)? ;
JSONMember := @Key JSONString [:] @Value JSONValue ;
JSONNullLiteral := @ValueNull "null" ;
JSONBooleanLiteral := @ValueFalse "false" | @ValueTrue "true" ;
JSONArray := @List("[" (JSONValue ([,] JSONValue)*)? "]") ;
JSONString := @String ([\"] JSONStringCharacters? [\"]) ;
JSONNumber := @Number (Sign? (Mantissa Exponent? | Hex)) ;
JSONStringCharacters := JSONStringCharacter JSONStringCharacters? ;
JSONStringCharacter := @Char ([^\"\\\x00-\x1f])
| JSONEscapeSequence ;
JSONEscapeSequence := "\\" @Char [/\\\"]
| @Char{[\x08]} "\\b"
| @Char{[\x0c]} "\\f"
| @Char{[\x0a]} "\\n"
| @Char{[\x0d]} "\\r"
| @Char{[\x09]} "\\t"
| @Char ("\\u" @Scalar (hex hex hex hex)) ;
Mantissa := (Integer ([.] Fraction?) | [.] Fraction) ;
Exponent := [Ee] Sign? decimal+ ;
Integer := [0] | [1-9] [0=9]* ;
Fraction := [0-9]+ ;
Hex := [0] [Xx] hex+ ;
Sign := [+\-] ;
我们可以构建如下状态机:
将事件序列(start、start_object、start_key、字符'x'...)转换为将字符编码到缓冲区的指令。
从该状态机,我们还可以生成通用指令跟踪,用于为编码器生成高效代码,并希望上下文分析算法能够确定何时应用哪些编码器。
如果可行,它将很容易融入通用编程语言,自动安全地以 SQL、HTML 等语言编写内容的机制。通过调整语言定义以允许 execute_query 找到execute_query("SELECT * FROM Table WHERE ID=$ID") 中程序员指定内容和注入内容之间的界限,并使用这些界限自动转义注入的内容,我们可以使该成语按程序员的意图工作。