SQL中LIKE '%' 与 PreparedStatement的占位符 ? 使用方法

DeepSeek MyBatis 防止 SQL 注入的核心机制是使用预编译语句(PreparedStatement),并通过 #{} 占位符语法将参数作为值传递,而不是直接拼接到 SQL 语句中 MyBatis 防止 SQL 注入的核心机制是使用预编译语句(PreparedStatement),并通过 #{} 占位符语法将参数作为值传递,而不是直接拼接到 SQL 语句中。如果 userInput 传入 ’ OR ‘1’='1,最终 SQL 变成 SELECT * FROM users WHERE username = ‘’ OR ‘1’=‘1’,就会绕过认证。使用 #{} 时,LIKE 查询的百分号不能写在占位符内部,因为 #{} 会给字符串加引号,导致 % 被当作普通字符。 阅读详情

LIKE name='%xxx%'是SQL提供的一种模糊查询方式,用%号代替任意字符。

PreparedStatement是Java提供的一种包含预处理的数据库连接查询方式,这种方式很方便,可以通过如下代码做查询:

PreparedStatement pstm = connection.prepareStatement("SELECT * FROM t1 WHERE name=?");
问号就是占位符,接下来只要通过注入方式在?的位置注入想要注入的就行,可以是字符串,也可以是int类型。

注入代码:

pstm.setString(1, "abc");

这样是不是很方便,免去了 如果name是变量时 的字符串拼接。

但是当模糊查询与预处理注入方式结合时,正确的使用方式是这样的。

只需要更改注入的东西就可以,第一句生成PreparedStatement对象时的SQL语句不用改,不用在SQL语句里写%。

pstm.setString(1, "%abc%");


MyBatis与MyBatis-Plus防SQL注入:从预编译原理到实战安全编码 SQL注入是Web应用中最常见且危险的安全漏洞之一,其本质在于攻击者通过构造恶意输入,篡改原始SQL语句的逻辑结构,从而非法操作数据库。其防御的核心原理在于参数化查询(预编译),通过JDBC的PreparedStatement将SQL指令结构与用户输入数据严格分离,从根源上杜绝注入。这项技术是构建安全数据访问层的基石,广泛应用于需要处理用户输入并执行数据库查询的所有Java Web应用场景。MyBatis框架通过#{}占位符默认实现了参数化查询,而MyBatis-Plus的条件构造器(如LambdaQuer 阅读详情

相关推荐

在VScode中配置Python开发环境(详细图片文字结合)

需要用到的软件下载包在官网里找一下,在window下的点击安装就行了;找一个3.8到3.10版本差不多都完善跟的上;

m0_72811193的博客 1599

PreparedStatement

Statement是将java查询语句发送到mysql中的管道,但是有sql注入问题,就是它都是以字符串拼接的方式来发送的,如果传值为1 or 1或1=1这种一定为true的东西过去,会有安全隐患 例如 SELECT user, password FROM user_table WHERE user=‘a’ OR 1 = ’ AND password = ’ OR ‘1’ = ‘1’ PreparedState所代表sql语句可以使用占位符"?",一个占位符就代表了sql语句里的一个未知参数,调用Prep

小小海豚呀 247

深入解析USBlyzer抓包工具:从设备描述符到数据交互实战

本文深入解析了USBlyzer抓包工具在USB协议分析中的应用。从设备描述符的抓取与解读,到设置地址、配置描述符的实战分析,再到数据交互阶段的抓包技巧,文章通过具体案例详细展示了如何使用USBlyzer透视USB总线通信,是排查设备驱动问题、逆向分析通信协议和学习USB规范的实用指南。

weixin_29171087的博客 741

SQL学习日志------like用法

like用法 select * from table where columns like '%%%% ' %%%可填入任意构造的组合,例如: ^ABscd -------开头为ABscd ABscd$ ------结尾为ABscd _y ------第一个字符任意,第二个字符为y %b% -------%为占位符,可代表任意多字符,及只要含有b就行 ...

m0_57011532的博客 857

全志 mipi屏幕和触摸驱动调试记录

mipi屏幕与触摸调试记录

u011996684的博客 3221

告别密码烦恼:用Windows Server NPS给公司Wi-Fi和有线网加一道MAC地址白名单(附H3C交换机配置)

本文详细介绍了如何利用Windows Server NPS(网络策略服务器)与H3C交换机实现MAC地址白名单认证,为企业Wi-Fi和有线网络提供零密码安全方案。通过配置NPS服务器、网络策略及H3C交换机联调,实现无感知认证体验,降低运维负担,同时满足审计追溯需求。适用于中小企业网络管理,提升安全性与便捷性。

weixin_42535703的博客 368

Sql中的like用法

Like中的通配符包含有: 通配符 Description 示例 % 包含零个或多个字符的任意字符串。 WHERE title LIKE '%computer%'将查找在书名中任意位置包含单词"computer"的所有书名。 _(下划线) 任何单个字符。 WHERE au_fname LIKE '_ean'将查找以e...

笑看江湖 6万+

电力电子论文(TPE、TTE)投稿经验分享

电力电子顶刊论文投稿经验

橙子的博客 2万+

sql中使用占位符时,like字句的处理

为了防止sql注入,一般使用"?"作为占位符,但是遇到需要like条件的时候,就有有点小问题 sb.append("and functionName like ? "); params.add("%" + functionName + "%"); 以上这个小技巧是比较好的解决方案,然而我每次都要忘记,在此记录存档! ...

彪叔的博客 3831

一篇文章带你搞定数学建模中的线性回归模型(05年长江水质问题示例讲解含代码)

文章目录一、问题分析二、原理讲解三、MATLAB 实现线性回归模型 一、问题分析 根据你的预测分析,如果未来10年内每年都要求长江干流的Ⅳ类和Ⅴ类水的比例控制在20%以内,且没有劣Ⅴ类水,那么每年需要处理多少污水 为了达到题目中所要求的水质,可建立废水排放量与各类水百分比之间的二元线性回归模型,对未来十年的废水排放量进行预测,并确定其与各类水所占百分比之间的函数关系式。通过此关系式,可以计算在这种情况下长江所能承受的最大污水排放量,将这个排放量与预测的排放量进行比较,多出来的部分就是需要每年处理掉的。 二、

南淮北安的博客 2167

一张图读懂 SAP S/4HANA Cloud 与 SAP BTP 的扩展版图

本文解析了SAP S/4HANA Cloud的扩展技术谱系,提出扩展应分为on-stack(系统内)和side-by-side(并行)两种路径,并沿着低代码到专业代码的能力梯度进行分层。on-stack扩展包括面向业务人员的Key User Extensibility和面向开发者的Developer Extensibility,强调贴近核心业务对象;side-by-side扩展则依托SAP BTP平台,提供SAP Build低代码工具、CAP开发框架和ABAP云环境三种方案,支持解耦创新。文章通过五个真实案

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 255

【MyBatis学习】占位符,sql注入问题,like模糊匹配等可能出现一定的问题,赶快与我一同去了解,避免入坑吧 ! ! !

【MyBatis学习】占位符,sql注入问题,like模糊匹配等可能出现一定的问题,赶快与我一同去了解,避免入坑吧 ! ! !

程序员良辰 3881

机器人外接 USB 音响完整配置指南

摘要:本文介绍了为机器人配置外接音响的方法。由于内置音响音量小且有散热噪音,建议使用Type-C接口外接音响。配置步骤包括:1)通过aplay -l命令查看音响端口信息;2)使用aplay命令测试音频播放;3)通过amixer命令设置音量。关键点在于正确识别音响的卡号(如card 2)和设备号(如device 0),并在命令中准确配置这些参数即可实现外接音响的正常使用。

m0_47999117的博客 359

索引 1 超出范围&rs结果集为空&SQL中LIKE '%' 与 PreparedStatement的占位符 ?问题

数据是传过来了,但是到后面就不对了,查了很多都没解决,谁能帮帮我 这是servlet代码 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("utf-...

墨无名 398

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

java mysql 占位符_在Java中编写带占位符的SQL语句

C#中SQL中带占位符的语句假设有一张学员信息表Student,通过表中的ID来找学员,查询的SQL语句如下string sql = string.Format("select * from Student where id={0} ",id);正常Java的语句String sql="select * from tbl_board where id=?";上面这种Java语句中的 ?也相当于一个...

weixin_30699915的博客 1762

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

mysql中like语句注入_like查询中的SQL注入

list = schoolDao.getSchoolByName("长乐一中%' or '1%' = '1");for(School school : list){System.out.println(school.getName());}}catch(Exception e){e.printStackTrace();}}用p6spy查看最后生成的sql语句:Sql代码sql1:select *...

weixin_39643865的博客 4502

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

别让 like 变成 “后门“!MyBatis 防 SQL 注入实战:5 种方案彻底筑牢数据安全防线

本文详细解析了在MyBatis中使用like语句时防止SQL注入的5种安全方案:1. 参数占位符+CONCAT函数:在SQL层面安全拼接模糊查询条件;2. Java手动拼接%符号:将处理逻辑前置到代码层;3. MyBatis bind标签:在XML中完成安全拼接;4. MyBatis-Plus QueryWrapper:利用框架提供的安全查询方法;5. 输入校验:基础防御措施。文章强调应优先使用参数绑定(#{})而非字符串拼接(${}),并建议采取"多层防御"策略,包括输入校验等。

果酱 の 博客 1526

用 like concat 不用 like,为了防止sql注入;#{}和${}的区别和用法;#{}预防SQL注入的原理

其次${}本身设计的初衷就是为了参与SQL语句的语法生成,自然而然会导致SQL注入的问题(不会考虑字符过滤问题)。(1)#{}在使用时,会根据传递进来的值来选择是否加上双引号,因此我们传递参数的时候一般都是直接传递,不用加双引号,${}则不会,我们需要手动加(2)在传递一个参数时,我们说了#{}中可以写任意的值,则必须使用value;即:{}则必须使用value;则必须使用value;即:{value}

qq_46023827的博客 1571

Mybatis预防SQL注入之like模糊查询整理

#{}是经过预编译的,是安全的;${}是未经过预编译的,仅仅是取变量的值,是非安全的,存在SQL注入。 如果order by语句后用了${},那么不做任何处理的时候是存在SQL注入危险的。只能手动处理过滤一下输入的内容。如判断一下输入的参数的长度是否正常(注入语句一般很长),更精确的过滤则可以查询一下输入的参数是否在预期的参数集合中。 ‘#’与 ‘$’ 的区别最大在于:#{} 传入值时,sql解析...

qq_34868715的博客 7713

SQL 引号中的问号在PrepareStatement 中不被看作是占位符

  SQL 引号中的问号在PrepareStatement 中不被看作是占位符。   如:SELECT P.NAME, S.YEAR, S.QUANTITY FROM SALES S LEFT JOIN PRODUCT P ON S.PRODUCT_ID = P.ID WHERE P.NAME LIKE '%?%'   会报java.sql.SQLException: 无效的列索引。   可...

weixin_33688840的博客 615

PreparedStatement 使用like 模糊查询

sql语句不必修改,在填充占位符时将需要模糊查询的字段拼接 % 即可,如下代码 @Override public List<Book> selectByName(Connection conn, String name) { String sql = "select * from book where book_name like ?"; return getForList(conn, sql, "%" + name + "%"); } .

Alu_em的博客 477

Mybatis 模糊查询三种方法

背景   由于项目需要模糊查询,所以需要使用LIKE子句。LIKE子句需要使用%作为占位符,所以需要将%与字段值连接到一起。Mybatis下大概有如下几种方式实现:①使用$占位符,②使用数据库函数concat,③使用Mybatis的动态sql标签,下面会简单介绍下前两种的用法和缺陷,然后重点介绍第三种,如何使用以及存在的坑。 使用$ 代码如下: @Select({"<script>",...

qq_36438618的博客 1680

mysql中like会sql注入吗_like查询中的SQL注入

看《ibatis in action》,里面提到了使用like进行模糊查询的时候,会有注入漏洞。举例说明如下:Xml代码select*from tbl_schoolwhere school_name like '%$name$%'Java代码public List getSchoolByName(String name) throws DataAccessException {List list ...

weixin_30725113的博客 2167

preparedStatement中的like模糊查询

sqlStr = "select id,name from 表 where name like ?"; 这种方式对应的ps.setString(1, "%"+"abc"+"%"); 这种方式更为通用,不管对什么样的数据库 另外还有种方式sqlStr = "select id,name from 表 where name like '%'+?+'%'";这种方式对应的ps.setString...

zhuyx808的专栏 303

MySQL动态SQL避坑指南:${}和#{}的正确使用场景与安全实践

本文深入解析MySQL动态SQL中${}和#{}占位符的核心差异与安全实践,重点介绍${}在动态表名、列名等特殊场景的正确使用方法,并提供防SQL注入的加固方案。通过真实案例展示如何规避常见陷阱,帮助开发者平衡灵活性与安全性,提升数据库操作效率。

gaochao的博客 585

MyBatis 如何防止 SQL 注入?

MyBatis 防 SQL 注入的核心是:参数一律使用 #{} 做参数绑定(PreparedStatement 的 ? 占位),实现 SQL 结构与数据分离;对于必须使用 ${} 的表名/列名/排序等 SQL 片段,必须采用白名单或 <choose> 枚举替代。#{} 通过 TypeHandler 进行参数绑定而非简单转义,而 ${} 直接拼接 SQL 结构存在注入风险。关键场景如 LIKE 查询应使用 CONCAT 函数,IN 查询使用 <foreach> 生成多个 #{},分页参

2303_77517907的博客 1110
上一篇: Java实现简易Tomcat服务器(清晰易懂)
下一篇: PreparedStatement预编译无法用?占位符替换表名和字段名
LiQiyaoo
博客等级 码龄11年 337粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值