如何避免SQL注入攻击?

news2024/11/18 1:40:51

 🐓序言

当涉及到数据库操作时,防止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查询和参数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL技术大讲堂 - 第48讲:PG高可用实现keepalived

PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUG PG技术大讲堂。 第48讲&#…

JVM本地方法

本地方法接口 NAtive Method就是一个java调用非java代码的接口 本地方法栈(Native Method Statck) Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用。 本地方法栈,也是线程私有的。 允许被实现成固定或…

java 面向对象入门

类的创建 右键点击对应的包,点击新建选择java类 填写名称一般是名词,要知道大概是什么的名称,首字母一般大写 下面是创建了一个Goods类,里面的成员变量有:1.编号(id),2.名称&#x…

华为汽车图谱

极狐 极狐(ARCFOX)是由北汽、华为、戴姆勒、麦格纳等联合打造。总部位于北京蓝谷。 问界 华为与赛力斯(东风小康)合作的成果。 阿维塔 阿维塔(AVATR)是由长安汽车、华为、宁德时代三方联合打造。公司总部位…

Docker Stack(堆栈) 部署多服务集群,多服务编排

1、Docker Stack简介 Docker Stack(堆栈) 是在 Swarm 上管理服务堆栈的工具。而在以前文章docker swarm集群搭建 介绍的 Docker Swarm 只能实现对单个服务的简单部署,于是就引出了Docker Stack。 上面我们介绍到 docker-compose:可以在一台机器上使用…

操作系统高级议题:并发控制与进程互斥技术

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【Python】学习率调整策略详解和示例

学习率调整得当将有助于算法快速收敛和获取全局最优,以获得更好的性能。本文对学习率调度器进行示例介绍。 学习率调整的意义基础示例无学习率调整方法学习率调整方法一多因子调度器余弦调度器 结论 学习率调整的意义 首先,学习率的大小很重要。如果它…

软件测试技术之登录页面测试用例的设计方法

相信大家都有过写登录测试用例的经验,相较于开发人员编写代码而言,测试人员编写用例同样重要。本文作者总结了一些关于登录用例的经验。 一、功能测试用例设计: 1、正常登录场景 测试用例1:输入正确的用户名和密码,验证…

对于提高Web安全,WAF能有什么作用

数字化时代,网络安全已经成为了一个不可忽视的重要议题。网络攻击事件频发,各种安全隐患层出不穷,如何有效地保护我们的网络空间,确保信息安全,已成为一项迫切的任务。而Web应用防火墙,正是守护网络安全的一…

GitHub学生认证

文件、证明之类的一定要用英文。 我先是用有道网页翻译把学信网的报告翻译成了英文,然后截图传上去, 给我这个答复 所以要先2FA认证、支付信息填好。 2FA认证:Github开启2FA双重验证 - 知乎 (zhihu.com) 支付信息:点击Setting…

找茬游戏小程序源码系统:封面广告+插屏广告 自带流量主低成本 带完整的安装代码包以及搭建教程

近年来,小程序市场持续火爆,各类小程序层出不穷。找茬游戏小程序作为其中的一种,以其独特的游戏形式和良好的用户体验,吸引了大量用户。然而,对于许多开发者和商家来说,开发一款高质量的找茬游戏小程序并非…

无人车+工厂车间集成无缝,这款网关产品了解一下

​诸位朋友们,大家好!今天给大家介绍一款引领工业无人化发展的黑科技 —— 星创易联科技的SV900-5G车载网关。 相信大家对无人驾驶技术都很感兴趣,它代表着未来出行和生产的全新方式。而要实现真正的"无人化",离不开无人车网关这个智能大脑的作用。SV900就是一款专为…

Openlayers 入门教程(一):应该如何学习 Openlayers

还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,ech…

联机分析处理技术

目录 一、OLAP概述(一)OLAP的定义(二)OLAP的12条准则(三)OLAP的简要准则(四)OLAP系统的基本结构 二、OLAP的多维分析操作(一)切片(二)…

电脑访问网页获取路由器WAN口内网IP

因为运维过程中容易出现路由器配置了固定IP但是没人知道后台密码,不确定这个办公室的IP地址,且使用tracert路由追踪也只会出现路由器的LAN口网关并不会出现WAN口IP。 今日正好遇到了个好方法,经过测试可以正常使用。 方法如下: 内…

O2OA(翱途)开发平台-快速入门开发一个门户实例

O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]拥有门户页面定制与集成的能力,平台通过门户定制,可以根据企业的文化,业务需要设计符合企业需要的统一信息门户,系统首页等UI界面。本篇主要介绍通过门户管理系统如何快速的进行一个…

宝宝洗衣机哪个牌子质量好?四大高热度婴儿洗衣机不容错过

相信大部分的用户家里都会备有一台传统的大型洗衣机,不过,如果家里有了初生的婴儿的话,细心的宝爸宝妈还是会为了宝宝的衣物的卫生,而选择分开单独清洗宝宝的衣物,并且很多宝爸宝妈都会自己手工洗。由于刚出生的宝宝的…

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

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

I/O(输入/输出流的概述)

文章目录 前言一、流的概述二、输入/输出流 1.字节/字符输入流2.字节/字符输出流总结 前言 在变量、数组和对象中储存的数据是暂时的,程序结束后它们就会丢失。如果想要永久地储存程序创建的数据,需要将其保存在磁盘文件中,这样就可以在程序中…

Pillow教程07:调整图片的亮度+对比度+色彩+锐度

---------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁…