dljd_013_使用PreparedStatement避免SQL注入攻击

一、使用PreparedStatement来避免SQL注入攻击示例

  这里我只提供源码、测试类及结果截图信息、建库/表的语句详见上一集

package edu.aeon.logon;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

import edu.aeon.aeonutils.AeonJdbcUtils;

/**
 * [说明]:实现用户登录、并且演示sql注入攻击 造成sql注入攻击的原因
 * 1.and和or的优先级(and(可以理解为并且)优先与or(可以理解为或者))其实是构造or的条件来无视and条件
 * 2.sql语句的拼接
 * 如何解决sql注入攻击? 数据库and 和 or的优先级天生的、我们无法改变 唯一解决思路:
 * 我们用预编译的PreparedStatement来执行sql语句、这种方式不会去拼接sql语句的
 * @author aeon
 *
 */
public class UserLogon {
    /**
     * 封装键盘输入
     *
     * @return
     */
    public static Map<String, String> ReadBoard() {
        /**
         * 键盘扫描器:扫描键盘输入的内容
         */
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String username = scanner.nextLine();// 以\n作为一行的标识来读取一行
        System.out.println("请输入密码:");
        String password = scanner.nextLine();
        Map<String, String> userMap = new HashMap<String, String>();
        // 将键盘输入的内容封装到map集合中、并且返回给调用者
        userMap.put("username", username);
        userMap.put("password", password);
        return userMap;
    }

    /**
     * 用户登录具体实现
     *
     * @return 登录成功标志 true则登录成功、否则失败!
     */
    public static boolean userLogon() {
        boolean flag = false;
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        try {
            // 连接数据库
            connection = AeonJdbcUtils.getMySqlConnection();
            // 获取到用户输入的数据
            Map<String, String> userMap = ReadBoard();
            // 登录sql 这里sql语句要设置的内容、不管什么类型,统统用?占位符
            String logonSql = "select * from user where username=? and userpw =?";
            // 将sql语句预编译到PreparedStatement对象当中
            preparedStatement = connection.prepareStatement(logonSql);
            preparedStatement.setString(1, userMap.get("username"));
            preparedStatement.setString(2, userMap.get("password"));
            System.out.println(logonSql);
            // 因为sql语句已经被编译到PreparedStatement对象中了,所以此处执行再也不需要sql语句
            resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
                flag = true;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            AeonJdbcUtils.closeDB(resultSet, preparedStatement, connection);
        }
        return flag;
    }

    /**
     * 用户登录测试
     *
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(userLogon() ? "用户登录成功!" : "用户登录失败!");
    }
}

  执行结果截图(我们输入错误的用户名和密码):

  

执行结果截图(我们输入正确的用户名和相应密码):

  

  执行结果截图(再构造sql注入攻击):

  

这样我们通过预编译的PreparedStatement执行sql语句来避免了sql注入的攻击。

原文地址:https://www.cnblogs.com/aeon/p/10074313.html

时间: 2024-11-13 09:53:23

dljd_013_使用PreparedStatement避免SQL注入攻击的相关文章

Web安全篇之SQL注入攻击

在网上找了一篇关于sql注入的解释文章,还有很多技术,走马观花吧 文章来源:http://www.2cto.com/article/201310/250877.html ps:直接copy,格式有点问题~ 大家早上好!今天由我给大家带来<web安全之SQL注入篇>系列晨讲,首先对课程进行简单介绍,SQL注入篇一共分为三讲:       第一讲:"纸上谈兵:我们需要在本地架设注入环境,构造注入语句,了解注入原理.":       第二讲:"实战演练:我们要在互联网上

SQL 注入攻击

一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试.这是安全评估的一个部分,所以尽管我们之前没有使用过SQL注入来渗透网络,但对其概念也相当熟悉了.最后我们在这项任务中大获成功,现在来回顾一下这个过程的每一步,将它记录为一个案例. "SQL注入"是一种利用未过滤/未审核用户输入的攻击方法("缓存溢出"和这个不同),意思就是让应用运行本不应该运行的SQL代码.如果应用毫无防备地创建了SQL字符串并且运行了它们,就会造成一些出人意料的结果. 我们记录下

如何对抗、预防 SQL注入 攻击

一.SQL注入简介 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQL注入攻击的总体思路 1.寻找到SQL注入的位置 2.判断服务器类型和后台数据库类型 3.针对不通的服务器和数据库特点进行SQL注入攻击 三.SQL注入攻击实例 比如在一个登录界面,要求输入用户名和密码: 可以这样输入实现免帐号登录: 用户名: 'or 1 = 1 – 密 码: 点登陆,如若没有做特殊处理,那么这个

实例讲解 SQL 注入攻击

一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试.这是安全评估的一个部分,所以尽管我们之前没有使用过SQL注入来渗透网络,但对其概念也相当熟悉了.最后我们在这项任务中大获成功,现在来回顾一下这个过程的每一步,将它记录为一个案例. “SQL注入”是一种利用未过滤/未审核用户输入的攻击方法(“缓存溢出”和这个不同),意思就是让应用运行本不应该运行的SQL代码.如果应用毫无防备地创建了SQL字符串并且运行了它们,就会造成一些出人意料的结果. 我们记录下了在多次错误的转折后经历的曲折

XSS攻击&amp;SQL注入攻击&amp;CSRF攻击?

- XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意脚本的链接以达到攻击的目标,目前有很多攻击者利用论坛.微博发布含有恶意脚本的URL就属于这种方式)和持久型攻击(将恶意脚本提交到被攻击网站的数据库中,用户浏览网页时,恶意脚本从数据库中被加载到页面执行,QQ邮箱的早期版本就曾经被利用作为持久型跨站脚本攻击的平台).XSS虽然不是什么新鲜玩意,但是攻击

oracle体系结构------Oracle 使用PreparedStatement防止SQL注入---转载

一条效率差的sql语句,足以毁掉整个应用. Statement是PreparedStatement的父接口,不进行预编译操作,减少了进行预编译的开销.单次运行PreparedStatement要比Statement要慢一些. PreparedStatement可以实现Statement的所有功能,但是之所以叫它预编译指令,是因为在创建它的一个对象时可以给定具有一定格式的SQL字符串,然后用它的setXXX方法给指定的SQL语句以填空的方式赋值,具有这样的特性后,它在多次执行一条固定格式的字符串时

SQL注入攻击实例

一位客户让我们针对只有他们企业员工和顾客能使用的企业内网进行渗透测试.这是安全评估的一个部分,所以尽管我们之前没有使用过SQL注入来渗透网络,但对其概念也相当熟悉了.最后我们在这项任务中大获成功,现在来回顾一下这个过程的每一步,将它记录为一个案例. 我们记录下了在多次错误的转折后经历的曲折过程,而一个更有经验的人会有这不同的 - 甚至更好的 - 方法.但事实上我们成功以后才明白,我们并没有完全被误导. 其他的SQL文章包含了更多的细节,但是这篇文章不仅展示了漏洞利用的过程,还讲述了发现漏洞的原理

Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程序员,我对sql注入的东西了解的也不深入,所以抽出时间专门学习了一下.现在把学习成果分享给大家,希望可以帮助大家学习.下面我们就来看一下. 一.什么是sql注入呢?         所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的

什么是XSS攻击?什么是SQL注入攻击?什么是CSRF攻击?

答: - XSS(Cross Site Script,跨站脚本攻击)是向网页中注入恶意脚本在用户浏览网页时在用户浏览器中执行恶意脚本的攻击方式.跨站脚本攻击分有两种形式:反射型攻击(诱使用户点击一个嵌入恶意脚本的链接以达到攻击的目标,目前有很多攻击者利用论坛.微博发布含有恶意脚本的URL就属于这种方式)和持久型攻击(将恶意脚本提交到被攻击网站的数据库中,用户浏览网页时,恶意脚本从数据库中被加载到页面执行,QQ邮箱的早期版本就曾经被利用作为持久型跨站脚本攻击的平台).XSS虽然不是什么新鲜玩意,但