0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是SQL注入?Java项目防止SQL注入方式总结

马哥Linux运维 来源:CSDN-肥肥技术宅 2023-09-25 10:43 次阅读

一、什么是SQL注入?

SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息

478dbd2a-5a12-11ee-939d-92fbcf53809c.jpg

SQL案列

Stringsql="deletefromtable1whereid="+"id";

这个id从请求参数中获取,若参数被拼接为:

1001 or 1 = 1

最执行语句变为:

Stringsql="deletefromtable1whereid=1001or1=1";

此时,数据库的数据都会被清空掉,后果非常严重

二、Java项目防止SQL注入方式

这里总结4种:

PreparedStatement防止SQL注入

mybatis中#{}防止SQL注入

对请求参数的敏感词汇进行过滤

nginx反向代理防止SQL注入

1、PreparedStatement防止SQL注入

PreparedStatement具有预编译功能,以上述SQL为例

使用PreparedStatement预编译后的SQL为:

deletefromtable1whereid=?

此时SQL语句结构已固定,无论"?"被替换为任何参数,SQL语句只认为where后面只有一个条件,当再传入 1001 or 1 = 1时,语句会报错,从而达到防止SQL注入效果

2、mybatis中#{}防止SQL注入

mybatis中#{}表达式防止SQL注入与PreparedStatement类似,都是对SQL语句进行预编译处理

注意:

#{} :参数占位符

${} :拼接替换符,不能防止SQL注入,一般用于

传入数据库对象(如:数据库名称、表名)

order by 后的条件

3、对请求参数的敏感词汇进行过滤

这里是springboot的写法,如下:

importorg.springframework.context.annotation.Configuration;
importjavax.servlet.*;
importjavax.servlet.annotation.WebFilter;
importjava.io.IOException;
importjava.util.Enumeration;

/**
*@Auther:睡竹
*@Date:2023/03/07
*@Description:sql防注入过滤器
*/
@WebFilter(urlPatterns="/*",filterName="sqlFilter")
@Configuration
publicclassSqlFilterimplementsFilter{

@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{}

/**
*@descriptionsql注入过滤
*/
@Override
publicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{
ServletRequestrequest=servletRequest;
ServletResponseresponse=servletResponse;
//获得所有请求参数名
Enumerationnames=request.getParameterNames();
Stringsql="";
while(names.hasMoreElements()){
//得到参数名
Stringname=names.nextElement().toString();
//得到参数对应值
String[]values=request.getParameterValues(name);
for(inti=0;i< values.length; i++) {
                sql += values[i];
            }
        }
        if (sqlValidate(sql)) {
            //TODO 这里直接抛异常处理,前后端交互项目中,请把错误信息按前后端"数据返回的VO"对象进行封装
            throw new IOException("您发送请求中的参数中含有非法字符");
        } else {
            filterChain.doFilter(request,response);
        }
    }
 
    /**
     * @description 匹配效验
     */
    protected static boolean sqlValidate(String str){
        // 统一转为小写
        String s = str.toLowerCase();
        // 过滤掉的sql关键字,特殊字符前面需要加\进行转义
        String badStr =
                "select|update|and|or|delete|insert|truncate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute|table|"+
                        "char|declare|sitename|xp_cmdshell|like|from|grant|use|group_concat|column_name|" +
                        "information_schema.columns|table_schema|union|where|order|by|" +
                        "'\*|\;|\-|\--|\+|\,|\//|\/|\%|\#";
        //使用正则表达式进行匹配
        boolean matches = s.matches(badStr);
        return matches;
    }
 
    @Override
    public void destroy() {}
}

4、nginx反向代理防止SQL注入

越来越多网站使用nginx进行反向代理,该层我们也可以进行防止SQL注入配置。

将下面的Nginx配置文件代码放入到server块中,然后重启Nginx即可

if($request_method!~*GET|POST){return444;}
#使用444错误代码可以更加减轻服务器负载压力。
#防止SQL注入
if($query_string~*($|'|--|[+|(%20)]union[+|(%20)]|[+|(%20)]insert[+|(%20)]|[+|(%20)]drop[+|(%20)]|[+|(%20)]truncate[+|(%20)]|[+|(%20)]update[+|(%20)]|[+|(%20)]from[+|(%20)]|[+|(%20)]grant[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]where[+|(%20)]|[+|(%20)]select[+|(%20)]|[+|(%20)]and[+|(%20)]|[+|(%20)]or[+|(%20)]|[+|(%20)]count[+|(%20)]|[+|(%20)]exec[+|(%20)]|[+|(%20)]chr[+|(%20)]|[+|(%20)]mid[+|(%20)]|[+|(%20)]like[+|(%20)]|[+|(%20)]iframe[+|(%20)]|[<|%3c]script[>|%3e]|javascript|alert|webscan|dbappsecurity|style|confirm(|innerhtml|innertext)(.*)$){return555;}
if($uri~*(/~).*){return501;}
if($uri~*(\x.)){return501;}
#防止SQL注入
if($query_string~*"[;'<>].*"){return509;}
if($request_uri~""){return509;}
if($request_uri~(/.+)){return509;}
if($request_uri~(.+/)){return509;}
#if($uri~*(insert|select|delete|update|count|master|truncate|declare|exec|*|')(.*)$){return503;}
#防止SQL注入
if($request_uri~*"(cost()|(concat()"){return504;}
if($request_uri~*"[+|(%20)]union[+|(%20)]"){return504;}
if($request_uri~*"[+|(%20)]and[+|(%20)]"){return504;}
if($request_uri~*"[+|(%20)]select[+|(%20)]"){return504;}
if($request_uri~*"[+|(%20)]or[+|(%20)]"){return504;}
if($request_uri~*"[+|(%20)]delete[+|(%20)]"){return504;}
if($request_uri~*"[+|(%20)]update[+|(%20)]"){return504;}
if($request_uri~*"[+|(%20)]insert[+|(%20)]"){return504;}
if($query_string~"(<|%3C).*script.*(>|%3E)"){return505;}
if($query_string~"GLOBALS(=|[|\%[0-9A-Z]{0,2})"){return505;}
if($query_string~"_REQUEST(=|[|\%[0-9A-Z]{0,2})"){return505;}
if($query_string~"proc/self/environ"){return505;}
if($query_string~"mosConfig_[a-zA-Z_]{1,21}(=|\%3D)"){return505;}
if($query_string~"base64_(en|de)code(.*)"){return505;}
if($query_string~"[a-zA-Z0-9_]=http://"){return506;}
if($query_string~"[a-zA-Z0-9_]=(..//?)+"){return506;}
if($query_string~"[a-zA-Z0-9_]=/([a-z0-9_.]//?)+"){return506;}
if($query_string~"b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)b"){return507;}
if($query_string~"b(erections|hoodia|huronriveracres|impotence|levitra|libido)b"){return507;}
if($query_string~"b(ambien|bluespill|cialis|cocaine|ejaculation|erectile)b"){return507;}
if($query_string~"b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)b"){return507;}
#这里大家根据自己情况添加删减上述判断参数,cURL、wget这类的屏蔽有点儿极端了,但要“宁可错杀一千,不可放过一个”。
if($http_user_agent~*YisouSpider|ApacheBench|WebBench|Jmeter|JoeDog|Havij|GetRight|TurnitinBot|GrabNet|masscan|mail2000|github|wget|curl|Java|python){return508;}
#同上,大家根据自己站点实际情况来添加删减下面的屏蔽拦截参数。
if($http_user_agent~*"Go-Ahead-Got-It"){return508;}
if($http_user_agent~*"GetWeb!"){return508;}
if($http_user_agent~*"Go!Zilla"){return508;}
if($http_user_agent~*"DownloadDemon"){return508;}
if($http_user_agent~*"IndyLibrary"){return508;}
if($http_user_agent~*"libwww-perl"){return508;}
if($http_user_agent~*"NmapScriptingEngine"){return508;}
if($http_user_agent~*"~17ce.com"){return508;}
if($http_user_agent~*"WebBench*"){return508;}
if($http_user_agent~*"spider"){ return 508;}#这个会影响国内某些搜索引擎爬虫,比如:搜狗
#拦截各恶意请求的UA,可以通过分析站点日志文件或者waf日志作为参考配置。
if($http_referer~*17ce.com){return509;}
#拦截17ce.com站点测速节点的请求,所以明月一直都说这些测速网站的数据仅供参考不能当真的。
if($http_referer~*WebBench*"){return509;}
#拦截WebBench或者类似压力测试工具,其他工具只需要更换名称即可。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1238

    浏览量

    68459
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102994
  • SQL
    SQL
    +关注

    关注

    1

    文章

    738

    浏览量

    43461
  • 应用程序
    +关注

    关注

    37

    文章

    3136

    浏览量

    56392

原文标题:值得推荐,JAVA中防止SQL注入的四种方案

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    sql注入原理及预防措施

    可能发生SQL注入安全问题,那么,如何防止SQL注入呢?针对SQL
    发表于 03-21 14:47

    SQL注入扩展移位溢注

    SQL注入扩展移位溢注
    发表于 09-07 15:06 11次下载
    <b class='flag-5'>SQL</b><b class='flag-5'>注入</b>扩展移位溢注

    基于SQL注入攻击检测与防御的方法

    显露出来,这些给人们的生活、工作、学习都带来了巨大的损失。面对Web 网站存在的种种安全漏洞问题,文章通过对大量SQL注入攻击报文的攻击特征进行总结分析,结合SQL
    发表于 10-31 10:57 18次下载
    基于<b class='flag-5'>SQL</b><b class='flag-5'>注入</b>攻击检测与防御的方法

    sql注入攻击实例讲解

     “SQL注入”是一种利用未过滤/未审核用户输入的攻击方法(“缓存溢出”和这个不同),意思就是让应用运行本不应该运行的SQL代码。如果应用毫无防备地创建了SQL字符串并且运行了它们,就
    发表于 11-17 14:07 1.9w次阅读
    <b class='flag-5'>sql</b><b class='flag-5'>注入</b>攻击实例讲解

    如何使用Java Web防范SQL 注入攻击的资料说明

    网络的广泛应用给社会带来极大便捷,网络安全特别是SQL 注入也成为了一个倍受关注的问题。与此同时,Java Web 由于其平台无关性、“一次编写、随处运行”,使得越来越多的程序员加入到Java
    发表于 02-26 15:59 12次下载
    如何使用<b class='flag-5'>Java</b> Web防范<b class='flag-5'>SQL</b> <b class='flag-5'>注入</b>攻击的资料说明

    一文带你了解安全测试基础之SQL注入

    传说,SQL注入是黑客对数据库进行攻击的常用手段,今天就来介绍一下SQL注入
    的头像 发表于 06-28 11:15 1998次阅读

    SQL注入把系统搞挂了该怎么处理?

    最近我在整理安全漏洞相关问题,准备在公司做一次分享。恰好,这段时间团队发现了一个sql注入漏洞:在一个公共的分页功能中,排序字段作为入参,前端页面可以自定义。在分页sql的mybatis
    的头像 发表于 03-03 15:00 1385次阅读
    <b class='flag-5'>SQL</b><b class='flag-5'>注入</b>把系统搞挂了该怎么处理?

    训练SQL注入的sqil-labs-master闯关游戏

    训练SQL注入的sqil-labs-master闯关游戏
    发表于 05-14 09:31 0次下载

    SQL注入攻击是什么 SQL注入会带来哪些威胁

    AQL的定义 SQL是操作数据库数据的结构化查询语言,网页的应用数据和后台数据库中的数据进行交互时会采用SQL。而SQL注入是将Web页面的原URL、表单域或数据包输入的参数,修改拼接
    的头像 发表于 08-04 17:40 4707次阅读

    SQL注入到Getshell的教程

    上一节,我们已经介绍了基本的SQL查询语句,常见的SQL注入类型,DVWA靶场演示SQL注入。学习了上一节我们可以做到执行任意
    的头像 发表于 09-21 14:45 2371次阅读

    Mybatis的SQL注入审计的基本方法

    SQL注入漏洞作为WEB安全的最常见的漏洞之一,在java中随着预编译与各种ORM框架的使用,注入问题也越来越少。新手代码审计者往往对Java
    的头像 发表于 10-17 11:16 989次阅读

    超级SQL注入工具–SSQLInjection

    支持手动灵活的进行SQL注入绕过,可自定义进行字符替换等绕过注入防护。本工具为渗透测试人员、信息安全工程师等掌握SQL注入技能的人员设计,需
    的头像 发表于 03-07 10:26 1628次阅读

    Kiuwan开发者预防SQL注入攻击的5大最佳实践

    很明显,SQL注入攻击会造成严重的经济和声誉后果。为了避免成为这种攻击的受害者,开发人员必须采取主动措施保护他们的系统免受恶意行为者的攻击。以下是开发人员和组织防止SQL
    的头像 发表于 07-16 11:46 443次阅读

    sql注入漏洞解决方法有哪些?

    安全措施。 SQL注入会影响各种Web应用程序,但对于使用SQL数据库的Web应用程序来说,这是一个最突出的问题。根据使用案例,这些数据库可能保存有关客户、知识产权和其他敏感信息的信息。这些敏感数据可能会以多种
    的头像 发表于 10-07 17:29 2760次阅读
    <b class='flag-5'>sql</b><b class='flag-5'>注入</b>漏洞解决方法有哪些?

    什么是SQL注入Java项目防止SQL注入方式

    Java项目防止SQL注入方式 这里总结4种:
    发表于 10-16 14:26 235次阅读