-
前言
这段时间,因为找室友、找工作的事情,心烦了好久,整租下来的三室,和一个朋友来租的,我不禁想说,我有离沪的想法,可是朋友是信任我才来的,我不能辜负了我的朋友,或许要是真找不到室友就只能说是提前和朋友沟通一下了。在上海找工作其实并不难,难的是你的通勤时间、工作内容、工资等等,和几个朋友诉说后,感觉挖漏洞赚钱确实不错,也不会受到领导的pua什么的,但真不是长久之计……
最主要的还是因为这段时间,各大SRC都在搞中秋活动,混迹各种礼盒套装 : ) 感谢枫落师傅这几天的陪伴
从拾记录学习生活,今天主要是看到了一篇关于Java上对Sql注入的防御措施讲起,但众所周知,Sql注入一般的防御措施就是过滤转义、限制数据类型、预编译等等,今天主要是分享一下Java中的预编译。
-
PreparedStatement SQL预编译查询
// 获取用户传入的用户ID
String id = request.getParameter("id");
// 定义最终执行的SQL语句,这里会将用户从请求中传入的host字符串拼接到最终的SQL
// 语句当中,从而导致了SQL注入漏洞。
String sql = "select id, username, email from sys_user where id =? ";
// 创建预编译对象
PreparedStatement pstt = connection.prepareStatement(sql);
// 设置预编译查询的第一个参数值
pstt.setObject(1, id);
// 执行SQL语句并获取返回结果对象
ResultSet rs = pstt.executeQuery();
需要特别注意的是并不是使用PreparedStatement来执行SQL语句就没有注入漏洞,而是将用户传入部分使用?(问号)占位符表示并使用PreparedStatement预编译SQL语句才能够防止注入!
-
JDBC预编译
JDBC预编译查询分为客户端预编译和服务器端预编译,对应的URL配置项是useServerPrepStmts,当useServerPrepStmts为false时使用客户端(驱动包内完成SQL转义)预编译,useServerPrepStmts为true时使用数据库服务器端预编译。其实也是采用的是prepareStatement预编译,在于区别是要想采用客户端还是服务端的区别。以下内容作为了解就好了
主要看参数useServerPrepStmts
客户端预编译:
jdbc:mysql://localhost:3306/mysql?autoReconnect=true&zeroDateTimeBehavior=round&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&useOldAliasMetadataBehavior=true&useSSL=false&useServerPrepStmts=false
服务端预编译:
jdbc:mysql://localhost:3306/mysql?autoReconnect=true&zeroDateTimeBehavior=round&useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true&useOldAliasMetadataBehavior=true&useSSL=false&useServerPrepStmts=true
最终结果没什么不同~
-
总结
下次面试再遇到的话,就不用单单的说Sql注入防御措施只有过滤转义、限制数据类型、预编译啦,是如何做到预编译的就可以展开讲讲了,希望给大家能够带来一些帮助,Good Luck!
原文始发于微信公众号(Undoubted Security):Sql注入的防御措施
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论