博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
预编译防止sql注入
阅读量:4180 次
发布时间:2019-05-26

本文共 2498 字,大约阅读时间需要 8 分钟。

PreparedStatement为什么能在一定程度上防止SQL注入?

PreparedStatement会对SQL进行了预编译,在第一次执行SQL前数据库会进行分析、编译和优化,同时执行计划同样会被缓存起来,它允许数据库做参数化查询。在使用参数化查询的情况下,数据库不会将参数的内容视为SQL执行的一部分,而是作为一个字段的属性值来处理,这样就算参数中包含破环性语句(or ‘1=1’)也不会被执行。

怎么使用PreparedStatement?如何避免SQL注入式攻击?PreparedStatement与Statement有什么区别,有什么样的优势?


一个PreparedStatement简单例子

public class JDBCTest {
public static void main(String[] args) { //表示使用Unicode字符集;字符编码设置为utf-8;不使用SSL连接 String URL = "jdbc:mysql://127.0.0.1:3306/sampledb?useUnicode=true&" + "characterEncoding=utf-8&useSSL=false"; String USER = "spring4";//用户 String PASSWORD = "spring4";//密码 Connection conn = null; PreparedStatement st = null; ResultSet rs = null; try { //1.加载驱动程序到JVM Class.forName("com.mysql.jdbc.Driver"); //2.创建数据库连接 conn = DriverManager.getConnection(URL, USER, PASSWORD); //3.创建Statement,实现增删改查 String sql = "select user_id,user_name,credits from t_user where credits > ?"; st = conn.prepareStatement(sql);//这里使用PreparedStatement st.setInt(1, 8); //4.向数据库发送SQL命令 rs = st.executeQuery(); //5.使用ResultSet处理数据库的返回结果 while (rs.next()) { System.out.println(rs.getLong("user_id") + " " + rs.getString("user_name") + " " + rs.getString("credits")); } } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } finally { //6.关闭资源 try { rs.close(); st.close(); conn.close(); } catch (SQLException e) { e.printStackTrace(); } } }}

Statement的几种实现

Statement 对象用于将SQL语句发送到数据库中。

Statement每次执行SQL语句,数据库都要执行SQL语句的编译,最好用于仅执行一次查询并返回结果的情形
1、执行静态SQL语句。通常通过Statement实例实现。
2、执行动态SQL语句。通常通过PreparedStatement实例实现。
3、执行数据库存储过程。通常通过CallableStatement实例实现。

‘#’和‘$’的区别

sql 预编译指的是数据库驱动在发送 sql 语句和参数给 DBMS 之前对 sql 语句进行编译,这样 DBMS 执行 sql 时,就不需要重新编译。

‘#{ }’:解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,一个‘ #{ }’ 被解析为一个参数占位符 ? 。
‘${ }’ 仅仅为一个纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换。在预编译之前已经被变量替换了
‘${ }’变量的替换阶段是在动态 SQL 解析阶段,而’#{ }’变量的替换是在 DBMS 中。

PreparedStatement与Statement有什么区别

1.PreparedStatement能预编译,这条预编译的SQL查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。

2.PreparedStatement可以写动态参数化的查询
3.PreparedStatement可以防止SQL注入式攻击
4.PreparedStatement查询可读性更好,追加条件的语句很乱
5.PreparedStatement不允许一个占位符(?)有多个值

转载地址:http://xmrai.baihongyu.com/

你可能感兴趣的文章
太赛博朋克!华为天才少年自制B站百大Up奖杯,网友:技术难度不高,侮辱性极强...
查看>>
华为正式宣布养猪,网友沸腾:支持华为自救!
查看>>
真的有必要读研究生吗?
查看>>
一个员工的离职成本到底有多恐怖!
查看>>
微软骂人:请勿TM关闭......
查看>>
B站python+数据分析精华汇总!速领,免费,一会删!
查看>>
一个中科大差生的8年程序员工作总结
查看>>
新功能!微信可以开“小号”了
查看>>
墙裂推荐!一款 VM 大规模集群管理工具
查看>>
知乎万赞:计算机应届生月薪大多是多少?
查看>>
试用期没过,因在公司上了1024网站...
查看>>
终于有人把如何精通C++讲明白了!
查看>>
我的天!史上最强的摸鱼网站!!!
查看>>
新款电脑,真香啊!!!
查看>>
为什么我劝你不要太把领导当回事?
查看>>
牛逼至极!用这个神器看代码太舒服了
查看>>
信息量过大,8h删!
查看>>
奉劝那些想把编程学好的人
查看>>
如果诸葛亮用C++写出师表。。。。
查看>>
线上jar包里,竟然藏有小电影
查看>>