JDBC如何避免SQL注入

JDBC如何避免SQL注入

一 . 什么是SQL注入

SQL注入(SQL Injection)是一种代码注入技术,它允许攻击者将或“注入”恶意的SQL命令到后端数据库引擎执行。这些恶意的SQL命令可以执行未授权的数据库查询、修改数据、管理数据库服务器上的文件系统、执行管理操作(如关闭数据库服务)等,从而可能对网站或应用程序造成严重的安全威胁。

假设有一个简单的Web应用程序,它使用以下SQL查询来根据用户提供的用户名查找用户信息:

SELECT * FROM users WHERE username = '' + @username + ''

如果用户输入了admin'--(注意末尾的--是SQL注释的开始),那么生成的SQL查询将变为:

SELECT * FROM users WHERE username = 'admin'--'

由于--之后的任何内容都被视为注释,因此查询实际上变成了:

SELECT * FROM users WHERE username = 'admin'

这允许攻击者绕过正常的验证逻辑,直接以admin用户的身份检索信息,即使他们不知道admin用户的密码。

二 . 如何避免?

使用PreparedStatement解决SQL注入问题

PreparedStatement 在 Java 中是避免 SQL 注入的一种有效手段。它通过使用参数化查询来工作,这种方式确保了用户输入被当作数据而不是 SQL 代码的一部分来执行。以下是 `PreparedStatement如何避免 SQL 注入的详细解释:

1. 参数化查询

当你使用PreparedStatement 时,你首先编写一个带有占位符(通常是 ?)的 SQL 语句。然后,你通过 set 方法(如 setInt(), setString() 等)为这些占位符提供具体的值。这些值在运行时被绑定到 SQL 语句中,而不是在 SQL 语句被解析或编译时。

2. 编译一次,执行多次

PreparedStatement对象在数据库中被编译一次,但可以被执行多次,每次执行时只需替换占位符的值。这种机制不仅提高了性能(因为避免了重复的编译),还增强了安全性,因为 SQL 语句的结构在编译时就已经固定,不会被后续的用户输入所改变。

3. 防止 SQL 注入

由于 PreparedStatement 使用占位符和参数绑定机制,用户输入的数据被当作数据值来处理,而不是 SQL 代码的一部分。这意味着即使输入中包含 SQL 关键字、特殊字符或注释等,它们也不会被数据库解析为 SQL 语句的一部分,从而避免了 SQL 注入攻击。

我们来看下列代码 , 这里进行了一个登录的校验 , 使用

connection.prepareStatement("SELECT * FROM user WHERE username = ? AND password = ?");

这样就可以有效避免sql注入问题

package com.Month08.Day_11;import com.Month07.Day_02.Class1;import java.sql.*;
import java.util.Scanner;public class HDBC {public static void main(String[] args) throws ClassNotFoundException, SQLException {//        statement.executeUpdate("insert into user(username , password) values (123,123)");select();}public static void select()throws ClassNotFoundException, SQLException {Scanner sc = new Scanner(System.in);System.out.println("请输入用户名");int username = sc.nextInt();System.out.println("请输入密码");int password = sc.nextInt();Class.forName("com.mysql.jdbc.Driver");Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/users","root","root");PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM user WHERE username = ? AND password = ?");preparedStatement.setInt(1,username);preparedStatement.setInt(2,password);ResultSet resultSet = preparedStatement.executeQuery();while (resultSet.next()){System.out.println("登陆成功");}connection.close();}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三级_网络技术_20_路由器的配置及使用

1.封禁ICMP协议,只转发212.78.170.166/27所在子网的所有站点的ICMP数据包,正确的access-list配置是()。 Router (config)#access-list 110 permit icmp 212.78.170.166 0.0.0.0 any Router (config)#access-list 110 deny icmp any any Router (confi…

day2-网络连接网卡配置原理

1.window网卡 理解: window 有 2 块网卡 本地网卡 192.168.13.253 用于连接外网 vmnet8 10.0.0.1(装虚拟机自动生成的 如果没有自动生成…) 虚拟机添加 2 块网卡: 第一块网卡 NAT 模式 添加网卡的时候设置 NAT 模式 2 个作用,用于连接 wi…

C++_继承

继承 基础认识 像模板是函数和类代码的复用,而继承是对类代码的复用,都是更多的把复杂的任务交给编译器处理。 使用方法 继承的方式 class的默认继承方式是private,struct的默认继承方式是public,但还是最好加上。 protected成…

C++ 函数模板和类模板

参考视频:C类模板_哔哩哔哩_bilibili 遗留问题:编译器怎么处理函数模板和类模板 目录 一、为什么会有函数模版?函数模板是为了解决什么问题? 二、函数模板的概念 三、函数模版的使用 四、函数模板的特化 五、类模板的概念 …

基于ssm+vue+uniapp的英语学习交流平台小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

排序算法之桶排序

title: 桶排序 date: 2024-7-25 18:58:19 0800 categories: 排序算法 tags:排序算法桶排序 description: 桶排序(bucket sort)是分治策略的一个典型应用。它通过设置一些具有大小顺序的桶,每个桶对应一个数据范围,将数据平均分配…

Qt—Qtcreator中自定义类时,下拉菜单中没有出现要继承的Qt类

问题描述:Qtcreator中自定义类时,下拉菜单中没有出现要继承的Qt类 这里我想要继承 QLineEdit 类,但是在这个下拉菜单中没有找到 我认为这个是qtcreator版本的问题,因为我直接去 #include 是可以找到这个类的 直接创建出来的类中…

Python Flask 与 Node.js Express

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 构建 Web 应用程序时,选择正确的框架对于性能和可扩展性至关重要。Python 的 Flask 和 Node.js 的 Express 是两种流行的选择,它们根据项目…

重启人生计划-勇敢者先行

🥳🥳🥳 茫茫人海千千万万,感谢这一刻你看到了我的文章,感谢观赏,大家好呀,我是最爱吃鱼罐头,大家可以叫鱼罐头呦~🥳🥳🥳 如果你觉得这个【重启人生…

Go语言 Defer(延迟)

本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。 目录 定义 应用场景 代码示例 改为匿名函数 总结 定义 延迟:关键字,可以用于修饰语句、函数, 确保这条语句可以在当前栈退出的时候执行。 应用场景 1.一般用于…

SQL Server端口设置完整详细步骤

​ 大家好,我是程序员小羊! 前言: 前面是对SQLserver服务器一些介绍,不想了解的可直接点击目录跳入正题,谢谢!!! SQL Server 是由微软公司开发的关系数据库管理系统 (RDBMS)。它主要…

c++33 一级指针 字符串

拿到buf5 内存的首地址来释放内存 所以buf5不可改变 为了保证局部变量内存的局部性 字符串指针1级 如果没有拷入\0 则b还为一个数组 字符串拷贝函数 主调函数分配到内存 把g后面的内存变成\ 0 所以就改变了内存空间 考虑:主调用函数分配内存供被调用函数…

Python爬虫开发:BeautifulSoup、Scrapy入门

在现代网络开发中,网络爬虫是一个非常重要的工具。它可以自动化地从网页中提取数据,并且可以用于各种用途,如数据收集、信息聚合和内容监控等。在Python中,有多个库可以用于爬虫开发,其中BeautifulSoup和Scrapy是两个非…

FL Studio 24.1.1.4239中文破解版的安装激活详细教程

在数字音乐制作领域,FL Studio一直以其强大的功能和用户友好的界面而备受赞誉。随着技术的不断进步和音乐制作需求的日益增长,FL Studio 21.2.3的发布无疑为音乐创作者们带来了更为广阔的创作空间和更高效的制作工具。本文旨在深入探讨FL Studio 21.2.3的…

关于k8s的pvc存储卷

目录 1.PVC 和 PV 1.1 PV 1.2 PVC 1.3 StorageClass 1.4 PV和PVC的生命周期 2.实战演练 2.1 创建静态pv 2.2 创建动态pv 3.总结 1.PVC 和 PV 1.1 PV PV 全称叫做 Persistent Volume,持久化存储卷。它是用来描述或者说用来定义一个存储卷的,…

2024 年 7 月公链行业研报:市场波动中 Solana 表现抢眼,Layer 2 竞争白热化

作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics 公链 Research 页面 7 月份,加密货币市场表现活跃,波动幅度较大,这一现象映射了全球金融市场的整体趋势。现货以太坊 ETP 在美国的上市&…

k8s 部署RuoYi-Vue-Plus之minio搭建

1.直接部署一个pod 需要挂载存储款, 可参考 之前文章设置 https://blog.csdn.net/weimeibuqieryu/article/details/140183843 2.部署yaml 创建部署文件 minio-deploy.yaml apiVersion: v1 kind: PersistentVolume metadata:name: minio-pvnamespace: ruoyi #使用ns ruoyi s…

无字母数字webshell之命令执行

目录 1.源码 2.题目解析 3.利用方法 3.1 PHP7下如何实现 3.2PHP5下如何实现 3.2.1 shell下可以利用. 来执行任意脚本 3.2.2 Linux文件名支持用glob通配符代替 1.题目源码 <?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die(&q…

本地phpstudy部署算命系统,用户端是H5页面,支持微信支付宝支付,支持微信支付宝登录

算命系统本地部署教程 0. 技术架构1. 启动Apache、MySQL服务2. 创建前台和后台两个网站3. Navicat连接数据库4. 登录后台是长这个样子5. 登录前台登录样子6. 代码结构是 0. 技术架构 前端&#xff1a;HTMLCSSJquery 后端&#xff1a;PHP 数据库&#xff1a;MySQL 1. 启动Ap…

C# OnnxRuntime部署LivePortrait实现快速、高质量的人像驱动视频生成

目录 效果 说明 项目 模型信息 代码 下载 效果 LivePortrait实现快速、高质量的人像驱动视频生成 说明 官网地址&#xff1a;https://github.com/KwaiVGI/LivePortrait 代码实现参考&#xff1a;https://github.com/hpc203/liveportrait-onnxrun 模型下载&#xff1a;…