`
幽绿琵琶
  • 浏览: 63271 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

SQL注入及预防

sql 
阅读更多
SQL注入原理
以往Web应用程序访问数据库时一般是采取拼接字符串的形式,比如登录的时候就是根据用户名和密码去查询:
string sql = “select * from user where UserName = ‘” + userName + “’ and Password = ‘” + password + “’”;

其中userName和password两个变量的值是由用户输入的。假设password的值是“' ' or ' ' = ' ' ”,userName的值任意,那变量sql的 值就是:
select * from user where UserName = ‘user’ and Password = ‘’ or ‘’ = ‘’;

因 ’’ =’’ 恒为真,因此只要User表中有数据,不管UserName、Password的值是否匹配,这条SQL命令都能查出记录来。

预防措施-参数化查询
参数化查询(Parameterized Query 或 Parameterized Statement)是指在设计与数据库链接并访问数据时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的防御方式。
在使用参数化查询的情况下,数据库服务器不会将参数化的内容视为SQL指令的一部分来处理,而是在数据库完成SQL指令的编译后,才套用参数运行。因此即使参数中含恶意指令,因已编译完成,就不会被数据库所运行。

带参数的SQL指令
1)Microsoft SQL Server
Microsoft SQL Server 的参数格式是以 "@" 字符加上参数名称,也支持匿名参数 "?"。
select * from user where sex=@sex
insert  into  user(c1, c2, c3, c4) VALUES (@c1, @c2, @c3, @c4)

2)Microsoft Access
Microsoft Access 只支持匿名参数 "?"。
update  user  set c1 = ?, c2 = ?, c3 = ? where c4 = ?

3)MySQL
MySQL 的参数格式是以 "?" 字符加上参数名称而成。
update  user  set c1 = ?c1, c2 = ?c2, c3 = ?c3 where c4 = ?c4

备注:匿名参数“?”,在给参数赋值时一定要按顺序赋值,否则可能执行出错。

客户端程序
1)ADO.NET示例
要查找user表中的男性用户,SQL语句是这样:
select * from user where sex=1

用参数化SQL语句表示为:
select * from user where sex=@sex

对SQL语句中的参数赋值,假如我们要查找user表中所有年龄大于30岁的男性用户,这个参数化SQL语句可以这么写:
select * from user where sex=@sex and age>@age


//实例化Connection对象
SqlConnection connect =newSqlConnection("server=localhost;database=test;uid=root;pwd=''");
//实例化Command对象
SqlCommand command =newSqlCommand("select * from user where sex=@sex and age>@age", connect);

//第一种添加查询参数的例子 
command.Parameters.AddWithValue("@sex",true);

//第二种添加查询参数的例子 
SqlParameter parameter =newSqlParameter("@age", SqlDbType.Int);//User表age字段是int型
parameter.Value = 30; 
command.Parameters.Add(parameter);//添加参数

//将查询结果集以DataTable的方式返回
//实例化DataAdapter
SqlDataAdapter adapter =newSqlDataAdapter(command); 
DataTable data =newDataTable();

2)PHP
$sex = ‘男’;
$age = ‘27’;
$query = sprintf("select * from user where sex='%s' and age>'%d'",
mysql_real_escape_string($sex),
mysql_real_escape_string($age));
mysql_query($query);

或者:
$db = new mysqli("localhost", "user", "pass", "database");
$stmt = $mysqli -> prepare("select * from user where sex=? and age>?");
$stmt -> bind_param("sd", $sex, $age);
$sex = ‘男’;
$age = ‘27’;
$stmt -> execute();

3)JDBC
PreparedStatement prep = conn.prepareStatement("SELECT * FROM USERS WHERE USERNAME=? AND PASSWORD=?");
prep.setString(1, username);
prep.setString(2, password);

分享到:
评论

相关推荐

    SQL注入漏洞全接触.ppt

    * SQL注入漏洞的原理是从客户端提交特殊的代码,从而收集程序及服务器的信息,从而获取攻击者想得到的资料。 二、 SQL注入漏洞的危害 * SQL注入漏洞可能导致敏感数据泄露、服务器被入侵、网站沦陷等严重后果。 * ...

    SQL注入攻击实验报告

    ### SQL注入攻击实验报告知识点详解 #### 一、实验背景及目的 - **实验背景**:随着互联网技术的发展,Web应用程序越来越广泛地...在实际开发过程中,必须高度重视安全性问题,采取多种措施来预防和抵御SQL注入攻击。

    SQL注入全面讲解技术文档

    通过理解其原理,采取有效的预防措施,以及定期评估和更新防护策略,可以大大降低SQL注入攻击的风险。对于初学者和专业开发者来说,深入研究SQL注入的各个方面,包括入门、进阶和高级技巧,是提升系统安全性的关键...

    基于ESAPI的防sql注入jar包及使用示例.rar

    **基于ESAPI的防SQL注入技术** 在网络安全领域,SQL注入是一种常见的攻击手段,通过恶意构造SQL语句,攻击者可以获取、修改甚至删除数据库中的敏感数据。为了防止这种攻击,开发人员通常会采用各种防御策略,其中一...

    SQL注入攻击及其预防方法研究

    针对SQL注入攻击的预防方法可以从程序编写和服务器设置两方面入手。在程序编写方面,开发者需要遵循以下最佳实践: 1. 使用参数化查询:这是预防SQL注入的最有效方式。通过使用参数化查询,可以保证传入的参数仅仅...

    SQL注入漏洞演示源代码

    了解SQL注入的基本概念后,开发者应采取以下预防措施: 1. **数据验证**:对所有用户输入进行严格的格式验证,确保其符合预期的类型和格式。 2. **转义输入**:使用函数(如PHP的mysqli_real_escape_string)对特殊...

    sql注入万能密码

    #### 一、SQL注入简介 SQL注入是一种常见的网络安全攻击方式,攻击者通过在Web应用程序的输入字段中插入恶意SQL语句来操纵后端数据库的行为。这种攻击通常利用了Web应用对用户输入数据的不充分过滤和验证。万能密码...

    PHP+Mysql 带SQL注入源码 下载

    这个"PHP+Mysql 带SQL注入源码 下载"的主题涉及到一个常见的安全问题——SQL注入,以及如何处理和预防这种情况。下面将详细讨论SQL注入、PHP与MySQL的结合使用,以及如何防范SQL注入。 **SQL注入** SQL注入是一种...

    SQL注入文献.zip

    这些文献集合为理解SQL注入攻击的演变、检测技术和预防措施提供了一个全面的视角,对于网络安全研究者和Web开发人员来说都是宝贵的资源。通过深入学习和实践,我们可以增强Web应用程序的安全性,抵御SQL注入的威胁。

    Python中防止sql注入的方法详解

    对于使用Python进行Web开发的人员来说,了解如何有效地预防SQL注入是非常重要的。本文将详细介绍几种在Python开发中防止SQL注入的方法,并通过实例来展示这些技术的应用。 #### SQL注入的原因与危害 SQL注入通常...

    防止sql注入解决方案

    为了防止SQL注入,开发者需要采取一系列的预防措施,确保应用程序的安全性。以下是一些核心的解决方案: 1. **预编译语句(PreparedStatement)**: 题目中提到的预编译语句是防止SQL注入的关键技术。预编译语句在...

    sql注入Java过滤器

    配置在web.xml中,可以防止SQL注入,可以自己定义一些需要过滤的特殊字符

    sql注入攻击防范解析

    SQL注入攻击是网络安全领域中一个严重的问题,它发生在应用程序未能充分验证或清理用户输入的数据时。...在开发过程中,始终遵循安全编码的最佳实践,确保用户输入的安全性,是预防SQL注入的关键。

    案例预防SQL注入漏洞函数

    本案例中,提供了几种预防SQL注入漏洞的方法。 首先,我们来看提供的`checkStr`函数,它用于过滤掉可能含有SQL特殊字符的输入。函数内部,`replace`函数被多次调用来替换掉空格 `'`(单引号)、`;`(分号)、`--`...

    sql注入法攻击sql注入法攻击.rar

    "sql注入法攻击.sql注入法攻击.rar"这个文件很可能是关于如何预防和应对SQL注入攻击的教学资料。 在了解SQL注入攻击之前,我们首先要明白SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言。...

    SQL注入攻击与防御

    因此,如何有效预防和减轻SQL注入攻击的影响,是网络安全领域中亟待解决的问题。 为了防范SQL注入,本书《SQL注入攻击与防御》由专注于SQL注入安全研究的专家团队编写,内容涵盖所有与SQL注入攻击相关的信息。书中...

    万能SQL注入程序

    在这个过程中,我们需要理解SQL注入的基本原理、如何预防以及如何进行有效测试。 SQL注入攻击的原理是攻击者通过输入恶意的SQL代码到应用的输入字段,以篡改原有的SQL查询,从而获取未经授权的数据访问、修改甚至...

    java web Xss及sql注入过滤器.zip

    本项目"java web Xss及sql注入过滤器.zip"就是针对这两种威胁提供的一种解决方案,基于流行的Spring Boot 2.0框架进行开发。 XSS 攻击是通过在网页中插入恶意脚本,当其他用户访问该页面时,这些脚本会被执行,从而...

Global site tag (gtag.js) - Google Analytics