mysql注入漏洞检查_漏洞检测:SQL注入漏洞 WASC Threat Classification
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相关推荐
- mysql监测攻击_如何检测SQL注入技术以及跨站脚本攻击
展开全部 在最近两年中,安全专家应该对网络应用层的攻击更加重e69da5e887aa62616964757a686964616f31333339666164视.因为无论你有多强壮的防火墙规则设置或者非 ...
- php mysql 注入一句话木马_渗透技术--SQL注入写一句话木马原理
讲一下SQL注入中写一句话拿webshell的原理,主要使用的是 SELECT ... INTO OUTFILE 这个语句,下面是一个语句的例子: SELECT * INTO OUTFILE 'C:\ ...
- sqlmap注入教程linux,Linux Sqlmap检测sql注入漏洞工具安装使用教程
Sqlmap工具 什么是SQLmap? SQLmap是一款用来检测与利用SQL注入漏洞的免费开源工具,有一个非常棒的特性,即对检测与利用的自动化处理(数据库指纹.访问底层文件系统.执行命令) sql注 ...
- 使用sqlmap检测sql注入漏洞
一. sql注入概述并安装sqlmap漏洞查看工具 1. sql注入概述 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命 ...
- mysql注入漏洞语句,web安全之sql注入漏洞
概念 通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.通俗地讲,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力 ...
- mysql注入如何读取本地文件_如何通过SQL注入获取服务器本地文件
写在前面的话 SQL注入可以称得上是最臭名昭著的安全漏洞了,而SQL注入漏洞也已经给整个网络世界造成了巨大的破坏.针对SQL漏洞,研究人员也已经开发出了多种不同的利用技术来实施攻击,包括非法访问存储在 ...
- 【转载】用Snort巧妙检测SQL注入和跨站脚本攻击
脚本攻击是最近网络上最疯狂的攻击方法了,很多服务器配置了先进的硬件防火墙.多层次的安全体系,可惜最后对80端口的SQL注入和跨站脚本攻击还是没有办法抵御,只能看着数据被恶意入侵者改的面目全非而毫无办法 ...
- Sqlmap速查表/功能移植/Python批量检测SQL注入
title: Sqlmap速查表与Python进行功能移植 copyright: true top: 0 date: 2021-02-27 11:59:00 tags: [扫描注入,注入,sqlmap ...
- java防止sql注入方正_有效防止SQL注入的5种方法总结
sql注入入门 SQL 注入是一类危害极大的攻击形式.虽然危害很大,但是防御却远远没有XSS那么困难. SQL 注入漏洞存在的原因,就是拼接 SQL 参数.也就是将用于输入的查询参数,直接拼接在 SQ ...
- sql sp_password登录名不存在或 权限_什么是SQL注入攻击?怎么预防?
转自CSDN,作者hellochenlu/网易号,云计算那些事 互联网的攻击形式千万种,威胁最大的独一份,就是SQL注入了!由于它的危害之大,它也成为了每一个运维工程师为客户部署业务系统前必做的防御. ...
最新文章
- mysql 控制函数库_数据库开发——MySQL——函数与流程控制
- pandas最大的时间间隔_pandas生成时间列表(某段连续时间或者固定间隔时间段)(示例代码)...
- numpy一维数组的反转/倒序
- Python-EEG工具库MNE中文教程(10)-信号空间投影SSP数学原理
- 即时消息服务框架(iMSF)应用实例之分布式事务三阶段提交协议的实现
- 大学毕业就进入SAP,我获得了哪些收益
- Android开发 - 掌握ConstraintLayout(一)传统布局的问题
- LeetCode 434. Number of Segments in a String
- Azure IoT带来更高效的新能源生产和会看人脸色的无人超市
- word2010生成目录的方法
- Dubbo 沉睡,Spring Cloud 崛起!
- python 面向对象编程、别人么样用_Python 中的面向对象没有意义
- struts如何使用命名空间_Python基础篇:作用域和命名空间
- Ajax Loading进度条gif在线生成网站Preloaders.net
- html5音乐播放器格式midi,HTML5 Audio时代的MIDI音乐文件播放
- android锁屏自动清理,越用越快!华为P10为你锁屏自动清理后台缓存
- Linux下安装各种常用软件
- php global 要点
- Android开发之高仿QQ消息侧拉删除
- IDEA 返回上一步,回到下一步 冲突 快捷键设置