什么是 SQL注入?怎么预防?

Posted 流楚丶格念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是 SQL注入?怎么预防?相关的知识,希望对你有一定的参考价值。

文章目录

SQL注入

SQL注入概念

SQL注入的原理是将SQL代码伪装到输入参数中,传递到服务器解析并执行的一种攻击手法

好手法!

也就是说,在一些对SERVER端发起的请求参数中植入一些SQL代码,SERVER端在执行SQL操作时,会拼接对应参数,同时也将一些SQL注入攻击的“SQL”拼接起来,导致会执行一些预期之外的操作。

举个栗子

比如我们的登录功能,其登录界面包括用户名和密码输入框以及提交按钮,登录时需要输入用户名和密码,然后提交。此时调用接口/user/login/ 加上参数username、password,首先连接数据库,然后后台对请求参数中携带的用户名、密码进行参数校验,即SQL的查询过程。假设正确的用户名和密码为ls123456,输入正确的用户名和密码、提交,相当于调用了以下的SQL语句。

SELECT * FROM user WHERE username = 'ls' AND password = '123456'

因为 SQL中会将#--以后的字符串当做注释处理,如果我们使用' or 1=1 #作为用户名参数,那么服务端构建的SQL语句就如下:

select * from user where username='' or 1=1 #' and password='123456'

#会忽略后面的语句,而1=1属于常等型条件,因此这个SQL将查询出所有的登录用户。其实上面的SQL注入只是在参数层面做了些手脚,如果是引入了一些功能性的SQL那就更危险了,比如上面的登录功能,如果用户名使用这个 ' or 1=1;delete * from users; # ,语句就变成了

select * from user where username='' or 1=1;delete * from users; #' and password='123456'

那么在";"之后相当于是另外一条新的SQL,这个SQL是删除全表,是非常危险的操作,因此SQL注入这种还是需要特别注意的。

如何解决SQL注入

1. 严格的参数校验

参数校验就没得说了,在一些不该有特殊字符的参数中提前进行特殊字符校验即可。

2. SQL预编译

在知道了SQL注入的原理之后,我们同样也了解到mysql有预编译的功能,指的是在服务器启动时,MySQL Client把SQL语句的模板(变量采用占位符进行占位,占位符: )发送给MySQL服务器,MySQL服务器对SQL语句的模板进行编译,编译之后根据语句的优化分析对相应的索引进行优化,在最终绑定参数时把相应的参数传送给MySQL服务器,直接进行执行,节省了SQL查询时间,以及MySQL服务器的资源,达到一次编译、多次执行的目的,除此之外,还可以防止SQL注入。

具体是怎样防止SQL注入的呢?实际上当将绑定的参数传到MySQL服务器,MySQL服务器对参数进行编译,即填充到相应的占位符的过程中,做了转义操作。我们常用的JDBC就有预编译功能,不仅提升性能,而且防止SQL注入

例如:
# 解析为一个 JDBC预编译语句(prepared statement)的参数标记符,一个 # 被解析为一个参数占位符;而$仅仅为一个纯碎的 string 替换

下面是 # 的使用:

SELECT * FROM user WHERE username = #User.username AND password = #User.password

其他预编译内容,可以参考另一篇博客:https://blog.csdn.net/Bb15070047748/article/details/107266400/

以上是关于什么是 SQL注入?怎么预防?的主要内容,如果未能解决你的问题,请参考以下文章

sql注入的原理是什么,怎么预防sql注入

Laravel 预防 SQL 注入

Laravel 预防 SQL 注入

什么是 SQL Server 上的 SQL 注入攻击?我们如何预防它们? [复制]

运维安全- 什么是SQL注入

SQL注入是什么?SQL注入原理及预防方法