预防SQL注入:前端数据不可信,从零基础到精通,收藏这篇就够了!

.markdown-body pre,.markdown-body pre>code.hljs{color:#333;background:#f8f8f8}.hljs-comment,.hljs-quote{color:#998;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-subst{color:#333;font-weight:700}.hljs-literal,.hljs-number,.hljs-tag .hljs-attr,.hljs-template-variable,.hljs-variable{color:teal}.hljs-doctag,.hljs-string{color:#d14}.hljs-section,.hljs-selector-id,.hljs-title{color:#900;font-weight:700}.hljs-subst{font-weight:400}.hljs-class .hljs-title,.hljs-type{color:#458;font-weight:700}.hljs-attribute,.hljs-name,.hljs-tag{color:navy;font-weight:400}.hljs-link,.hljs-regexp{color:#009926}.hljs-bullet,.hljs-symbol{color:#990073}.hljs-built_in,.hljs-builtin-name{color:#0086b3}.hljs-meta{color:#999;font-weight:700}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}

SQL注入预防:切记前端数据不可靠

SQL注入(SQL Injection)是当应用程序允许用户输入未经验证的数据直接插入到数据库查询中时,攻击者可以利用这一点插入恶意SQL语句,从而获得数据库的机密信息或执行其他恶意操作。为了有效预防SQL注入,我们需要理解如何使用正确的参数化查询来避免漏洞。

在我们来详细分析一下问题之前,首先理解两种常见的数据库查询方式:#{}(Mybatis)${}(Mybatis)。这两者的行为大不相同,直接影响到是否容易受到SQL注入攻击。

1. 参数化查询:#{} vs ${}
#{}:防止SQL注入的武器

在Mybatis框架中,#{}表示一个参数化的占位符。在执行SQL时,Mybatis会自动将传入的值作为参数处理,确保它们作为“值”而非SQL代码来执行。这种方式有效避免了SQL注入的风险,因为数据库引擎将处理它们时,不会将它们作为SQL语句的一部分执行,而是会将它们视作数据。

例如,下面的SQL语句使用了#{value}

<select name="query">
    select * from t where ${name} like #{value}
</select>


假设value传入的是用户输入的字符串,它会被Mybatis自动转义或处理为查询参数,而不是直接嵌入到SQL中,从而有效避免了恶意SQL注入的发生。

${}:危险的模板字符串

相比之下,${}表示的是字符串的直接插入,Mybatis会把传入的参数直接替换到SQL中,这可能导致SQL注入漏洞。举个例子:

<select name="query">
    select * from t where ${name} like #{value}
</select>


如果name是用户输入的,像field=title,那它会直接作为SQL的一部分被插入到查询中。这就给黑客提供了可乘之机,尤其当field参数由前端直接传入时,攻击者可以在field中注入恶意代码。

2. 黑客的攻击:如何利用SQL注入

假设攻击者发现了上述SQL的漏洞,可以利用field参数注入恶意SQL代码。攻击者可能这样构造请求:

/query?field=title like '% and author = '刘慈欣' or title&value=java


这样,SQL查询就会变成:

select * from t where title like '%' and author = '刘慈欣' or title like '%java%'


这条SQL语句被执行后,查询不仅会根据title字段查找包含java的记录,还会因为and author = '刘慈欣'的条件被引入,绕过了原本应该只查找title的限制,返回了可能包含敏感信息的记录。这就是SQL注入的典型场景。

3. 解决方案:严格控制前后端传递的字段值

要避免SQL注入,首先要理解数据的来源和用途,尤其是前端传来的数据。攻击者可能通过前端表单或URL参数传递恶意数据,因此我们需要在后端对传入的所有参数进行严格检查与处理。

一种有效的解决方法是前端的字段和后端的字段值不一致。即使前端传递的字段是title,后端接收的字段可能设置为name,这样即便攻击者将恶意代码传递给field,后端不直接接受这个传值,而是根据自己的逻辑匹配实际的数据库字段,避免了直接拼接恶意SQL。

例如,假设前端传入:

<select name="field">
    <option value="s1">Title</option>
    <option value="s2">Description</option>
</select>


而后端接收到的fieldvalue可能会映射到不同的数据库字段名,如下所示:

@PostMapping("/query")
public Response query(String field, String value){
    Map<String, Object> params = new HashMap<>();
    // 根据前端传入的field动态映射数据库字段
    String mappedField = mapFieldToDatabaseColumn(field); // 比如 s1 -> title, s2 -> description
    params.put("name", mappedField);  // 传递映射后的字段名
    params.put("value", "%" + value + "%");
    session.selectList("query", params);
}


然后在Mybatis的SQL映射中,使用#{}来防止SQL注入:

<select name="query">
    select * from t where ${name} like #{value}
</select>


通过这种方式,攻击者即使构造了类似title like '% and author = '刘慈欣' or title&value=java的恶意请求,后台也不会直接执行,因为SQL中的name被映射到了安全的数据库字段,不会直接执行不受信任的SQL逻辑。

4. 结论:从根源上避免SQL注入

SQL注入的本质是对用户输入数据的处理不当导致的安全漏洞。通过参数化查询(#{})和避免直接拼接SQL(${}),可以大大降低SQL注入的风险。同时,后端对前端数据的严格验证和控制,如字段映射和过滤,也能够有效防止潜在的攻击。

对于开发者来说,永远记住:前端数据永远不可信,即使是最简单的下拉框,也不能完全信任其传来的值。通过采取适当的安全措施,我们可以有效避免SQL注入,并保护系统免受攻击。

题外话

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

在这里插入图片描述

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我们和网安大厂360共同研发的网安视频教程,之前都是内部资源,专业方面绝对可以秒杀国内99%的机构和个人教学!全网独一份,你不可能在网上找到这么专业的教程。

内容涵盖了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。总共200多节视频,200多G的资源,不用担心学不全。
在这里插入图片描述
因篇幅有限,仅展示部分资料,需要见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源

最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

在这里插入图片描述

因篇幅有限,仅展示部分资料,需要见下图即可前往获取
在这里插入图片描述

🐵这些东西我都可以免费分享给大家,需要的可以点这里自取👉:网安入门到进阶资源
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值