Java中PrepateStatement是Statement的一个子接口,它是Java JDBC FrameWork的一部分。它用于对数据库执行分类操作;PreparedStatement支持参数化查询,因此被认为更安全。 PreparedStatement还可以防止SQL注入攻击;可以通过调用Connection的prepareStatement(String query)方法来获得PreparedStatement的实例。
- 关于PreparedStatement:
- PreparedStatement是Statement的子接口,作用与Statement一样;
- PreparedStatement特点:
使用PreparedStatement可以执行动态参数化sql(在sql语句中用占位符?) - PreparedStatement原理:
在我们调用创建PreparedStatement 对象 pstm时候,我们需要将一个半成品sql语句交给pstm,pstm拿着这个sql先发送到数据库,进行预编译(检查语法,检查权限),当我们调用pstm.setXXX()的时候,再一起把占位符设置的动态参数值一起发送到数据库执行,不用再编译当前的sql语句,这样可以大大的节省时间,提高运行效率。
- Statement与PrepareStatement的区别
- 使用statement执行sql语句,是以字符串拼接的方式,给sql语句加入参数,这个时候存在sql注入危险;
- 使用PreparedStatement 可以避免sql注入(安全)
- 使用PreparedStatement,代码的可读性高,可维护性好,可以提高运行效率。
- 什么是SQL注入
SQL注入(SQL Injection)是一种常见的Web安全漏洞,形成主要原因是Web应用程序在接收相关数据参数时未做好过滤,将其直接带入到数据库中查询,导致攻击者可以拼接构造的SQL语句。
注入产生的原因是后台服务器在接收前端相关参数时未做好过滤直接带入到数据库中查询,导致可以拼接执行SQL语句。
- SQL注入危害
- 数据库信息泄露:数据库中存放的用户隐私信息的泄露。
- 网页篡改:通过操作数据库对特定网页进行篡改。
- 网站被挂木马,传播恶意软件:修改数据库一些字段值,嵌入木马连接,进行挂马攻击。
- 数据库被恶意操作:数据库被攻击且数据库的系统管理员账户被篡改。
- 服务器被远程控制,被安装后面。
- 破坏硬盘数据,偏瘫整个应用系统。
- 防范SQL注入解决SQL注入问题的关键是对所有可能来自用户输入的数据进行严格的检查,对数据库配置使用最小权限原则。代码层:
- 对输入进行严格的转义和过滤
- 使用参数化(Parameterized)
- PDO预处理
- 通过WAF设备启用防SQL Inject注入策略
- 云端防护