Web应用系统安全开发课件:SQL注入漏洞与安全防护.pptx
Web应用系统安全开发
SQL注入漏洞与安全防护;
5.4.1SQL注入漏洞的威胁;
?SQL注入的概念
SQL注入(SQLInjection)是一种常见的网络安全攻击技术,它利用输入验证不充分的漏洞,将恶意的SQL代码插入
到应用程序的数据库执行中。通过成功执行这些恶意SQL代码,攻击者可以绕过身份验证、获取未授权的访问权限、篡改数据库内容甚至控制整个应用程序。;
1.SQL注入的方式
?SQL注入的方式
(1)恶意拼接
SQL语句可以查询、插入、更新和删除数据,且使用分号来分隔不同的命令。例如:
SELECT*FROMusersWHEREuser_id=$user_id;
其中,user_id是传入的参数,如果传入的参数值为“1234;DELETEFROMusers”,那么最终的查询语句会变为:
SELECT*FROMusersWHEREuser_id=1234;DELETEFROMusers;
如果以上语句执行,则会删除users表中的所有数据。;
1.SQL注入的方式
(2)传入非法参数
SQL语句中传入的字符串参数是用单引号引起来的,如果字符串本身包含单引号而没有被处理,那么可能会篡改原本SQL语句的作用。例如:
SELECT*FROMuser_nameWHEREuser_name=$user_name;
如果user_name传入参数值为Gchen,那么最终的查询语句会变为:
SELECT*FROMuser_nameWHEREuser_name=Gchen;
一般情况下,以上语句会执行出错,这样的语句风险比较小。虽然没有语法错误,但可能会恶意产生SQL语句,并且以一种你不期望的方式运行。;
1.SQL注入的方式
(3)添加额外条件
在SQL语句中添加一些额外条件,以此来改变执行行为。条件一般为真值表达式。例如:
UPDATEusersSETuserpass=$userpassWHEREuser_id=$user_id;
如果user_id被传入恶意的字符串“1234ORTRUE”,那么最终的SQL语句会变为:
UPDATEusersSETuserpass=123456WHEREuser_id=1234ORTRUE;
这将更改所有用户的密码。;
2.SQL注入的威胁
(1)数据泄露:攻击者可以通过注入恶意SQL代码来访问和检索敏感的数据库信息,如用户凭据、个人身份信息、财务数据等。这种数据泄露可能导致隐私问题、身份盗窃和金融损失。
(2)身份验证绕过:通过恶意构造的SQL查询,攻击者可以绕过应用程序的身份验证机制。这可能使攻击者能够以其他用户的身份登录,获得未授权的访问权限,并执行未经授权的操作。
(3)数据篡改:通过注入恶意SQL代码,攻击者可以修改数据库中的数据,包括插入、更新或删除记录。这可能导致数据一致性问题、信息损坏,甚至系统功能故障。
(4)完全控制:在某些情况下,成功的SQL注入攻击可能使攻击者能够完全控制受影响的应用程序和数据库服务器。攻击者可以执行任意的SQL查询,操纵数据、创建恶意账户、安装后门等,从而对系统进行完全的入侵和控制。
(5)拒绝服务(DoS):攻击者可以利用SQL注入漏洞来执行资源密集型查询,导致数据库服务器过载,从而使应用;
5.4.2SQL注入漏洞的防护;
?PDO(PHP数据对象)是一种在PHP中操作数据库的常用方法。参数绑定是一种在执行SQL查询时,将变量绑定
到查询中的占位符的技术。使用参数绑定可以提高安全性,防止SQL注入攻击,并简化代码编写。
?php
//(1)编写包含占位符的SQL查询语句,占位符使用冒号(:)或问号(?)表示
$sql=SELECT*FROMusersWHEREusername=:username;
//(2)使用PDO预处理语句来准备查询
$stmt=$pdo-prepare($sql);
//(3)使用bindParam()方法将变量绑定到占位符
$stmt-bindParam(:username,$username);
//(4)在绑定完所有参数后,通过execute()方法执行查询
$stmt-execute();
?;
2.函数转义
?虽然大部分情况下都可以通过底层DB类封装好的方法来操作数据库,比如常见的连贯操作,可是依然会有一部分操作底层是很难满足的,所以依然会存在少部分裸写SQL的情况,这个时候就得使用函数转义来保障SQL语句的结构不被改变,常见的转义函数是:
(1)intval