什么是 SQL注入?怎么预防?
Posted 流楚丶格念
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是 SQL注入?怎么预防?相关的知识,希望对你有一定的参考价值。
文章目录
SQL注入
SQL注入概念
SQL注入的原理是将SQL代码伪装到输入参数中,传递到服务器解析并执行的一种攻击手法。
好手法!
也就是说,在一些对SERVER端发起的请求参数中植入一些SQL代码,SERVER端在执行SQL操作时,会拼接对应参数,同时也将一些SQL注入攻击的“SQL”拼接起来,导致会执行一些预期之外的操作。
举个栗子
比如我们的登录功能,其登录界面包括用户名和密码输入框以及提交按钮,登录时需要输入用户名和密码,然后提交。此时调用接口/user/login/
加上参数username、password
,首先连接数据库,然后后台对请求参数中携带的用户名、密码进行参数校验,即SQL的查询过程。假设正确的用户名和密码为ls
和123456
,输入正确的用户名和密码、提交,相当于调用了以下的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注入?怎么预防?的主要内容,如果未能解决你的问题,请参考以下文章