sql 注入问题
2015-09-29 10:16
274 查看
目前的理解:
PrepareStatement可以使得在SQL中实现的查询是参数化的,sql语句的格式已经事先设定好,并常驻内存(这同时也实现了高效),当用户传入参数时,会有检查机制使得只有符合语法的参数参数才有效。
SQL注入攻击主要是因为SQL语句的拼接造成的。
在Java中防止SQL注入攻击的方法是参数化查询,即使用PreparedStatement代替Statement
使用PreparedStatement的参数化的查询可以阻止大部分的SQL注入(然而并不是全部)
在使用参数化查询的情况下,数据库系统(eg:MySQL)不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有破坏性的指令,也不会被数据库所运行
参数化查询,目前被视作最有效可预防SQL注入攻击的攻击手法的防御方式,而且参数化查询相比“拼接字符串”的SQL语句,不仅安全性更好,而且效率更高。
使用PreparedStatement的优点:
数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。执行计划同样会被缓存起来,它允许数据库做参数化查询。使用预处理语句比普通的查询更快,因为它做的工作更少(数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)
PreparedStatement不支持预编译SQL查询的JDBC驱动,在调用connection.prepareStatement(sql)的时候,它不会把SQL查询语句发送给数据库做预处理,而是等到执行查询动作的时候(调用executeQuery()方法时)才把查询语句发送个数据库,这种情况和使用Statement是一样的。
参考:
/article/4793841.html
http://www.importnew.com/5006.html
PrepareStatement可以使得在SQL中实现的查询是参数化的,sql语句的格式已经事先设定好,并常驻内存(这同时也实现了高效),当用户传入参数时,会有检查机制使得只有符合语法的参数参数才有效。
SQL注入攻击主要是因为SQL语句的拼接造成的。
在Java中防止SQL注入攻击的方法是参数化查询,即使用PreparedStatement代替Statement
使用PreparedStatement的参数化的查询可以阻止大部分的SQL注入(然而并不是全部)
在使用参数化查询的情况下,数据库系统(eg:MySQL)不会将参数的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有破坏性的指令,也不会被数据库所运行
参数化查询,目前被视作最有效可预防SQL注入攻击的攻击手法的防御方式,而且参数化查询相比“拼接字符串”的SQL语句,不仅安全性更好,而且效率更高。
使用PreparedStatement的优点:
数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。执行计划同样会被缓存起来,它允许数据库做参数化查询。使用预处理语句比普通的查询更快,因为它做的工作更少(数据库对SQL语句的分析,编译,优化已经在第一次查询前完成了)
PreparedStatement不支持预编译SQL查询的JDBC驱动,在调用connection.prepareStatement(sql)的时候,它不会把SQL查询语句发送给数据库做预处理,而是等到执行查询动作的时候(调用executeQuery()方法时)才把查询语句发送个数据库,这种情况和使用Statement是一样的。
参考:
/article/4793841.html
http://www.importnew.com/5006.html
相关文章推荐
- memcache的线程模型
- MSSQL自动备份数据库
- 【转】数据库设计经验谈(一个成功的管理系统,是由:[50% 的业务 + 50% 的软件] 所组成,而 50% 的成功软件又有 [25% 的数据库 + 25% 的程序] 所组成,数据库设计的好坏是一个关键)
- redis 主从服务器
- AWR oracle
- sql server 误删log文件,如何上传服务器
- SQL Server 代理 (已禁用代理XP)
- 将数据库数据放到redis中并保持数据一致性方案
- oracle查看表空间数据文件使用情况
- 数据库系统原理1
- MySQL主从同步故障-Slave_SQL_Running: No
- Oracle数据库timestamp选择时间间隔大于30分的记录 和 INTERVAL DAY TO SECOND数据类型详解
- MongoDB数据库设计中6条重要的经验法则(二)
- 完全卸载mysql(停止服务、卸载相关程序、删除注册表)
- django使用model创建数据库表使用的字段
- SparkSQL: no typetag available for xxxx问题的解决办法
- sqlserver学习--SQL语句
- sqlserver学习--基本管理
- 后台服务器及相关中间件部署(zookeeper、ActiveMQ,mysql,mongo、redis)
- sql