sql - SQL代码中\"%s\"和"%s"有什么区别
问题描述
我一直在尝试找出 SQL 中“\”字符的用法差异。
例如,提供的代码行是:
... WHERE username=\"%s\" AND id=%s"
添加“\”字符意味着什么?
解决方案
假设这是 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”),则该标记被理解为字符串文字而不是一个标识符。
推荐阅读
- couchbase - N1QL 多重连接和求和查询产生错误的输出
- google-apps-script - 应用程序脚本强制谷歌表格中的特定行高
- winforms - 在许多 .net core 3 windows 窗体应用程序(如 GAC)之间使用相同的 dll
- python - 通过套接字传输大文件
- c# - 使用文档中的公钥验证 XML 文档
- python - 如何在 python 中自动化我的情绪分析
- javascript - 通过 XMLHttpRequest 发送 HTML 表单数据
- python - 验证准确度低且不增加,而训练准确度正在增加
- uipath - 使用环境功能与单独的编排器进行生产和测试
- android - 我们可以有一个后台 vpn 应用程序(没有主动通知)吗?