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/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.html http://java.sun.com/j2se/1.4.1/docs/api/java/sql/CallableStatement.html

mysql注入漏洞检查_漏洞检测:SQL注入漏洞 WASC Threat Classification相关推荐

  1. mysql监测攻击_如何检测SQL注入技术以及跨站脚本攻击

    展开全部 在最近两年中,安全专家应该对网络应用层的攻击更加重e69da5e887aa62616964757a686964616f31333339666164视.因为无论你有多强壮的防火墙规则设置或者非 ...

  2. php mysql 注入一句话木马_渗透技术--SQL注入写一句话木马原理

    讲一下SQL注入中写一句话拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 这个语句,下面是一个语句的例子: SELECT * INTO OUTFILE 'C:\ ...

  3. sqlmap注入教程linux,Linux Sqlmap检测sql注入漏洞工具安装使用教程

    Sqlmap工具 什么是SQLmap? SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹.访问底层文件系统.执行命令) sql注 ...

  4. 使用sqlmap检测sql注入漏洞

    一. sql注入概述并安装sqlmap漏洞查看工具 1. sql注入概述 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命 ...

  5. mysql注入漏洞语句,web安全之sql注入漏洞

    概念 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通俗地讲,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力 ...

  6. mysql注入如何读取本地文件_如何通过SQL注入获取服务器本地文件

    写在前面的话 SQL注入可以称得上是最臭名昭著的安全漏洞了,而SQL注入漏洞也已经给整个网络世界造成了巨大的破坏.针对SQL漏洞,研究人员也已经开发出了多种不同的利用技术来实施攻击,包括非法访问存储在 ...

  7. 【转载】用Snort巧妙检测SQL注入和跨站脚本攻击

    脚本攻击是最近网络上最疯狂的攻击方法了,很多服务器配置了先进的硬件防火墙.多层次的安全体系,可惜最后对80端口的SQL注入和跨站脚本攻击还是没有办法抵御,只能看着数据被恶意入侵者改的面目全非而毫无办法 ...

  8. Sqlmap速查表/功能移植/Python批量检测SQL注入

    title: Sqlmap速查表与Python进行功能移植 copyright: true top: 0 date: 2021-02-27 11:59:00 tags: [扫描注入,注入,sqlmap ...

  9. java防止sql注入方正_有效防止SQL注入的5种方法总结

    sql注入入门 SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQ ...

  10. sql sp_password登录名不存在或 权限_什么是SQL注入攻击?怎么预防?

    转自CSDN,作者hellochenlu/网易号,云计算那些事 互联网的攻击形式千万种,威胁最大的独一份,就是SQL注入了!由于它的危害之大,它也成为了每一个运维工程师为客户部署业务系统前必做的防御. ...

最新文章

  1. mysql 控制函数库_数据库开发——MySQL——函数与流程控制
  2. pandas最大的时间间隔_pandas生成时间列表(某段连续时间或者固定间隔时间段)(示例代码)...
  3. numpy一维数组的反转/倒序
  4. Python-EEG工具库MNE中文教程(10)-信号空间投影SSP数学原理
  5. 即时消息服务框架(iMSF)应用实例之分布式事务三阶段提交协议的实现
  6. 大学毕业就进入SAP,我获得了哪些收益
  7. Android开发 - 掌握ConstraintLayout(一)传统布局的问题
  8. LeetCode 434. Number of Segments in a String
  9. Azure IoT带来更高效的新能源生产和会看人脸色的无人超市
  10. word2010生成目录的方法
  11. Dubbo 沉睡,Spring Cloud 崛起!
  12. python 面向对象编程、别人么样用_Python 中的面向对象没有意义
  13. struts如何使用命名空间_Python基础篇:作用域和命名空间
  14. Ajax Loading进度条gif在线生成网站Preloaders.net
  15. html5音乐播放器格式midi,HTML5 Audio时代的MIDI音乐文件播放
  16. android锁屏自动清理,越用越快!华为P10为你锁屏自动清理后台缓存
  17. Linux下安装各种常用软件
  18. php global 要点
  19. Android开发之高仿QQ消息侧拉删除
  20. IDEA 返回上一步,回到下一步 冲突 快捷键设置

热门文章

  1. 论坛数据库设计初步设计
  2. python网络爬虫一
  3. Connected to the target VM,address: ,transport: ‘socket‘
  4. matlab符号及其运算(1)
  5. 【Servlet】什么情况下调用doGet和doPost
  6. 大家来玩WSL(Windows Subsystem for Linux)
  7. Python技术项目实践
  8. java中引用数据类型有哪几种
  9. 多线程使用场景(经典必看)
  10. Java多态的应用练习题