漏洞影响

攻击者利用该漏洞可能导致

1.网页被篡改

2.数据被篡改

3. 核心数据被窃取

4. 数据库所在服务器被攻击变成傀儡主机

解决方法:

1.      过滤用户输入的内容,检查用户输入的内容中是否有非法内容。如,|(竖线符号)、 & (& 符号)、;(分号)、$(美元符号)、%(百分比符号)、@(at 符号)、\'(单引号)、"(引号)、\\\'(反斜杠转义单引号)、\\"(反斜杠转义引号)、<>(尖括号)、()(括号)、+(加号)、 CR(回车符,ASCII 0x0d)、 LF(换行,ASCII 0x0a)、,(逗号)、\\(反斜杠)、)(结束括号)等符号。

2.      过滤危险的SQL语句关键字,如select,from,update,insert,delete等。

3.      利用存储过程,将数据访问抽象化,让用户不直接访问表或视图。当使用存储过程时,请利用 ADO 命令对象来实施它们,以强化变量类型。

4.      使用防注入系统。

5.      修复示例

Asp.Net

以下是保护 Web 应用程序免遭 SQL 注入攻击的两种可行方法:

5.1  使用存储过程,不用动态构建的 SQL 查询字符串。将参数传递给 SQL Server 存储过程的方式,可防止使用单引号和连字符。

以下是如何在ASP.NET 中使用存储过程的简单示例:

\' Visual Basic example

Dim DS As DataSet

Dim MyConnection AsSqlConnection

Dim MyCommand AsSqlDataAdapter

Dim SelectCommand As String= "select * from users where username = @username"

...

MyCommand.SelectCommand.Parameters.Add(NewSqlParameter("@username", SqlDbType.NVarChar, 20))

MyCommand.SelectCommand.Parameters("@username").Value =UserNameField.Value

// C# example

String selectCmd ="select * from Authors where state = @username";

SqlConnection myConnection =new SqlConnection("server=...");

SqlDataAdapter myCommand =new SqlDataAdapter(selectCmd, myConnection);

myCommand.SelectCommand.Parameters.Add(newSqlParameter("@username", SqlDbType.NVarChar, 20));

myCommand.SelectCommand.Parameters["@username"].Value= UserNameField.Value;

5.2  您可以使用验证控件,将输入验证添加到“Web 表单”页面。验证控件提供适用于所有常见类型的标准验证的易用机制,例如,测试验证日期是否有效,或验证值是否在范围内,以及进行自定义编写验证的方法。此外,验证控件还可以使您能够完整定义向用户显示错误信息的方式。验证控件可搭配“Web 表单”页面的类文件中处理的任何控件使用,其中包括 HTML 和 Web 服务器控件。为了确保用户输入仅包含有效值,您可以使用以下其中一种验证控件:

5.2.1 “RangeValidator”:检查用户条目(值)是否在指定的上下界限之间。 您可以检查配对数字、字母字符和日期内的范围。

5.2.2 “RegularExpressionValidator”:检查条目是否与正则表达式定义的模式相匹配。 此类型的验证使您能够检查可预见的字符序列,如电子邮件地址、电话号码、邮政编码等中的字符序列。最后:验证控件不会阻止用户输入或更改页面处理流程;它们只会设置错误状态,并产生错误消息。程序员的职责是,在执行进一步的应用程序特定操作前,测试代码中控件的状态。有两种方法可检查用户输入的有效性: 1. 测试常规错误状态:在您的代码中,测试页面的 IsValid 属性。该属性会将页面上所有验证控件的 IsValid 属性值汇总(使用逻辑 AND)。如果将其中一个验证控件设置为无效,那么页面属性将会返回 false。 2. 测试个别控件的错误状态:在页面的“验证器”集合中循环,该集合包含对所有验证控件的引用。然后,您就可以检查每个验证控件的 IsValid 属性。

PHP

5.3过滤用户输入

将任何数据传给 SQL 查询之前,应始终先使用筛选技术来适当过滤。 这无论如何强调都不为过。 过滤用户输入可让许多注入缺陷在到达数据库之前便得到更正。

5.4将用户输入加引号

不论任何数据类型,只要数据库允许,便用单引号括住所有用户数据。

5.5 转义数据值

如果使用 MySQL4.3.0 或更新的版本,您应该用 mysql_real_escape_string() 来转义所有字符串。 如果使用旧版的 MySQL,便应该使用mysql_escape_string() 函数。如果未使用 MySQL,您可以选择使用特定数据库的特定换码功能。如果不知道换码功能,您可以选择使用较一般的换码功能,例如,addslashes()。

如果使用 PEAR DB 数据库抽象层,您可以使用DB::quote() 方法或使用 ? 之类的查询占位符,它会自动转义替换占位符的值。参考资料http://ca3.php.net/mysql_real_escape_string

http://ca.php.net/mysql_escape_string

http://ca.php.net/addslasheshttp://pear.php.net/package-info.php?package=DB

5.6输入数据验证:虽然为方便用户而在客户端层上提供数据验证,但仍必须始终在服务器层上执行数据验证。客户端验证本身就不安全,因为这些验证可轻易绕过,例如,通过禁用 Javascript。一个好的设计通常需要 Web 应用程序框架,以提供服务器端实用程序例程,从而验证以下内容:必需字段,字段数据类型(缺省情况下,所有 HTTP 请求参数都是“字符串”),字段长度,字段范围,字段选项,字段模式, cookie 值,HTTP 响应等,以下部分描述一些检查的示例。

// PHP example to validaterequired fields

functionvalidateRequired($input) {

...

$pass = false;

if(strlen(trim($input))>0){

$pass = true;

}

return $pass;

...

}

...

if(validateRequired($fieldName)) {

// fieldName is valid,continue processing request

...

}

J2EE

** 预编译语句:

以下是保护应用程序免遭 SQL 注入(即恶意篡改 SQL 参数)的三种可行方法。使用以下方法,而非动态构建 SQL 语句:

5.7 PreparedStatement,通过预编译并且存储在PreparedStatement 对象池中。 PreparedStatement 定义 setter 方法,以注册与受支持的 JDBC SQL 数据类型兼容的输入参数。例如,setString 应该用于 VARCHAR 或 LONGVARCHAR 类型的输入参数(请参阅 Java API,以获取进一步的详细信息)。通过这种方法来设置输入参数,可防止攻击者通过注入错误字符(如单引号)来操纵 SQL 语句。

如何在 J2EE 中使用 PreparedStatement 的示例:

//J2EE PreparedStatemenet Example

//Get a connection to the database

Connection myConnection;

if(isDataSourceEnabled()) {

// using the DataSource to get a managed connection

Context ctx = new InitialContext();

myConnection =((DataSource)ctx.lookup(datasourceName)).getConnection(dbUserName, dbPassword);

}else {

try {

// using the DriverManager to get a JDBC connection

Class.forName(jdbcDriverClassPath);

myConnection = DriverManager.getConnection(jdbcURL, dbUserName,dbPassword);

} catch (ClassNotFoundException e) {

...

}

}

...

try{

PreparedStatement myStatement =myConnection.prepareStatement("select * from users where username =?");

myStatement.setString(1, userNameField);

ResultSet rs = myStatement.executeQuery();

...

rs.close();

}catch (SQLException sqlException) {

...

}finally {

myStatement.close();

myConnection.close();

}

5.8 CallableStatement,扩展PreparedStatement 以执行数据库 SQL 存储过程。该类继承 PreparedStatement 的输入 setter 方法(请参阅上面的 [1])。

以下示例假定已创建该数据库存储过程:

CREATE PROCEDURE select_user (@usernamevarchar(20)) AS SELECT * FROM USERS WHERE USERNAME = @username;

如何在 J2EE 中使用 CallableStatement 以执行以上存储过程的示例:

//J2EE PreparedStatemenet Example

//Get a connection to the database

Connection myConnection;

if(isDataSourceEnabled()) {

// using the DataSource to get a managed connection

Context ctx = new InitialContext();

myConnection =((DataSource)ctx.lookup(datasourceName)).getConnection(dbUserName, dbPassword);

}else {

try {

// using the DriverManager to get a JDBC connection

Class.forName(jdbcDriverClassPath);

myConnection = DriverManager.getConnection(jdbcURL, dbUserName,dbPassword);

} catch (ClassNotFoundException e) {

...

}

}

...

try{

PreparedStatement myStatement = myConnection.prepareCall("{?= callselect_user ?,?}");

myStatement.setString(1, userNameField);

myStatement.registerOutParameter(1, Types.VARCHAR);

ResultSet rs = myStatement.executeQuery();

...

rs.close();

}catch (SQLException sqlException) {

...

}finally {

myStatement.close();

myConnection.close();

}

5.9实体 Bean,代表持久存储机制中的EJB 业务对象。实体 Bean 有两种类型:bean 管理和容器管理。当使用 bean 管理的持久性时,开发者负责撰写访问数据库的 SQL 代码。当使用容器管理的持久性时,EJB 容器会自动生成 SQL 代码。因此,容器要负责防止恶意尝试篡改生成的 SQL 代码。

如何在 J2EE 中使用实体 Bean 的示例:

//J2EE EJB Example

try{

// lookup the User home interface

UserHome userHome = (UserHome)context.lookup(User.class);

// find the User remote interface

User = userHome.findByPrimaryKey(new UserKey(userNameField));

...

}catch (Exception e) {

...

}

推荐使用的 JAVA 工具不适用

参考资料http://java.sun.com/j2se/1.4.1/docs/api/java/sql/PreparedStatement.htmlhttp://java.sun.com/j2se/1.4.1/docs/api/java/sql/CallableStatement.html

转载于:https://www.cnblogs.com/hunchun/p/7609104.html

SQL注入漏洞 详解相关推荐

  1. SQL 注入漏洞详解

    [渗透测试实用手册]SQL注入漏洞 漏洞名称 SQL注入漏洞 漏洞地址 漏洞等级 高危 漏洞描述 SQL 注入漏洞是指攻击者通过把恶意的 SQL 语句插入到网站的输入参数中,来绕过网站的安全措施,获取 ...

  2. Web网络安全漏洞分析,SQL注入原理详解

    本文主要为大家介绍了Web网络安全漏洞分析SQL注入的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪 一.SQL注入的基础 1.1 介绍SQL注入 SQL注入就是 ...

  3. Java程序员从笨鸟到菜鸟之(一百)sql注入攻击详解(一)sql注入原理详解

    前段时间,在很多博客和微博中暴漏出了12306铁道部网站的一些漏洞,作为这么大的一个项目,要说有漏洞也不是没可能,但其漏洞确是一些菜鸟级程序员才会犯的错误.其实sql注入漏洞就是一个.作为一个菜鸟小程 ...

  4. XXE实体注入漏洞详解

    本文转自行云博客https://www.xy586.top/ 文章目录 什么是XXE 原理 XXE漏洞带来的的危害 什么是 XML 寻找XXE XXE的防御 示例 什么是XXE XML Externa ...

  5. 74cms3.0安装以及cmsSQL注入漏洞详解

    下载解压到www目录并开启低版本PHP服务 访问 http://127.0.0.1/74cms3.0/install/index.php Error:Can't select MySQL databa ...

  6. php sql漏洞修复,php sql注入漏洞与修复

    出于安全考虑,需要过滤从页面传递过来的字符. 通常,用户可以通过以下接口调用数据库的内容:URL地址栏.登陆界面.留言板.搜索框等. 轻则数据遭到泄露,重则服务器被拿下. 一.SQL注入的步骤 a) ...

  7. 墨者学院SQL手工注入靶场漏洞详解

    墨者学院SQL手工注入靶场漏洞详解 目录 靶场地址 步骤详解 目录 靶场地址 该靶场由墨者学院安全工程师"墨者"所搭建,靶场环境为Nginx+PHP+MySQL,启动靶场只需1墨币 ...

  8. 张小白的渗透之路(二)——SQL注入漏洞原理详解

    SQL注入漏洞简介 乱七八糟的就不多说了,自己百度去 SQL注入原理 想要更好的学习SQL注入,那么我们就必须要深入的了解每种数据库的SQL语法及特性.下面通过一个经典的万能密码的例子带大家来拨开一下 ...

  9. mysql数据库sql注入原理_sql注入原理详解(一)

    防止SQL注入: 1.开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置 2.执行sql语句时使用addslashes进行sql语句转换 3.Sql语句书写 ...

最新文章

  1. 抓紧!抓紧!CSDN年终重榜福利来了~人手一份,快来投稿!!
  2. 移动端接口:版本的兼容
  3. beautifulsoup4
  4. 部署用于生产的Exceptionlees(一个强大易用的日志收集服务)
  5. python 百度云文字识别 proxy_python使用百度文字识别功能方法详解
  6. linux拉取指定时间内,Linux 日期和时间操作详解
  7. 云漫圈 | 有趣的海盗问题 (完整版)
  8. php路径伪静态化,URL地址伪静态化
  9. TextBox的OnTextboxChanged事件里对Text重新赋值带中文, 导致崩溃
  10. EditPlus中文绿色破解版安装
  11. RSA 含两道oj 上ctf题目
  12. NUL与NULL的区别
  13. 10个超棒的界面设计工具
  14. 零基础 Python学习
  15. 2018年计算机学校迎新标语,2018年大学迎新标语
  16. 招商银行资金管理解决方案
  17. 服务器端渲染(SSR)和客户端渲染
  18. linux运行.pl 文件,PL 文件扩展名: 它是什么以及如何打开它?
  19. markdown 绘制流程图、时序图、甘特图
  20. 二、Kubernetes安装

热门文章

  1. 如何在手机上完成日语翻译中文
  2. BADI 和BAPI 的区别
  3. Linux 共享内存
  4. Python str find方法
  5. word插入图片后只显示一部分,怎么解决?
  6. Storm Metric
  7. getch()和getche()
  8. CorelDraw 13从入门到精通视频教程
  9. windows重装系统
  10. 【顺序表】顺序表的就地逆置