sql-server - FORM 身份验证页面中的 SQL 注入
问题描述
SELECT *
FROM admin_table
WHERE username = '' OR '1'='1' AND password = '';
SELECT *
FROM admin_table
WHERE username = '' OR 1=1 OR '1'='1' AND password = '';
SQL Server 是如何解释上述两条 SQL 语句的?
WHERE
该子句始终为真的场景有哪些?
解决方案
WHERE
如果username
为空白,则为真,或者(1 = 1(即真)并且password
为空白),因此任何一个都必须为空白WHERE
如果username
为空白,或 1=1,或(1=1 且password
为空白)则为真,因此始终为真。
真正的解决方案不是尝试通过清理或编写奇怪的查询来智取 SQL 注入。解决方案是将代码和数据分开。代码被执行,数据不被执行。因此,始终参数化您的查询。
在我个人看来,SQL 作为一门语言面临的最大问题是它鼓励临时解释脚本,将代码与数据混合在任何地方。
如果代码必须在到达数据库附近之前完全编译,注入就不会成为这样的问题。
推荐阅读
- javascript - AngularJS:在确认对话框上单击确定时的不同回调
- c# - 如何将 IDictionary 绑定到 Repeater 不同的控件?
- javascript - 我在尝试制作的 discord.js 机器人上有一些错误:
- javascript - 单击选项卡关闭时显示模式窗口
- regex - 基于正则表达式模式将多行字符串拆分为组
- javascript - 类型错误:__WEBPACK_IMPORTED_MODULE_0__firebase__.a.initialize 不是函数。在 webpack 4 中使用 firebase
- typescript - 将对象类型的动态列表组合成一个大对象类型
- openid-connect - B2C 身份验证未返回 access_token
- python - 在 Pandas 数据框中加载大表时,如何避免 EC2 中的内存错误?
- google-api - 如何在使用日历 API 创建的 Google Meets 中禁用等候室?