首页 > 解决方案 > SQL代码中\"%s\"和"%s"有什么区别

问题描述

我一直在尝试找出 SQL 中“\”字符的用法差异。

例如,提供的代码行是:

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

添加“\”字符意味着什么?

标签: sqlcsqlite

解决方案


假设这是 C 代码,例如...

char sql[] = "SELECT * FROM foo WHERE username=\"%s\" AND id=%s";

它只是转义"字符,因此它不会结束字符串。生成的 SQL 是...

SELECT * FROM foo WHERE username="%s" AND id=%s

除了使用字符串连接的明显问题之外,还有一个额外的漏洞。

字符串文字使用'. Using"表示一个标识符,如表或列名。如果不存在这样的标识符,SQLite 将假定它是一个字符串文字。攻击者可以通过提供与标识符匹配的值来利用这一点。

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

  • 如果在允许标识符但不允许字符串文字的上下文中使用单引号中的关键字(例如:'key' 或 'glob'),则该标记被理解为标识符而不是字符串文字.
  • 如果在不能将其解析为标识符但允许字符串文字的上下文中使用双引号中的关键字(例如:“key”或“glob”),则该标记被理解为字符串文字而不是一个标识符。

推荐阅读