为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

防止sql注入

2017-09-02 4页 doc 50KB 25阅读

用户头像

is_882336

暂无简介

举报
防止sql注入防止sql注入 2008-10-14 SQL注入攻击及其防范浅谈 SQL注入攻击 SQL注入攻击的基本原理,是从客户端合法接口提交特殊的非法代码,让其注入到服务器端执行业务的SQL中去,进而改变SQL语句的原有逻辑和影响服务器端正常业务的处理。 SQL注入攻击是Web应用中一个重要的安全问题,虽然Java具备较高的安全性,但如果开发人员不注意,也有可能留下安全隐患,请看示例: 执行验证的SQL语句 现有一个Login页面用来控制WebApp的入口,用户想要进入只有输入“用户名”和“密码”,负责用户登录处理的Se...
防止sql注入
防止sql注入 2008-10-14 SQL注入攻击及其防范浅谈 SQL注入攻击 SQL注入攻击的基本原理,是从客户端合法接口提交特殊的非法代码,让其注入到服务器端执行业务的SQL中去,进而改变SQL语句的原有逻辑和影响服务器端正常业务的处理。 SQL注入攻击是Web应用中一个重要的安全问,虽然Java具备较高的安全性,但如果开发人员不注意,也有可能留下安全隐患,请看示例: 执行验证的SQL语句 现有一个Login页面用来控制WebApp的入口,用户想要进入只有输入“用户名”和“密码”,负责用户登录处理的Servlet接受到请求后,将看数据usertable中是否存在这个用户名和密码,如果存在则让其进入,否则拒绝,进行验证的SQL语句如下: select count ( * ) from usertable where name = ' 用户名 ' and pswd = ' 密码„ 执行完这条SQL语句后,如果记录数等于零说明在usertable表找不到用户名和密码对应的记录,应该拒绝;如果记录数大于零则说明能在usertable表中找到对应的记录,应予放行。 如果用户进行SQL注入则可使验证无效 如果用户通过某种途径知道或是猜测出了验证SQL语句的逻辑,他就有可能在表单中输入特殊字符改变SQL原有的逻辑,比如在名称文本框中输入“ „ or ‟1„=‟1„ or ‟1„=‟1 ”或是在密码文本框中输入“ 1„ or ‟1„=‟1 ”,SQL语句将会变成: 1 . select count ( * ) from usertable where name = '' or ' 1 ' = ' 1 ' or ' 1 ' = ' 1 ' and pswd = '' 2 . select count ( * ) from usertable where name = '' and pswd = ' 1 ' or ' 1 ' = ' 1 ' 明显,or和单引号的加入使得where后的条件始终是true原有的验证完全无效了。 使用正则表达式屏蔽特殊字符 使用SQL注入攻击多在特殊字符上下手脚,如“‟”,“*”,“/” ,”--”等,如果用正则表达式限制特殊字符输入,这些手段将没有效果。下面的代码将阻止含有特殊字符的请求。 if (Pattern.matches( " \\w+ " , name) == false || Pattern.matches( " \\w+ " , pswd) == false ) { // 返回login界面 request.setAttribute( " feedbackMsg " , " 用户名和密码不允许包括特殊字符 " ); RequestDispatcher dispatcher = request.getRequestDispatcher( " /web/page/login1.jsp? curr=0 " ); dispatcher.forward(request, response); return ; } 使用PreparedStatement代替Statement SQL注入攻击能得逞是因为在原有SQL语句中加入了新的逻辑,如果使用PreparedStatement执行SQL语句,其后只是输入参数, SQL注入攻击手段将无效,这是因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构 。示例代码如下: Connection conn = null ; PreparedStatement ps = null ; ResultSet rs = null ; String sql = " select count(*) from usertable where name=? and pswd=? " ; ps = conn.prepareStatement(sql); ps.setString( 1 , name); ps.setString( 2 , pswd); PreparedStatement的错误使用 用PreparedStatement来防范SQL注入攻击是因为“因为PreparedStatement不允许在不同的插入时间改变查询的逻辑结构”,如果如下使用则起不到这个效果,因为SQL语句和参数没有分开,它们被组合在一起被一次性提交了。 Connection conn = null ; PreparedStatement ps = null ; ResultSet rs = null ; 。。。。 conn = DBUtil.getConnection(); sql = " select count(*) from usertable where name=' " + name + " ' and pswd=' " + pswd + " ' " ; ps = conn.prepareStatement(sql); rs = ps.executeQuery(); 这种情况下要防范SQL注入攻击还是要借助于正则表达式 。 小结 1.Web系统通常采用数据库作为数据源,而大多数业务处理都离不开SQL语句,因此系统潜在就有被SQL注入攻击的隐患,攻击可能会从任何一次URL提交或是FORM提交中发起。 2.使用PreparedStatement执行Sql语句比Statement安全得多,如果能使用PreparedStatement就不该用Statement,当然SQL主体和参数应该分开。 3.如果因为要执行动态多变的SQL语句而不得已采用Statement,则应该在服务器端用正则表达式进行输入验证。 4.客户端验证可能被取消,因此服务器端验证必不可少。
/
本文档为【防止sql注入】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索