前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简单谈一谈 Java 中的预编译

简单谈一谈 Java 中的预编译

作者头像
p4nda
发布2023-01-03 13:57:41
1.3K0
发布2023-01-03 13:57:41
举报
文章被收录于专栏:技术猫屋

目录

0x01 预编译机制

在java中JDBC中,我们写 SQL 语句的时候,有个预处理功能,这个功能一大优势就是能提高执行速度,尤其是多次操作数据库的情况,再一个优势就是预防SQL注入,严格的说,应该是预防绝大多数的SQL注入。

如下示例代码即为Java中 JDBC 的预处理:

代码语言:javascript
复制
String sql = "select * from t_student where name = ? and content = ?"
try {
    PreparedStatement ps = conn.prepareStatement(sql);
    ps.setString(1,name);
    ps.setString(2,content);
    ps.executeUpdate(sql_update);
}catch(Exception e){
    e.printStackTrace();
}

那么这个预编译的功能,到底是如何防止 SQL 注入的呢?

0x02 预编译的原理

其实是因为,SQL语句在代码运行前,已经进行了预编译。在程序运行时第一次操作数据库之前,SQL语句已经被数据库分析,编译和优化,然后对应的执行计划也会缓存下来并允许数据库已参数化的形式进行查询。

当运行时,JDBC动态地把参数传给PreparedStatement时,即使参数里有敏感字符,如: ' or ' 1' = '1 updatexml(2,concat(0x7e,(version())),0)等,preparedStatement 会对入参中的关键字进行转义,比如单引号转义成\',其流程大致如下:

总之,简单来说,JDBC在处理SQL语句时有一个预编译的过程,而预编译对象就是把一些格式固定的SQL编译后,存放在内存池中即JDBC缓冲池,当我们再次执行相同的SQL语句时就不需要预编译的过程了,所以即使SQL注入特殊的语句,也会只当做参数传进去,不会当做指令执行

0x03 参考

https://blog.csdn.net/aidupo6157/article/details/101981536

https://blog.csdn.net/theorytree/article/details/7331096

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
    • 0x01 预编译机制
      • 0x02 预编译的原理
        • 0x03 参考
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档