网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,担心网上的信息以及个人隐私遭到泄露。下面要为大家介绍的是SQL注入,对于sql注入,相信程序员都知道或者使用过,如果没有了解或完全没有听过也没有关系,我们可以通过下面来一起学习下。

  • 什么是sql注入?

sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。

SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以目前市面的防火墙都不会对SQL注入发出警报,如果管理员没查看IIS日志的习惯,可能被入侵很长时间都不会发觉。 但是,SQL注入的手法相当灵活,在注入的时候会碰到很多意外的情况。能不能根据具体情况进行分析,构造巧妙的SQL语句,从而成功获取想要的数据,是高手与“菜鸟”的根本区别。

  • sql注入原理

SQL注射能使攻击者绕过认证机制,完全控制远程服务器上的数据库。 SQL是结构化查询语言的简称,它是访问数据库的事实标准。目前,大多数Web应用都使用SQL数据库来存放应用程序的数据。几乎所有的Web应用在后台 都使用某种SQL数据库。跟大多数语言一样,SQL语法允许数据库命令和用户数据混杂在一起的。如果开发人员不细心的话,用户数据就有可能被解释成命令, 这样的话,远程用户就不仅能向Web应用输入数据,而且还可以在数据库上执行任意命令了。

SQL注入式攻击的主要形式有两种。一是直接将代码插入到与SQL命令串联在一起并使得其以执行的用户输入变量。上面笔者举的例子就是采用了这种方法。由于其直接与SQL语句捆绑,故也被称为直接注入式攻击法。二是一种间接的攻击方法,它将恶意代码注入要在表中存储或者作为原书据存储的字符串。在存储的字符串中会连接到一个动态的SQL命令中,以执行一些恶意的SQL代码。注入过程的工作方式是提前终止文本字符串,然后追加一个新的命令。如以直接注入式攻击为例。就是在用户输入变量的时候,先用一个分号结束当前的语句。然后再插入一个恶意SQL语句即可。由于插入的命令可能在执行前追加其他字符串,因此攻击者常常用注释标记“—”来终止注入的字符串。执行时,系统会认为此后语句位注释,故后续的文本将被忽略,不背编译与执行。

  • sql注入示例

这里我们举一个比较常见的例子来简要说明一下sql注入的原理。假如我们有一个users表,里面有两个字段username和password。在我们的java代码中我们初学者都习惯用sql拼接的方式进行用户验证。比如:"select id from users where username = '"+username +"' and password = '" + password +"'" 这里的username和password都是我们存取从web表单获得的数据。下面我们来看一下一种简单的注入,如果我们在表单中username的输入框中输入' or 1=1-- ,password的表单中随便输入一些东西,假如这里输入123.此时我们所要执行的sql语句就变成了select id from users where username = '' or 1=1-- and password = '123',我们来看一下这个sql,因为1=1是true,后面 and password = '123'被注释掉了。所以这里完全跳过了sql验证。

  • sql注入攻击预防

1.采用预编译语句集,它内置了处理SQL注入的能力,只要使用它的setXXX方法传值即可。

使用好处:

(1).代码的可读性和可维护性.

(2).PreparedStatement尽最大可能提高性能.

(3).最重要的一点是极大地提高了安全性.

<span style="font-size:14px;">String sql= "select * from users where username=? and password=?;

PreparedStatement preState = conn.prepareStatement(sql);

preState.setString(1, userName);

preState.setString(2, password);

ResultSet rs = preState.executeQuery(); </span>

原理:sql注入只对sql语句的准备(编译)过程有破坏作用,而PreparedStatement已经准备好了,执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析,准备,因此也就避免了sql注入问题.

2.使用正则表达式过滤传入的参数

正则表达式:

private String CHECKSQL = “^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$”;

判断是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具体的正则表达式:

检测SQL meta-characters的正则表达式 :

/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix

修正检测SQL meta-characters的正则表达式 :/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i

典型的SQL 注入攻击的正则表达式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

检测SQL注入,UNION查询关键字的正则表达式 :/((\%27)|(\’))union/ix(\%27)|(\’)

检测MS SQL Server SQL注入攻击的正则表达式:

/exec(\s|\+)+(s|x)p\w+/ix

等等…..

其实可以简单的使用replace方法也可以实现上诉功能:

public static String TransactSQLInjection(String str)

{

return str.replaceAll(".*([';]+|(--)+).*", " ");

}

3.字符串过滤

比较通用的一个方法:

(||之间的参数可以根据自己程序的需要添加)

<span style="font-size:14px;">public static boolean sql_inj(String str)

{

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

String inj_stra[] = split(inj_str,"|");

for (int i=0 ; i < inj_stra.length ; i++ )

{

if (str.indexOf(inj_stra[i])>=0)

{

return true;

}

}

return false;

}</span>

4.jsp中调用该函数检查是否包函非法字符

防止SQL从URL注入:

sql_inj.java代码:

<span style="font-size:14px;">package sql_inj;

import java.net.*;

import java.io.*;

import java.sql.*;

import java.text.*;

import java.lang.String;

public class sql_inj{

public static boolean sql_inj(String str)

{

String inj_str = "'|and|exec|insert|select|delete|update|

count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";

//这里的东西还可以自己添加

String[] inj_stra=inj_str.split("\\|");

for (int i=0 ; i < inj_stra.length ; i++ )

{

if (str.indexOf(inj_stra[i])>=0)

{

return true;

}

}

return false;

}

} </span>

5.JSP页面添加客户端判断代码:

使用javascript在客户端进行不安全字符屏蔽

功能介绍:检查是否含有”‘”,”\\”,”/”

参数说明:要检查的字符串

返回值:0:是1:不是

函数名是

<span style="font-size:14px;">function check(a)

{

return 1;

fibdn = new Array (”‘” ,”\\”,”/”);

i=fibdn.length;

j=a.length;

for (ii=0; ii<i; ii++)

{ for (jj=0; jj<j; jj++)

{ temp1=a.charAt(jj);

temp2=fibdn[ii];

if (tem’; p1==temp2)

{ return 0; }

}

}

return 1;

} </span>

以上,是为大家分享的“SQL注入原理及预防SQL注入的方法“的解决方法”的全部内容。

SQL注入原理及预防SQL注入的方法相关推荐

  1. mysql报错注入原理,MySQL报错注入

    什么是报错注入 SQL报错注入就是利用数据库的某些机制,人为地制造错误条件,使得查询结果可以出现在错误信息中.我一位好友的博客写过一个SQL注入的专栏,除了报错注入以外,别的类型也写了,而且比较详细, ...

  2. 依赖注入原理 php,PHP依赖注入原理与用法分析

    本文实例讲述了PHP依赖注入原理与用法.分享给大家供大家参考,具体如下: 引言 依然是来自到喜啦的一道面试题,你知道什么是依赖注入吗? 依赖注入(DI)的概念虽然听起来很深奥,但是如果你用过一些新兴的 ...

  3. mysql注入原理_Mysql报错注入原理分析

    报错类型Duplicate entry报错:多次查询插入重复键值导致count报错从而在报错信息中带入了敏感信息. Xpath报错:从mysql5.1.5开始提供两个XML查询和修改的函数,语法错误导 ...

  4. guice依赖注入原理_Google Guice依赖注入示例教程

    guice依赖注入原理 Google Guice is the framework to automate the dependency injection in applications. If y ...

  5. 依赖注入原理(为什么需要依赖注入)

    0. 前言 在软件工程领域,依赖注入(Dependency Injection)是用于实现控制反转(Inversion of Control)的最常见的方式之一.本文主要介绍依赖注入原理和常见的实现方 ...

  6. 预防SQL注入攻击之我见 转

    1. SQL注入攻击的本质:让客户端传递过去的字符串变成SQL语句,而且能够被执行. 2. 每个程序员都必须肩负起防止SQL注入攻击的责任. 说起防止SQL注入攻击,感觉很郁闷,这么多年了大家一直在讨 ...

  7. SQL注入原理及如何判断闭合符

    一.SQL注入原理: 造成SQL注入的原因: 在没有对用户的输入进行过滤.检测的情况下,就把用户输入数据,带入到数据库中执行SQL语句. 利用SQL注入: 由于系统没有对输入的数据进行过滤.检测,就带 ...

  8. mysql的注入原理_mysql 注入原理以及防范

    一.注入原理 通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令 二.实例 1.建表sql CREATE TABLE `web_safe` ( ...

  9. 使用占位符预防SQL注入的原理

    2019独角兽企业重金招聘Python工程师标准>>> String sql = "select * from table where id = "; Strin ...

最新文章

  1. 脑智前沿科普|虚拟现实如何欺骗你的大脑
  2. 保定linux第一版PPT-SVN for Linux
  3. 转:android git开源项目列表
  4. 北京内推 | 微软亚洲研究院MSRA STCA招聘多模态算法实习生
  5. spring boot web项目_阿里技术专家带你使用Spring框架快速搭建Web工程项目
  6. S/4HANA生产订单增强WORKORDER_UPDATE方法BEFORE_UPDATE参数分析 1
  7. java中生成pdf文件,java 中生成pdf 文件
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的英语在线学习系统
  9. 强人工智能基本问题:神经网络分层还是不分层
  10. grid studio python_Grid studio表格应用程序:Python的集大成者
  11. Expression Blend实例中文教程(11) - 视觉管理器快速入门Visual State Manager(VSM)
  12. 64位计算机安装xp,练习u盘如何安装XP 64位系统
  13. 【JS】中文繁简转换
  14. Excel如何快速录入甲乙丙丁序列
  15. 【百度云破解】Proxyee Down使用
  16. 【Xmanager】Xbrowser-XDMCP远程访问RHEL5.3配置
  17. Deep Crossing——经典的深度学习架构
  18. GPU_GEMS_自然态_渲染水焦散
  19. access随系统启动的宏_Access 中启动带宏的excel
  20. Discuz论坛简单搭建

热门文章

  1. Boost Note团队的来信
  2. maven 镜像仓库(阿里云)
  3. iconfont-阿里巴巴矢量图标库使用js方式更更改不了图标颜色解决方法
  4. Python的占位符及占位符的使用
  5. 初级项目——记账系统、双色球
  6. Python爬虫系列06——requests模块(1)
  7. allegro PCB 中异形板板框外围开窗
  8. FFmpe写一个多线程播放器1 基础逻辑和队列定义
  9. Postgresql全文索引
  10. 2021-08-29 网安实验-WEB专题-捉迷藏