广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >简单聊一聊SQL注入及防止SQL注入
  • 193
分享到

简单聊一聊SQL注入及防止SQL注入

2024-04-02 19:04:59 193人浏览 八月长安
摘要

目录sql注入附防止sql注入的一些建议总结SQL注入 SQL注入是通过操作输入来修改事先定义好的SQL语句,对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入

SQL注入

SQL注入是通过操作输入来修改事先定义好的SQL语句,对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入精心构造的字符串去非法获取到数据库中的数据,以达到执行代码对服务器进行攻击的方法。

现有一个数据库test中的表user,可以通过账号name,密码pass登录,查看id

登录代码

package JDBCtest;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Scanner;


public class Demo4 {

    public static void main(String[] args) throws Exception {
        // 1.加载驱动
        Class.forName("com.Mysql.jdbc.Driver");
        // 2.创建连接
        String url = "jdbc:mysql:///test";
        String username = "root";
        String passWord = "1234";
        Connection connection = DriverManager.getConnection(url, username, password);
        // 接收用户名密码
        Scanner sc = new Scanner(System.in);
        String name = sc.next();
        String pass = sc.next();// 3.sql语句
        String sql = "Select * from user where name='" + name + "' and pass ='" + pass + "'";
        // System.out.println(sql);
        // 4.获取sql对象statement
        Statement statement = connection.createStatement();
        // 5.执行sql语句
        ResultSet rs = statement.executeQuery(sql);
                // 6.登录
        if (rs.next()) {
            System.out.println("登录成功");
        } else {
            System.out.println("登录失败");
        }
        // 7.释放资源
        statement.close();
        connection.close();
    }
}

通过表中账号密码登录成功

由于账号或密码错误登录失败

以上可以正确登录成功或失败

注意!

如果此时我这样输入 【lihua 'or'1'='1】,也成功登录了,但是数据库没根本没有这条数据

这是为什么呢?让我们从代码里找问题!

        String sql = "Select * from user where name='" + name + "' and pass ='" + pass + "'";

为了调用数据库,使用字符串拼接SQL语句

让我们打印一下输入 【lihua 'or'1'='1】的sql语句一探究竟

select语句中的where条件可以看做两组并列(注意and在前先执行,or后执行)

由于'1'='1'为TRUE,所以以上语句等价于肯定会登录成功!

同理输入【'or'1'='1'# xxx】也能登陆成功

这是由于#在SQL中是注释符号,以上语句等价于,于是就和上述情况一样了。

附防止sql注入的一些建议

1. 代码层防止sql注入攻击的最佳方案就是sql预编译

public List<Course> orderList(String studentId){
    String sql = "select id,course_id,student_id,status from course where student_id = ?";
    return jdbcTemplate.query(sql,new Object[]{studentId},new BeanPropertyRowMapper(Course.class));
}

这样我们传进来的参数 4 or 1 = 1就会被当作是一个student_id,所以就不会出现sql注入了。

2. 确认每种数据的类型,比如是数字,数据库则必须使用int类型来存储

3. 规定数据长度,能在一定程度上防止sql注入

4. 严格限制数据库权限,能最大程度减少sql注入的危害

5. 避免直接响应一些sql异常信息,sql发生异常后,自定义异常进行响应

6. 过滤参数中含有的一些数据库关键词

@Component
public class SqlInjectionFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        httpservletRequest req=(HttpServletRequest)servletRequest;
        HttpServletRequest res=(HttpServletRequest)servletResponse;
        //获得所有请求参数名
        Enumeration params = req.getParameterNames();
        String sql = "";
        while (params.hasMoreElements()) {
            // 得到参数名
            String name = params.nextElement().toString();
            // 得到参数对应值
            String[] value = req.getParameterValues(name);
            for (int i = 0; i < value.length; i++) {
                sql = sql + value[i];
            }
        }
        if (sqlValidate(sql)) {
            throw new IOException("您发送请求中的参数中含有非法字符");
        } else {
            chain.doFilter(servletRequest,servletResponse);
        }
    }

    
    protected static boolean sqlValidate(String str) {
        // 统一转为小写
        str = str.toLowerCase();
        // 过滤掉的sql关键字,可以手动添加
        String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|" +
                "char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like'|and|exec|execute|insert|create|drop|" +
                "table|from|grant|use|group_concat|column_name|" +
                "infORMation_schema.columns|table_schema|uNIOn|where|select|delete|update|order|by|count|*|" +
                "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";
        String[] badStrs = badStr.split("\\|");
        for (int i = 0; i < badStrs.length; i++) {
            if (str.indexOf(badStrs[i]) >= 0) {
                return true;
            }
        }
        return false;
    }
}

总结

到此这篇关于SQL注入及防止SQL注入的文章就介绍到这了,更多相关防止SQL注入内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 简单聊一聊SQL注入及防止SQL注入

本文链接: https://www.lsjlt.com/news/143586.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 简单聊一聊SQL注入及防止SQL注入
    目录SQL注入附防止sql注入的一些建议总结SQL注入 SQL注入是通过操作输入来修改事先定义好的SQL语句,对用户输入的字符串进行过滤,转义,限制或处理不严谨,导致用户可以通过输入...
    99+
    2022-11-13
  • 简单聊聊SQL注入的原理以及一般步骤
    目录原理一般利用步骤1.判断注入点2.判断查询字段数3.查数据库名、版本号、用户名等信息4.查询表名5.查询字段名6.查询记录内容总结原理 SQL注入是一种攻击方式,在这种攻击方式中...
    99+
    2022-11-13
  • Mybatis-plus sql注入及防止sql注入详解
    目录一、SQL注入是什么?二、mybatis是如何做到防止sql注入的1. #{} 和 ${} 两者的区别2.PreparedStatement和Statement的区别3.什么是预...
    99+
    2022-11-13
    mybatis-plus sql注入 mybatis-plus防止sql注入
  • 防止SQL注入
    SQL注入是指攻击者通过在输入的数据中注入恶意的SQL代码,以获取非法访问、窃取敏感信息等操作。以下是一些防止SQL注入的方法: 使用参数化查询:使用参数化查询可以防止SQL注入攻击,参数化查询是指在执行查询时,将参数与查询语句分离,使得...
    99+
    2023-09-10
    sql 数据库 java mysql
  • 结合Mybatis聊聊对SQL注入的见解
    目录Mybatis聊聊对SQL注入的见解1.sql注入是什么2.sql注入实例(1)特殊符号,如 ' 和 .等(2)sql语句的注入(3)通过sql语句的in和order by进行注...
    99+
    2022-11-12
  • 怎么防止SQL注入
    这篇文章主要介绍了怎么防止SQL注入,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。SQL注入即是指web应用程序对用户输入数据的合法性没有判...
    99+
    2022-10-18
  • 动态sql如何防止sql注入
    动态sql防止sql注入的示例:在对应的数据库中添加以下sql语句:DECLARE @variable NVARCHAR(100)DECLARE @SQLString NVARCHAR(1024)DECLARE @ParmD...
    99+
    2022-10-24
  • golang怎么防止sql注入
    在Go语言中,可以使用参数化查询或预编译语句来防止SQL注入。1. 参数化查询:使用占位符来代替实际的参数值,然后将参数值作为参数传...
    99+
    2023-09-17
    golang sql
  • beego如何防止sql注入
    beego框架里的Raw函数使用了占位符,并且beego是经过mysql的数据库驱动封装打包后再传到mysql中的,这个过程中已经实现了防止SQL注入,因此不再存在SQL注入的危险。...
    99+
    2022-10-08
  • ajax如何防止sql注入
    ajax防止sql注入的方法:将以下代码放在公用的js里面即可,如:$.ajaxSetup({contentType: "application/x-www-form-urlencoded;charset=utf-8",beforeSend...
    99+
    2022-10-06
  • hql如何防止sql注入
    hql防止sql注入的方法:在HQL语句中定义命名参数要用”:”开头,例如:Query query=session.createQuery(“from User user where user.name=:customername...
    99+
    2022-10-17
  • ibatis怎么防止sql注入
    ibatis防止sql注入的方法:使用#写法采用预编译方式,将转义交给数据库,则不会出现注入问题,例如://mysql环境select * from test where school_name like conca&#...
    99+
    2022-10-10
  • like如何防止sql注入
    like防止sql注入的示例:在不同数据库下的用法不同,例如://mysql环境select * from test where school_name like concat('%',${name},'%')...
    99+
    2022-10-24
  • nodejs如何防止sql注入
    nodejs防止sql注入的方法:使用escape()对传入参数进行编码,例如:var userId = 1, name = 'test';var query = connection.query('SELECT * FROM us...
    99+
    2022-10-04
  • html如何防止sql注入
    html防止sql注入的方法:批量过滤post、get敏感数据,例如:$_GET = stripslashes_array($_GET);$_POST = stripslashes_array($_POST);使用数据过滤函数,例如:fun...
    99+
    2022-10-24
  • hibernate怎么防止sql注入
    hibernate防止sql注入的方法:使用named parameter方法(在查询字符串中使用:),例如:usernameString//前台输入的用户名passwordString//前台输入的密码//hql语句String quer...
    99+
    2022-10-20
  • spring如何防止sql注入
    spring防止sql注入的方法:可以通过编写一个webFilter过滤器来防止sql注入,例如:@Component@WebFilter(urlPatterns = ")|" +"(\\b(select|update|and|or|del...
    99+
    2022-10-07
  • nginx如何防止sql注入
    nginx防止sql注入的方法:对于提交后台的所有数据都进行过滤转义。数据库中的用户密码需加密存放。php程序进行二次过滤,过滤GET和POST变量中的关键字。生产环境关闭PHP和MySQL的错误信息。一般问号后面的请求参数,在nginx用...
    99+
    2022-10-11
  • tp5如何防止sql注入
    tp5防止sql注入的方法:在application/config.php中设置全局的过滤规则,如:// 默认全局过滤方法 用逗号分隔多个'default_filter' => 'htmlspecialchars,addslashes,st...
    99+
    2022-10-04
  • net如何防止sql注入
    net防止sql注入的方法:在直接处理SQL语句时,将传递的值进行参数化,然后在进行赋值,例如:cmd.CommandText = @"select count(*) from UserInfo where UserNa...
    99+
    2022-10-23
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作