预防sql注入方法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
预防sql注入方法

2008-10-14  HYPERLINK /blog/252439 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

文档评论(0)

80219pm + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档