文档章节

数据库开发 - SQL注入与防范单元作业

抢小孩糖吃
 抢小孩糖吃
发布于 2016/10/01 01:04
字数 460
阅读 42
收藏 0
点赞 0
评论 0

#题目 1(100分) 有一张学生表

现在需要根据学生名称获取学生的期末考试分数。

public static void getStudent(String name) throws ClassNotFoundException {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    try {
      Class.forName(JDBC_DRIVER);
      conn = DriverManager.getConnection(DB_URL, USER, PASS);
      stmt = conn.createStatement();
      rs = stmt.executeQuery("select name,score from student where name =' " + name +"'");
      while (rs.next()) {
        System.out.println(rs.getString("name") + ":" + rs.getInt("score"));
      }
    } catch (SQLException e) {
      // ignore
    } finally {
      if (rs != null) {
        try {
          rs.close();
        } catch (Exception e) {
          // ignore
        }
      }
      if (stmt != null) {
        try {
          stmt.close();
        } catch (Exception e) {
          // ignore
        }
      }
      if (conn != null) {
        try {
          conn.close();
        } catch (SQLException e) {
          // ignore
        }
      }
    }
  }
  1. 请指出上面这段程序存在什么安全风险?并给出具体的测试用例。
  2. 请重新编写应用程序,解决上述风险。

##初始化SQL

CREATE TABLE `student` (
`Id`  int NOT NULL AUTO_INCREMENT ,
`name`  varchar(100) NULL ,
`score`  int NULL ,
PRIMARY KEY (`Id`)
)
;


INSERT INTO `student` (`Id`, `name`, `score`) VALUES ('1', 'Xiaoming', '100');
INSERT INTO `student` (`Id`, `name`, `score`) VALUES ('2', 'XiaoLi', '101');
INSERT INTO `student` (`Id`, `name`, `score`) VALUES ('3', 'XiaoZhao', '102');

##解答

  1. 请指出上面这段程序存在什么安全风险?并给出具体的测试用例。
    回答: 1.这段代码有代码注入的安全风险。非常容易让黑客对数据库进行遍历。
    测试用例:
    public void testGetStudentBug() throws Exception {
        StudentDAO.getStudent("XiaoMing\' OR 1=1; -- ");
    }

运行结果

[SQL]:select name,score from student where name ='XiaoMing' OR 1=1; -- '
Xiaoming:100
XiaoLi:101
XiaoZhao:102

2.以下是重新编写的代码,进行风险规避

    public static void getStudentSafe(String name) throws ClassNotFoundException {
        Connection conn = null;
        PreparedStatement preparedStatement = null;
        ResultSet rs = null;
        try {
            Class.forName(JDBC_DRIVER);
            conn = DriverManager.getConnection(DB_URL, USER, PASS);

            String sql = "SELECT name,score FROM student WHERE name = ?";

            System.out.println("SQL:" + sql);

            preparedStatement = conn.prepareStatement(sql);
            preparedStatement.setString(1,name);
            rs = preparedStatement.executeQuery();

            while (rs.next()) {
                System.out.println(rs.getString("name") + ":" + rs.getInt("score"));
            }
        } catch (SQLException e) {
            // ignore
            System.out.println("[SQLException]:" + e.toString());
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (Exception e) {
                    // ignore
                }
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (Exception e) {
                    // ignore
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    // ignore
                }
            }
        }
    }

测试代码

public void testGetStudentSafe1() throws Exception {
        StudentDAO.getStudentSafe("XiaoMing");
    }

    public void testGetStudentSafe() throws Exception {
        StudentDAO.getStudentSafe("XiaoMing\' OR 1=1; -- ");
    }

错误的执行结果

SQL:SELECT name,score FROM student WHERE name = ?

Process finished with exit code 0

© 著作权归作者所有

共有 人打赏支持
抢小孩糖吃

抢小孩糖吃

粉丝 67
博文 231
码字总数 224458
作品 0
东城
程序员
数据库测试总结

数据库开发既然在软件开发的比重逐步提高,随之而来的问题也突出。我们以前往往重视对代码的测试工作,随着流程技术的日益完善,软件质量得到了大幅度的提高,但数据库方面的测试仍然处于空白...

itzhongxin
2017/05/18
0
0
开发人员学Linux之终结篇:大型系统开发经验谈

一、前言 这篇文章来源于我的一个 PPT,而这个 PPT 是源于一个朋友的一次邀请,朋友邀请我为一个公司做一堂大约 2 小时的技术讲座,我选定的方向是《如何开发一个大型系统》 在这里我对大型系...

周金桥
06/29
0
0
10大最重要的Web安全风险之一:A1--注入

OWASP TOP10 A1-注入 A2-跨站脚本(XSS) A3-错误的认证和会话管理 A4-不正确的直接对象引用 A5-伪造跨站请求(CSRF) -- Cross-Site Request Forgery A7-限制远程访问失败 A8-未验证的重定向...

六六木木
2013/06/26
0
3
PHP网站常见安全漏洞及防御方法

转自微信订阅号:lampbrother一、常见PHP网站安全漏洞 对于PHP的漏洞,目前常见的漏洞有五种。分别是Session文件漏洞、SQL注入漏洞、脚本命令执行漏洞、全局变量漏洞和文件漏洞。这里分别对这...

BearCatYN
2015/07/09
39
0
数据库开发 - SQL注入与防范

数据库泄露的风险 由于数据库通常存储的是业务的价值数据,例如用户信息、交易信息,如果这些内容泄露后果不堪设想。 携程SQL注入漏洞 新浪网SQL漏洞 数据库注入 在Web应用架构下,终端用户无...

抢小孩糖吃
2016/09/26
52
0
SQL注入其实很简单,别一不留神就被利用了

SQL注入这个词相信大家应该都不陌生,而且每年都会有这样子的事情发生,下面我先带大家回忆11年两期起比较经典的案例事件: 1、SONY索尼事件 2011年4月,著名的匿名者组织Anonymous注入SONY一...

KeminWu
06/08
0
0
整理一些PHP开发安全问题

整理一些PHP开发安全问题   php给了开发者极大的灵活性,但是这也为安全问题带来了潜在的隐患,近期需要总结一下以往的问题,在这里借翻译一篇文章同时加上自己开发的一些感触总结一下。 ...

开元中国2015
2015/07/06
392
0
Java开发手册(五):安全规约与单元测试

一、安全规约 1. 操作权限 隶属于用户个人的页面或者功能必须进行权限控制校验。防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信 内容、修改他人的订单。 2....

思与学
2017/11/07
0
0
PHP 如何安全的使用 MySQL ?

大多数 PHP 程序员对 MySQL 肯定不陌生,至于各种 MySQL 函数的用法在开发手册和 w3school 这类网站上也有很多介绍。但是,你所用的写法真的安全吗?面对越来越猖獗的黑客攻击,SQL 注入防范...

OneAPM蓝海讯通
2016/01/19
58
0
linux之mysql数据库搭建及sql注入和防御

mysql中文手册下载地址:http://down.51cto.com/data/2244392 sql注入各种姿势:http://wt7315.blog.51cto.com/10319657/1828167 sqlmap注入神器详解:http://wt7315.blog.51cto.com/103196......

wt7315
2016/09/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前端基础

1. get请求传参长度的误区 误区:我们经常说get请求参数的大小存在限制,而post请求的参数大小是无限制的。 实际上HTTP 协议从未规定 GET/POST 的请求长度限制是多少。对get请求参数的限制是...

wenxingjun
今天
0
0
Android 复制和粘贴功能

做了一回搬运工,原文地址:https://blog.csdn.net/kennethyo/article/details/76602765 Android 复制和粘贴功能,需要调用系统服务ClipboardManager来实现。 ClipboardManager mClipboardM...

她叫我小渝
今天
0
0
拦截SQLSERVER的SSL加密通道替换传输过程中的用户名密码实现运维审计(一)

工作准备 •一台SQLSERVER 2005/SQLSERVER 2008服务 •SQLSERVER jdbc驱动程序 •Java开发环境eclipse + jdk1.8 •java反编译工具JD-Core 反编译JDBC分析SQLSERVER客户端与服务器通信原理 SQ...

紅顏為君笑
今天
6
0
jQuery零基础入门——(六)修改DOM结构

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。 在《零基础入门JavaScript》的时...

JandenMa
今天
0
0
linux mint 1.9 qq 安装

转: https://www.jianshu.com/p/cdc3d03c144d 1. 下载 qq 轻聊版,可在百度搜索后下载 QQ7.9Light.exe 2. 去wine的官网(https://wiki.winehq.org/Ubuntu) 安装 wine . 提醒网页可以切换成中...

Canaan_
今天
0
0
PHP后台运行命令并管理运行程序

php后台运行命令并管理后台运行程序 class ProcessModel{ private $pid; private $command; private $resultToFile = ''; public function __construct($cl=false){......

colin_86
今天
1
0
数据结构与算法4

在此程序中,HighArray类中的find()方法用数据项的值作为参数传递,它的返回值决定是否找到此数据项。 insert()方法向数组下一个空位置放置一个新的数据项。一个名为nElems的字段跟踪记录着...

沉迷于编程的小菜菜
今天
1
1
fiddler安装和基本使用以及代理设置

项目需求 由于开发过程中客户端和服务器数据交互非常频繁,有时候服务端需要知道客户端调用接口传了哪些参数过来,这个时候就需要一个工具可以监听这些接口请求参数,已经接口的响应的数据,这种...

银装素裹
今天
0
0
Python分析《我不是药神》豆瓣评论

读取 Mongo 中的短评数据,进行中文分词 对分词结果取 Top50 生成词云 生成词云效果 看来网上关于 我不是药神 vs 达拉斯 的争论很热啊。关于词频统计就这些,代码中也会完成一些其它的分析任...

猫咪编程
今天
0
0
虚拟机怎么安装vmware tools

https://blog.csdn.net/tjcwt2011/article/details/72638977

AndyZhouX
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部