如何避免SQL注入攻击?

 🐓序言

当涉及到数据库操作时,防止SQL注入攻击至关重要。SQL注入是一种常见的网络安全威胁,攻击者通过在用户输入中插入恶意的SQL代码,从而可以执行未经授权的数据库操作。

🐓避免方式

使用参数化查询

使用参数化查询可以防止SQL注入攻击,并提高代码的可读性和可维护性。

在Java中,可以使用PreparedStatement来实现参数化查询。通过设置占位符(例如?)并使用setString()等方法设置参数值,可以避免SQL注入攻击。

import java.sql.*;
 public class Example {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
         try {
            // 连接到数据库
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "username", "password");
             // 创建PreparedStatement对象
            String query = "SELECT * FROM users WHERE username = ? AND password = ?";
            stmt = conn.prepareStatement(query);
             // 设置参数值
            String username = "账号";
            String password = "密码";
            stmt.setString(1, username);
            stmt.setString(2, password);
             // 执行查询
            rs = stmt.executeQuery();
             // 处理查询结果
            while (rs.next()) {
                // 获取每一行数据
                int id = rs.getInt("id");
                String name = rs.getString("name");
                 // 打印数据
                System.out.println("ID: " + id + ", Name: " + name);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 关闭ResultSet、PreparedStatement和Connection
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stmt != null) {
                try {
                    stmt.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

输入验证和过滤

对应用程序中的所有输入数据进行验证和过滤,以确保它们是有效和合法的。

使用正则表达式、内置的输入验证方法(如isDigit()isLetter()isWhitespace())等来实现输入验证和过滤。

import java.util.regex.Pattern;
import java.util.regex.Matcher;
 public class Example {
    public static void main(String[] args) {
        String input = "example123";
         // 使用正则表达式进行验证
        String pattern = "^[a-zA-Z0-9]+$";
        boolean isValid = Pattern.matches(pattern, input);
         if (isValid) {
            System.out.println("匹配成功");
        } else {
            System.out.println("匹配失败);
        }
    }
}

使用存储过程

存储过程是一组预定义的SQL语句集合,可以在数据库中进行重复性和复杂性的操作。

在Java中,可以使用JDBC来调用和执行存储过程

import java.sql.*;
 public class Example {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
         try (Connection conn = DriverManager.getConnection(url, username, password)) {
            // 创建CallableStatement对象来调用存储过程
            CallableStatement stmt = conn.prepareCall("{call my_stored_procedure(?, ?)}");
             // 设置输入参数
            stmt.setInt(1, 10);
             // 注册输出参数
            stmt.registerOutParameter(2, Types.INTEGER);
             // 执行存储过程
            stmt.execute();
             // 获取输出参数的值
            int result = stmt.getInt(2);
            System.out.println("存储过程返回值:" + result);
         } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

最小权限原则

为数据库用户分配最小必需的权限,避免使用超级用户权限。

import java.sql.*;
 public class Example {
    public static void main(String[] args) {     
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
         try (Connection conn = DriverManager.getConnection(url, username, password)) {
            // 创建Statement对象
            Statement stmt = conn.createStatement();
             // 创建用户并授予最小权限
            String createUserQuery = "CREATE USER 'limiteduser'@'localhost' IDENTIFIED BY 'password'";
            stmt.executeUpdate(createUserQuery);
             String grantQuery = "GRANT SELECT, INSERT ON mydatabase.* TO 'limiteduser'@'localhost'";
            stmt.executeUpdate(grantQuery);
             System.out.println("用户已创建并授予最小权限");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

避免动态拼接SQL语句

不要直接将用户输入拼接到SQL语句中,而是使用参数化查询或其他安全的方案

String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setString(1, username);
ResultSet resultSet = statement.executeQuery();

使用ORM框架

使用ORM(对象关系映射)框架,如Hibernate、MyBatis等,可以帮助自动处理SQL查询和参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/492248.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js实现拖放效果

dataTransfer对象 说明:dataTransfer对象用于从被拖动元素向放置目标传递字符串数据。因为这个对象是 event 的属性,所以在拖放事件的事件处理程序外部无法访问 dataTransfer。在事件处理程序内部,可以使用这个对象的属性和方法实现拖放功能…

基于Java在线玩具商城系统设计与实现(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

Java 基础学习(二十)Maven、XML与WebServer

1 Maven 1.1 什么是Maven 1.1.1 Maven概述 Maven是一种流行的构建工具,用于管理Java项目的构建,依赖管理和项目信息管理。它使用XML文件来定义项目结构和构建步骤,并使用插件来执行各种构建任务。Maven可以自动下载项目依赖项并管理它们的…

Spring 事务传播行为

实现原理 : Aop (TransactionInterceptor) 实现 使用spring声明式事务注意事项 同一个bean中的方法调用必须重新声明一个bean调用、否则后续方法调用的事务默认使用第一个第二个不生效 package com.cloud.person.service.impl;import com.cloud.person.dao.S1Mapper; import…

【Linux】详细分析/dev/loop的基本知识 | 空间满了的解决方法

目录 前言1. 基本知识2. 内存满了2.1 清空2.2 扩增 3. 彩蛋 前言 服务器一直down机,翻找日志文件一直找不到缘由,最终发现是挂载的内存满了,那本身这个文件就什么用呢? 1. 基本知识 /dev/loop是一种特殊的设备文件,…

Linux环境开发工具之gcc/g++

前言 我们前面介绍了yum和vim,可以在Linux上安装和卸载软件了也可以在vim上写C/C代码了!但代码写完后如何编译呢?这就是我们今天来介绍gcc和g! 本期内容介绍 gcc和g 程序的翻译过程 动静态库的链接 一、gcc和g 1.1什么是gcc和g…

mysql-->highgo迁移

1、迁移工具免安装,解压双击迁移工具,会进入如下界面:migration.rar 2、新建组–>创建新的服务 3、在创建好的服务下,新建数据库连接,建立源表和目标表 4、这一步是获取源库(Mysql数据库)与目标库(瀚高数据库&…

Web开发基本流程

Web是全球广域网,能够通过浏览器访问的网站。我们要访问网站,首先要在浏览器输入对应的域名。 浏览器也是一个程序,京东的网站也是一个程序,在京东那边电脑运行着,我们只是通过浏览器远程访问。京东的程序由三个部分组…

Thread类中start方法和run方法的源码简单解读,联系和区别

我们可以打开idea,按住ctrl将光标移至所查方法上,单击右键,即可查看这两个方法的源码: 1. start方法源码 我们从上至下分析一下: 这个threadStatus是一个int型的变量来表示线程是否开始,0为没有开始,非0为开始,因此当threadStatus不为0时,会抛出非法开始线程的异常. group对象…

VMware扩容硬盘

最近研究Oracle的备份导入导出功能,但是因为磁盘容量不够导致表空间的扩容没办法,从而没办法导入数据库的dmp文件。得想办法先扩容磁盘容量。话不多说上截图操作。 操作环境:VMware10 , Centos 6.9 VMware扩容硬盘步骤 一、关闭虚拟机&…

爬虫(Web Crawler)介绍与应用

## 摘要 本文将介绍什么是爬虫(Web Crawler)以及其在信息抓取、数据分析等领域的应用。我们将深入探讨爬虫的工作原理、设计特点以及开发过程中需要考虑的关键问题。 ## 一、什么是爬虫 爬虫是一种自动化程序或脚本,用于从互联网上抓取信息…

C++中的凸包:convexHull使用手册【c++重要方法】

最近工作中,用到了凸包,查了一些资料,差不多搞明白了,在这里做一个总结,希望可以帮助到你! 什么时候需要它? 如果你想要把一群散落的点,包裹起来。而且希望这个包裹尽可能地紧凑&a…

【c++】类和对象(四)深入了解拷贝构造函数

🔥个人主页:Quitecoder 🔥专栏:c笔记仓 朋友们大家好啊,本篇内容带大家深入了解拷贝构造函数 目录 1.拷贝构造函数1.1传值调用的无限调用1.2浅拷贝1.3深拷贝1.4深拷贝的实现 1.拷贝构造函数 拷贝构造函数是一种特殊的…

Linux/Pandora

Pandora Enumeration nmap 第一次扫描发现系统对外开放了22和80端口,端口详细信息如下 访问80端口,显示PLAY是Panda.htb的扩展,将网络监控解决方案带到家门口 尝试添加Panda.htb到/etc/hosts中,访问得到的页面却是一样的&#x…

工具推荐-eNSP(Enterprise Network Simulation Platform)

一.简介 1.1 一款由华为提供的免费的、可扩展的、图形化操作的网络仿真工具平台。 1.2 主要对企业网络路由器、交换机进行软件仿真,完美呈现真实设备实景,支持大型网络模拟。 1.3 让广大用户有机会在没有真实设备的情况下能够模拟,进行模拟网络架构和建…

Mamba复现与代码解读

文章目录 环境配置demo推理源码解析参数解读Mamba块(Mamba Block)状态空间模型(SSM)选择性扫描算法(selective_scan)前向传播(forward) 均方根归一化 (RMSNorm)残差块(Re…

批量删除 rabbitmq中随机队列

批量删除 amq.gen–* 随机队列 操作错误产生了无效随机队列,需要批量删除 过滤列出指定amq.gen–队列 # 列出 指定 vhost/qq 以amq.gen开头的所有队列 rabbitmqctl list_queues --vhost / | grep ^amq.gen-# 批量删除队列 #由于list_queues会列出队列名称以及对应…

Windows系统部署瀚高数据库

1.安装包解压之后,执行setup.exe hgdb-enterprise-6.0.4.rar 2.勾选“我接受协议”,点击下一步,设置数据库安装目录(注意安装路径,不要包含中文,也尽量不要包含特殊符号。这里默认会是“6.0.4”&#xff0…

MOV压敏电阻的微观结构与制造工艺

EAK 压敏电阻 应用于电力系统的MOV目前主要有两大系列,它们都是以ZnO为主要成分再加人少量其他金属氧化物添加剂而构成的。添加剂为Bi,O:、Sb,O:、MnO₂和CoO,等构成的 MOV称为Bi系列:添加剂为Pr,0、Co,0、Mg0而不含B,0,或含量极少的MOV称为Pr系列(或称稀土系列)。添…

GIS与Python机器学习:开创地质灾害风险评价新纪元

地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下,地质灾害在世界范围内频繁发生。我国除滑坡灾害外,还包括崩塌、泥石流、地面沉…