您现在的位置是:网站首页 > 心得笔记

web安全之sql注入

盛悦2025-02-2010人围观
简介本文将记录web安全中常见的sql注入

sql注入定义

sql注入是一种常见的网络攻击手段,攻击者通过在web应用程序的输入字段中插入恶意sql代码,欺骗后台数据库执行非授权的sql语句。
sql注入可以用来获取、篡改或删除数据库中的数据,甚至可以用于执行系统命令,导致数据泄露、数据破坏或服务器被控制等严重后果。

sql注入的工作原理

1.对用户输入验证不足:当 Web 应用程序没有正确验证用户输入时,攻击者可以在输入字段中插入 SQL 代码。
2.拼接 SQL 语句:应用程序后端通常将用户输入与 SQL 查询拼接在一起,形成完整的数据库查询语句。
3.执行恶意 SQL:如果应用程序没有对输入进行适当的转义,恶意 SQL 代码将被数据库服务器执行。
4.数据泄露或破坏:攻击者可以利用 SQL 注入来查询、修改或删除数据库中的数据,或者执行数据库管理系统的系统命令。

sql注入简单举例

用户登录网站时,执行sql

SELECT * FROM users WHERE username = 'user1' AND password = 'password1';

如果攻击者输入:
用户名:admin' --
密码:anything

SQL 查询变成:

SELECT * FROM users WHERE username = 'admin' --' AND password = 'anything';

其中 -- 是 SQL 的注释符号,忽略了密码条件,直接绕过了身份验证。

常见的sql注入

1.基础型sql注入
直接将恶意 SQL 代码嵌入用户输入中,并影响查询逻辑。
输入用户名:admin' OR '1'='1
输入密码:anything
执行的 SQL 查询:
select * from users where username = 'admin' OR '1'='1'AND password = 'anything';
结果:
OR '1'='1' 总为 true,可以绕过验证。

2.UNION 查询注入
通过 UNION 将攻击者构造的查询结果与合法查询结果合并,从而获取敏感数据。
输入:
' UNION SELECT null, username, password FROM users --
执行的 SQL 查询:
SELECT id, name FROM products WHERE id = '' UNION SELECT null, username, password FROM users --';
结果:
将 users 表的 username 和 password 数据作为结果返回。

3.堆叠查询注入
允许多条 SQL 语句同时执行。
输入:
'; DROP TABLE users; --
执行的 SQL 查询:
SELECT * FROM users WHERE username = ''; DROP TABLE users; --';
结果:
users 表被删除。
当然,也可以执行修改管理员密码的SQL命令:

SELECT * FROM users WHERE username = ''; UPDATE users set  password='123456' where user='admin'; --';

sql注入的防范措施

1.参数化查询和预编译语句
使用参数化查询或预编译语句,将用户输入与 SQL 语句分离,避免用户输入被直接解析为 SQL 代码。
2.使用 ORM 框架
ORM通过自动生成 SQL 查询,大幅减少手动拼接 SQL 的机会,从而避免注入。
3.输入验证
严格检查用户输入是否符合预期,拒绝不符合规则的输入。
对用户名、邮箱等使用正则表达式,数值类型字段只允许数字输入。
对特殊字符进行转义(如 " 转为 \")。
4.限制数据库权限
为数据库用户分配最小权限,只允许执行必要的操作。
限制写入权限:只允许插入、更新的用户操作对应的表,不允许 DROP、ALTER 等高危操作。
分离读写权限:使用只读账号访问数据库。


上一篇:跨域技术讲解

下一篇:web安全之xss攻击