zoukankan      html  css  js  c++  java
  • SQL注入攻击

    攻击者把SQL命令插入到Web表单的输入域,或者页面请求的查询字符串中,欺骗服务器执行恶意的SQL命令。
     
    在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这种表单很容易受到攻击。
     
    【防范方法】
    ——替换单引号。
    ——删除所有连字符。
    ——对执行查询的数据库账户,限制其权限。
    ——用存储过程来执行所有查询。
    ——检查用户输入的合法性。
    ——将用户登录名和密码等数据加密保存。
    ——检查提取数据的查询所返回的记录数量。
     
    ==========================================================================
    【攻击网站的方法】
    SQL注入,旁注,XSS跨站,COOKIE欺骗,DDOS,0day 漏洞,社会工程学等等。
     
    【了解注入原理】
    因为SQL是一种解释型语言,在运行时,是由一个运行时组件解释语言代码,并执行其中包含的指令的语言。基于这种执行方式,产生了一系列叫做代码注入(code injection)的漏洞。它的数据其实是由程序员编写的代码和用户提交的数据共同组成的。程序员在web开发时,没有过滤敏感字符,绑定变量,导致攻击者可以通过sql灵活多变的语法,构造精心巧妙的语句,不择手段,达成目的,或者通过系统报错,返回对自己有用的信息。
     
    【java.sql.PreparedStatement】扩展自 Statement,不但具有 Statement 的所有能力而且具有更强大的功能。不同的是,PreparedStatement 是在创建语句对象的同时给出要执行的sql语句。这样,sql语句就会被系统进行预编译,执行的速度会有所增加,尤其是在执行大语句的时候,效果更加理想。而且PreparedStatement中绑定的sql语句是可以带参数的。
     
    【注入手法】
    我们提交的用户名和密码被合成到SQL查询语句当中之后是这样的:
    select * from users where username='tarena' and password=md5('admin')
     
    只要构造个特殊的“字符串”,照样能够成功登录。
    比如:在用户名输入框中输入:’or 1=1#,密码随便输入,这时候的合成后的SQL查询语句为:
    select * from users where username='' or 1=1#' and password=md5('')
    语义分析:“#”在mysql中是注释符,这样井号后面的内容将被mysql视为注释内容,这样就不会去执行了,换句话说,以下的两句sql语句等价:
    select * from users where username='' or 1=1#' and password=md5('')
    等价于
    select * from users where username='' or 1=1
    因为1=1永远都是成立的,即where子句总是为真,将该sql进一步简化之后,等价如下select语句:
    select * from users
    没错,该sql语句的作用是检索users表中的所有字段。
     
    ==========================================================================
  • 相关阅读:
    树的计数 + prufer序列与Cayley公式 学习笔记
    链表
    密码学摘要
    查找与排序
    匿名内部类 调用方法内局部变量
    <c:url>标签相关知识点
    Oracle 导入导出数据库
    oracle cursor
    Oracle 删除用户和表空间------创建表空间和用户
    iOS延迟执行方法
  • 原文地址:https://www.cnblogs.com/lsx1993/p/4626136.html
Copyright © 2011-2022 走看看