热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JDBC如何有效防止SQL注入

转载请注明出处:http:blog.csdn.netlinglongxin24articledetails53769810本文出自【DylanAndroid的博客】#

转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53769810
本文出自【DylanAndroid的博客】


#JDBC如何有效防止SQL注入

在我们平时的开发中,作为新手写JDBC很有可能忽略了一点,那就是根本没有考虑SQL注入的问题,
那么,什么是SQL注入,以及如何防止SQL注入的问题。

一什么是SQL注入

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。[1] 比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

二.先看一下数据表中的数据

1. 查询代码:

/**数据库表名**/String tableName = "emp_test";/**先查看一下数据库当中的表数据**/DBUtil.query(tableName, null);

2. 查询结果:

SELECT * FROM emp_test成功查询到了14行数据第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, PASSWORD=123456, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=张无忌}第2行:{DEPT_TEST_ID=10, EMP_ID=1002, SALARY=8000, HIRE_DATE=2011-01-12, PASSWORD=123456, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=刘苍松}第3行:{DEPT_TEST_ID=10, EMP_ID=1003, SALARY=9000, HIRE_DATE=2010-02-11, PASSWORD=123456, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=李翊}第4行:{DEPT_TEST_ID=10, EMP_ID=1004, SALARY=5000, HIRE_DATE=2010-02-11, PASSWORD=123456, BONUS=null, MANAGER=1001, JOB=Programmer, NAME=郭芙蓉}第5行:{DEPT_TEST_ID=20, EMP_ID=1005, SALARY=15000, HIRE_DATE=2008-02-15, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=President, NAME=张三丰}第6行:{DEPT_TEST_ID=20, EMP_ID=1006, SALARY=5000, HIRE_DATE=2009-02-01, PASSWORD=123456, BONUS=400, MANAGER=1005, JOB=Manager, NAME=燕小六}第7行:{DEPT_TEST_ID=20, EMP_ID=1007, SALARY=3000, HIRE_DATE=2009-02-01, PASSWORD=123456, BONUS=500, MANAGER=1006, JOB=clerk, NAME=陆无双}第8行:{DEPT_TEST_ID=30, EMP_ID=1008, SALARY=5000, HIRE_DATE=2009-05-01, PASSWORD=123456, BONUS=500, MANAGER=1005, JOB=Manager, NAME=黄蓉}第9行:{DEPT_TEST_ID=30, EMP_ID=1009, SALARY=4000, HIRE_DATE=2009-02-20, PASSWORD=123456, BONUS=null, MANAGER=1008, JOB=salesman, NAME=韦小宝}第10行:{DEPT_TEST_ID=30, EMP_ID=1010, SALARY=4500, HIRE_DATE=2009-05-10, PASSWORD=123456, BONUS=500, MANAGER=1008, JOB=salesman, NAME=郭靖}第11行:{DEPT_TEST_ID=null, EMP_ID=1011, SALARY=null, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=于泽成}第12行:{DEPT_TEST_ID=null, EMP_ID=1012, SALARY=null, HIRE_DATE=2011-08-10, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=amy}第13行:{DEPT_TEST_ID=null, EMP_ID=1014, SALARY=8000, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=张无忌}第14行:{DEPT_TEST_ID=20, EMP_ID=1015, SALARY=null, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=刘苍松}三.模拟登录,演示SQL注入

1. 模拟登录伪代码

/**用户输入的用户名**/String name = "'1' OR '1'='1'";/**用户输入的密码**/String password = "'1' OR '1'='1'";/**我们拼SQL语句去查询**/String sql = "SELECT * FROM emp_test WHERE name = " + name + " and password = " + password;DBUtil.query(sql);

2. 查询结果

SELECT * FROM emp_test WHERE name = '1' OR '1'='1' and password = '1' OR '1'='1'成功查询到了14行数据第1行:{DEPT_TEST_ID=10, EMP_ID=1001, SALARY=10000, HIRE_DATE=2010-01-12, PASSWORD=123456, BONUS=2000, MANAGER=1005, JOB=Manager, NAME=张无忌}第2行:{DEPT_TEST_ID=10, EMP_ID=1002, SALARY=8000, HIRE_DATE=2011-01-12, PASSWORD=123456, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=刘苍松}第3行:{DEPT_TEST_ID=10, EMP_ID=1003, SALARY=9000, HIRE_DATE=2010-02-11, PASSWORD=123456, BONUS=1000, MANAGER=1001, JOB=Analyst, NAME=李翊}第4行:{DEPT_TEST_ID=10, EMP_ID=1004, SALARY=5000, HIRE_DATE=2010-02-11, PASSWORD=123456, BONUS=null, MANAGER=1001, JOB=Programmer, NAME=郭芙蓉}第5行:{DEPT_TEST_ID=20, EMP_ID=1005, SALARY=15000, HIRE_DATE=2008-02-15, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=President, NAME=张三丰}第6行:{DEPT_TEST_ID=20, EMP_ID=1006, SALARY=5000, HIRE_DATE=2009-02-01, PASSWORD=123456, BONUS=400, MANAGER=1005, JOB=Manager, NAME=燕小六}第7行:{DEPT_TEST_ID=20, EMP_ID=1007, SALARY=3000, HIRE_DATE=2009-02-01, PASSWORD=123456, BONUS=500, MANAGER=1006, JOB=clerk, NAME=陆无双}第8行:{DEPT_TEST_ID=30, EMP_ID=1008, SALARY=5000, HIRE_DATE=2009-05-01, PASSWORD=123456, BONUS=500, MANAGER=1005, JOB=Manager, NAME=黄蓉}第9行:{DEPT_TEST_ID=30, EMP_ID=1009, SALARY=4000, HIRE_DATE=2009-02-20, PASSWORD=123456, BONUS=null, MANAGER=1008, JOB=salesman, NAME=韦小宝}第10行:{DEPT_TEST_ID=30, EMP_ID=1010, SALARY=4500, HIRE_DATE=2009-05-10, PASSWORD=123456, BONUS=500, MANAGER=1008, JOB=salesman, NAME=郭靖}第11行:{DEPT_TEST_ID=null, EMP_ID=1011, SALARY=null, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=于泽成}第12行:{DEPT_TEST_ID=null, EMP_ID=1012, SALARY=null, HIRE_DATE=2011-08-10, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=amy}第13行:{DEPT_TEST_ID=null, EMP_ID=1014, SALARY=8000, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=张无忌}第14行:{DEPT_TEST_ID=20, EMP_ID=1015, SALARY=null, HIRE_DATE=null, PASSWORD=123456, BONUS=null, MANAGER=null, JOB=null, NAME=刘苍松}

通过上面的操作我们发现,这根本就不是我们想要的结果,这样的话,随便一个人都能够登录成功了,那么如何去避免这种事情呢?

四.模拟登录,防止SQL注入
1. 模拟登录伪代码

/**用户输入的用户名**/String name = "'1' OR '1'='1'";/**用户输入的密码**/String password = "'1' OR '1'='1'";/**我们用参数绑定去查询**/String where = "name = ? AND password = ? ";String[] whereArgs = new String[]{name, password};DBUtil.query("emp_test", where, whereArgs);

2. 查询结果

/**这条语句只是为了方便调试自己代印的语句,并不是PreparedStatement真正执行的SQL语句**/SELECT * FROM emp_test WHERE name = '1' OR '1'='1' AND password = '1' OR '1'='1'成功查询到了0行数据

通过参数绑定预编译的方案我们就可以有效的避免这种情况的发生。

五.GitHub



推荐阅读
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • 玩转直播系列之消息模块演进(3)
    一、背景即时消息(IM)系统是直播系统重要的组成部分,一个稳定的,有容错的,灵活的,支持高并发的消息模块是影响直播系统用户体验的重要因素。IM长连接服务在直播系统有发挥着举足轻重的 ... [详细]
  • 必须先赞下国人npm库作品:node-images(https:github.comzhangyuanweinode-images),封装了跨平台的C++逻辑,形成nodejsAP ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • Shodan简单用法Shodan简介Shodan是互联网上最可怕的搜索引擎,与谷歌不同的是,Shodan不是在网上搜索网址,而是直接进入互联网的背后通道。Shodan可以说是一款“ ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了VoLTE端到端业务详解|VoLTE用户注册流程相关的知识,希望对你有一定的参考价值。书籍来源:艾怀丽 ... [详细]
  • 什么是大数据lambda架构
    一、什么是Lambda架构Lambda架构由Storm的作者[NathanMarz]提出,根据维基百科的定义,Lambda架构的设计是为了在处理大规模数 ... [详细]
author-avatar
CH_Double_C
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有