在SQL代码中\%s\'和“%s”之间有什么区别

在SQL代码中\%s\'和“%s”之间有什么区别,sql,c,sqlite,Sql,C,Sqlite,我一直在试图找出SQL中\字符用法的差异 例如,提供的一行代码如下: ... WHERE username=\"%s\" AND id=%s" 添加\字符意味着什么?假设这是类似于 char sql[] = "SELECT * FROM foo WHERE username=\"%s\" AND id=%s"; 它只是对字符进行转义,这样就不会结束字符串。生成的SQL是 SELECT * FROM foo WHERE u

我一直在试图找出SQL中\字符用法的差异

例如,提供的一行代码如下:

...  WHERE username=\"%s\" AND id=%s"

添加\字符意味着什么?

假设这是类似于

char sql[] = "SELECT * FROM foo WHERE username=\"%s\" AND id=%s";
它只是对字符进行转义,这样就不会结束字符串。生成的SQL是

SELECT * FROM foo WHERE username="%s" AND id=%s
除此之外,还有一个额外的漏洞

字符串文字使用“.”。使用表示标识符,如表名或列名。如果不存在这样的标识符,SQLite将假定它是字符串文本。攻击者可以通过提供与标识符匹配的值来利用此漏洞

SQLite在两个方向上都提供了这种模糊性

如果在允许标识符但不允许字符串文字的上下文中使用单引号中的关键字,例如:“key”或“glob”,则令牌被理解为标识符而不是字符串文字。 如果双引号ex:key或glob中的关键字用于无法解析为标识符但允许使用字符串文字的上下文中,则令牌被理解为字符串文字而不是标识符。
在SQLite中,这完全是错误的,甚至不会运行。我怀疑这段代码是在SQL以外的编程语言的程序中编写的。我假设这是在编写SQL的任何语言中使用字符串连接来添加必要引号的副产品。这当然不是SQL想要的东西。基本上,我会假设那里的最终引号表示字符串的结束,而\parts inside意味着在字符串中插入引号字符,而不是结束字符串。同样,这是您用来查询SQL数据库的编程语言,而不是SQL。是的,它是一个片段,而不是完整代码行的一部分。如果它是用C编写的,那么查询SQLITE就会发出非常低质量的代码。这些代码本来应该容易受到SQL注入的攻击,我想这可能就是它容易受到攻击的原因。我的思维过程->是否有\字符意味着转义参数并注入额外的代码?