当前位置: 首页 > news >正文

中国做外贸最好的网站百度指数怎么下载

中国做外贸最好的网站,百度指数怎么下载,程序员需要考什么证书,远丰做网站怎么样场景需求 需要根据不同的列进行对应的排序操作,实现动态列名排序 类似🐟动态查询或更新 但是JDBC预编译模式下占位符的排序字段失效 SQL语句 分页查询 select * from (select t.*, rownum rn from(select * from emp order by empno desc) t where …

场景需求

需要根据不同的列进行对应的排序操作,实现动态列名排序 类似🐟动态查询或更新

但是JDBC预编译模式下占位符的排序字段失效

SQL语句

分页查询

select * from (select t.*, rownum rn from(select * from emp order by empno desc) t where rownum <= 5)    where rn > 0;

指定列排序失效

select * from (select t.*, rownum rn from(select * from emp order by ?  desc) t where rownum <= 5)    where rn > 0;

临时解决字符串拼接

  • SQL注入问题
select * from (select t.*, rownum rn from(select * from emp order by "+ empno  +  "  desc) t where rownum <= 5)    where rn > 0;

预编译注入排序列名排序失效

PreparedStatement执行SQL时,如果order by之后的排序字段使用占位符,通过setString设置值的话,会导致排序失效

// 4 SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。
PreparedStatement pstmt = conn.prepareStatement(sql);// 如果SQL有?号  参数需要注入
pstmt.setString(1, sortColumnName); // 1 代表 第一个?  从1开始   以此类推

源码

/*** An object that represents a precompiled SQL statement.* <P>A SQL statement is precompiled and stored in a* {@code PreparedStatement} object. This object can then be used to* efficiently execute this statement multiple times.** <P><B>Note:</B> The setter methods ({@code setShort}, {@code setString},* and so on) for setting IN parameter values* must specify types that are compatible with the defined SQL type of* the input parameter. For instance, if the IN parameter has SQL type* {@code INTEGER}, then the method {@code setInt} should be used.** <p>If arbitrary parameter type conversions are required, the method* {@code setObject} should be used with a target SQL type.* <P>* In the following example of setting a parameter, {@code con} represents* an active connection:* <pre>{@code*   BigDecimal sal = new BigDecimal("153833.00");*   PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES*                                     SET SALARY = ? WHERE ID = ?");*   pstmt.setBigDecimal(1, sal);*   pstmt.setInt(2, 110592);* }</pre>** @see Connection#prepareStatement* @see ResultSet* @since 1.1*/
public interface PreparedStatement extends Statement {/*** Sets the designated parameter to the given Java {@code String} value.* The driver converts this* to an SQL {@code VARCHAR} or {@code LONGVARCHAR} value* (depending on the argument's* size relative to the driver's limits on {@code VARCHAR} values)* when it sends it to the database.** @param parameterIndex the first parameter is 1, the second is 2, ...* @param x the parameter value* @throws SQLException if parameterIndex does not correspond to a parameter* marker in the SQL statement; if a database access error occurs or* this method is called on a closed {@code PreparedStatement}*/void setString(int parameterIndex, String x) throws SQLException;... 
}

核心解释

  • 将指定的参数设置为给定的Java{@code String}值。
  • 驱动程序转换此转换为SQL{@code VARCHAR}或{@code LONGVARCHAR}值

原因

PreparedStatement用占位符防止SQL注入的原理是,在为占位符设置值时,会将值转为字符串,然后转义,再将值放入反引号中,放置在占位符的位置上。

因此,当排序字段使用占位符后,原来的排序语句 order by empno(假设排序字段是empno),在实际执行时变成了 order by empno,根据字段排序变成了根据字符串常量值empno排序,导致排序失效,甚至任意的注入数值都不影响前面的查询结果

情况一

使用预编译的数据库操作对象在order by后面设置占位符,再通过pstmt.setString()方法填入参数会导致排序失败

情况二

使用mybatis的时候,在mapper sql映射.xml文件中,在order by 后面使用 #{参数名} 依然会导致排序失败,因为mybatis #{} 使用的是PrepareStatement

解决办法

  • #{}方式传参数只能处理值参数 不能传递表名,字段等参数
  • ${}字符串替换,可以动态处理表名,字段参数

#{}改成${}, #{}是预编译,相当于PrepareStatement;${}是普通字符串的拼接,相当于Statement

但是必须注意SQL注入的风险,对参数做好校验处理

http://www.yidumall.com/news/28777.html

相关文章:

  • wordpress判断浏览器aso优化费用
  • 雄安网站建设需要多少钱关键词抓取工具都有哪些
  • tp3.2.3网站开发实例起名最好的网站排名
  • 网站建设开发文档怎么建立信息网站平台
  • 网站上的图片多大合适凌云seo博客
  • 网站开发程序开发自媒体营销推广方案
  • 编制综合网站平台的公司排名沈阳百度seo关键词排名优化软件
  • 做生存分析的网站有哪些宁波seo深度优化平台
  • 找网站建设营销型网站建设的重要原则
  • 如何做网站商城网站更换服务器对seo的影响
  • 深圳广东网站建设套餐软文推广方案
  • axure做网站原型模板简述优化搜索引擎的方法
  • 大英做网站湖南中高风险地区
  • 专做健身餐的网站独立站建站平台
  • 响应式网站建设哪里有搜索引擎优化的名词解释
  • 郑州哪家公司做网站好营销型网站的类型
  • 深圳网站建设与推广搜索引擎优化技巧
  • 商业网站开发设计实训总结谷歌paypal官网入口
  • 企业做网站建设数据分析师培训机构
  • ae免费模板下载网站培训学校网站
  • 极速网站建设哪家好公司网站的作用
  • 成立网站有什么要求旺道seo优化软件怎么用
  • 建设专业网站公司浙江短视频seo优化网站
  • 长沙做网站的公司有哪些什么是营销渠道
  • 泉州网站建设网络推广全网推广平台推荐
  • 商标注册转让优化大师下载旧版本安装
  • 西安专业网站建设公司永久免费个人网站注册
  • 大连网站代运营的公司有哪些石家庄最新新闻事件
  • 上城区商城网站建设推广类软文案例
  • 网站开发经验教训seo查询工具网站