search
HomeDatabaseMysql Tutorial预防查询语句数据库注入漏洞攻击
预防查询语句数据库注入漏洞攻击Jun 07, 2016 pm 04:17 PM
attackdatabaseInquireinjectionloopholesstatementprevention

简单地说,Sql注入就是将Sql代码传递到应用程序的过程,但不是按照应用程序开发人员预定或期望的方式插入,相当大一部分程序员在编写代码的时 候,并没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。这种漏洞并非系统照成,而是由程序员在编程

简单地说,Sql注入就是将Sql代码传递到应用程序的过程,但不是按照应用程序开发人员预定或期望的方式插入,相当大一部分程序员在编写代码的时 候,并没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。这种漏洞并非系统照成,,而是由程序员在编程中忽略了安全因素。Sql注入漏洞攻击原 理就是利用非法参数获得敏感信息,收集整理,分析出管理员账号密码。

当开发应用程序时,尤其是有关数据库信息的查询,查询语句中可能会有拼接字符串注入漏洞,这便会导致用户资料泄露。那么该如何防范此类漏洞的出现。

可以为查询语句设置参数,方法实例如下面所示

Using(Sqlconnection cn = new sqlconnection(“连接字符串”))

{

cn.open();

using(sqlcommand cmd = cn.creatcommand())

{

cmd.commandtext=”select * from T_table where name=’”+textbox.text+”’”;

(此时如果在文本框中输入1’ or ‘1’=’1)就可以获取数据库信息。会造成信息的泄露。解决办法就是引入参数。方法如下。

cmd.commandtext=”select * from T_table where name=@Name”;

cmd.Parameters.Add (new sqlParameter ("@Name", textbox.text))};

这样查询数据就会从数据库查询比对,不会再出现注入漏洞攻击的情况。

}

}

每一次必不可少的会写对数据库操作的Sql语句,例如以下验证登陆的Sql语句:

string strSql="select * from Table Where UserName='"+textBoxUserName.Text+'"and UserPassord='"+textBoxPassword.Text+"'";
或者
string strSql=string.Format("select * from Table where UserName='{0}' and UserPassword='{1}'",textBoxUserName.Text,textBoxPassword.Text);
在上面的语 句中,对数据库操作的Sql语句使用字符串拼接的方式写的,这种方式是前期的程序员以及初学者通用的对数据库操作的一种Sql语句写法,上述代码中的 textBoxUserName是用户在textBoxUserName文本框中提交的用户名,textUserpassword是用户在 textUserpassword文本框中提交的密码,在理想的状态下,用户 为了对系统进行攻击,用户(就是黑客)可能尝试篡改Sql语句,达到登录的目的。例如用户可能在用户名文本框中输入下面的语句:
1' or 1=1 --

下面我们把上面一行的语句代入到前面用于登录的Sql语句中,得到下面的Sql语句:
select * from Table where UserId='1' or 1=1 --'and UserName=' '
稍 微学过数据库Sql语句的,很快就会发现上面一句话的不正常,这条Sql语句会返回Table表的全部数据,这就是黑客有机可乘的地方,黑客可以用这种方 法成功登陆,还可以获取该Table表的所有信息。下面解释一下这句Sql语句:如果只有select * from Table,就会返回该Table表的所有信息,where后是查询条件,1=1永远为True,不管User='1'为True还是为 False,UserId='1' or 1=1 都为True。至于--'and UserName=' ' ,因为两个连字符(--)是MS Sql Server的注释标记(My Sql和Oracle数据库也使用相同的技术,不过My Sql使用的注释标记师是符号#,Oracle使用的是分号;),--后面的内容传到数据库查询时都被注释了,那么--后面的内容就没用了,Sql语句不 会执行了,所以where后的查询条件永远为True,综上所述,上面的Sql查询语句会返回Table表的所有信息!

通过这种Sql语法漏洞,黑客们可以达到他们的目的,但Sql注入漏洞攻击绝对不止这一种,复杂的还有很多,我不在说了。下面我谈一下我知道在.NET中应对上面这种Sql注入攻击的防范措施。
我 们所能做的,如果不修改上面的Sql查询语句,那一种方法就是利用TextBox控件的MaxLength属性,这样就键入了黑客键入字符的数量,从而可 以限制黑客向服务器发送大量的非法命令,但这种方法只是掩耳盗铃,治不了根本。第二种方法就是删除用户输入中的单引号,方法是在单引号后面加一个或多个单 引号,或者利用空格替换单引号,这样就可以预防此类攻击。但局限性是如果用户的用户名或密码中就含有单引号呢,那就不可行了!

最完美的一种方法就是使用ADO.NET Command对象的参数集合, 在前面的可以进行Sql注入漏洞攻击的Sql语句中,通过使用字符串拼接方法动态创建查询,在这里我们可以利用ADO.NET Command的对象的Parameters属性提供的功能,传递执行Sql语句所使用的参数,在这种方法中参数名必须以字符@为前缀,例如以下Sql查 询语句:
string strSql="select * from Table where UserName=@UserName and UserPassword=@UserPassword";
在该语句中,@UserName和@UserPassword就是参数名,可以使用以下语句为该参数传值:
SqlCommand cmd=new SqlCommand(strSql,conn);
SqlParameters[] pams=new SqlParameters(new SqlParameters("@UserName",textBoxUserName.Text),new SqlParameters("@UserPassword",textBoxPassword.Text));
cmd.Parameters.AddRange(pams);
参数名不区分大小写,这种方法也适宜存储过程和SqlDataAdapter对象。

我们在动态创建Sql语句中使用了@UserName和@UserPassword名称,而不是拼接多个字符 串,这样就可以使用SqlCommand对象的Parameters集合传递值,该方法可以安全的创建动态Sql连接。参数在Sql Server内部不是简单的字符串替换,Sql Server直接0用添加的值进行数据比较,因此不会有Sql注入漏洞攻击。

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
PHP如何查询Oracle数据库中的数据PHP如何查询Oracle数据库中的数据Jul 13, 2023 pm 07:34 PM

PHP如何查询Oracle数据库中的数据随着互联网时代的到来,网站和应用程序的开发越来越普遍。而数据库作为数据存储和管理的关键技术,也成为了开发者们必备的工具之一。其中,Oracle数据库作为一款功能强大、稳定可靠的关系型数据库管理系统,在企业级应用中得到了广泛应用。而在开发网站或应用程序时,如何使用PHP进行Oracle数据库的查询是一个非常重要的问题。在

PHP表单处理:表单数据查询与筛选PHP表单处理:表单数据查询与筛选Aug 07, 2023 pm 06:17 PM

PHP表单处理:表单数据查询与筛选引言在Web开发中,表单是一种重要的交互方式,用户可以通过表单向服务器提交数据并进行进一步的处理。本文将介绍如何使用PHP处理表单数据的查询与筛选功能。表单的设计与提交首先,我们需要设计一个包含查询与筛选功能的表单。常见的表单元素包括输入框、下拉列表、单选框、复选框等,根据具体需求进行设计。用户在提交表单时,会将数据以POS

查询从节点X开始,距离最多为D的子树中的最小权重查询从节点X开始,距离最多为D的子树中的最小权重Aug 25, 2023 am 11:25 AM

在进行计算机编程时,有时需要求出源自特定节点的子树的最小权重,条件是该子树不能包含距离指定节点超过D个单位的节点。这个问题出现在各个领域和应用中,包括图论、基于树的算法和网络优化。子树是较大树结构的子集,指定的节点作为子树的根节点。子树包含根节点的所有后代及其连接边。节点的权重是指分配给该节点的特定值,可以表示其重要性、重要性或其他相关指标。在这个问题中,目标是找到子树中所有节点中的最小权重,同时将子树限制在距离根节点最多D个单位的节点。在下面的文章中,我们将深入研究从子树中挖掘最小权重的复杂性

高德地图API文档解读:Java代码实现公交车在线运行状态查询高德地图API文档解读:Java代码实现公交车在线运行状态查询Jul 29, 2023 pm 10:45 PM

高德地图API文档解读:Java代码实现公交车在线运行状态查询导语:随着城市的发展,公共交通的重要性越来越凸显出来。人们对公交车的运行状态有着强烈的需求,例如实时到站时间、拥挤程度等信息。高德地图提供了强大的API以满足这方面的需求。本文将解读高德地图API文档,使用Java代码实现公交车在线运行状态查询,并提供代码示例。API概述高德地图API提供了丰富的

如何通过优化查询中的LIKE操作来提高MySQL性能如何通过优化查询中的LIKE操作来提高MySQL性能May 11, 2023 am 08:11 AM

MySQL是目前最流行的关系型数据库之一,但是在处理大量数据时,MySQL的性能可能会受到影响。其中,一种常见的性能瓶颈是查询中的LIKE操作。在MySQL中,LIKE操作是用来模糊匹配字符串的,它可以在查询数据表时用来查找包含指定字符或者模式的数据记录。但是,在大型数据表中,如果使用LIKE操作,它会对数据库的性能造成影响。为了解决这个问题,我们可

MySQL中如何进行数据的时序存储和查询?MySQL中如何进行数据的时序存储和查询?Jul 30, 2023 pm 03:09 PM

MySQL中如何进行数据的时序存储和查询?在许多应用场景中,对于数据的时序性要求是非常常见的,比如传感器数据的监测、日志记录等。MySQL作为一种常用的关系型数据库,也提供了一些方法来进行时序数据的存储和查询。一种常见的方法是使用时间戳字段来存储数据的时间信息。在MySQL中,可以使用TIMESTAMP或DATETIME类型的字段来存储时间。TIMESTAM

Java中的XML外部实体攻击与预防Java中的XML外部实体攻击与预防Aug 08, 2023 pm 01:13 PM

Java中的XML外部实体攻击与预防引言:XML(可扩展标记语言)在许多应用程序中被广泛使用,它是一种用于存储和传输数据的通用格式。然而,由于XML处理过程中的安全漏洞,如XML外部实体攻击(XMLExternalEntity,XXE)使得应用程序容易遭受攻击,因此我们需要对XXE攻击进行预防和防护。本文将介绍XXE攻击的原理、常见的攻击技术,并提供一

翻译:对于M个查询,反转给定字符串的范围翻译:对于M个查询,反转给定字符串的范围Aug 25, 2023 pm 08:09 PM

Inthisproblem,wewillperformMreversequeriesonthegivenstringaccordingtothearrayvalues.Thenaïveapproachtosolvingtheproblemistoreverseeachstringsegmentaccordingtothegivenarrayvalue.Theoptimizedapproachusesthelogicthatwhenwereversethesamesubstringtwotimes

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

Hot Tools

VSCode Windows 64-bit Download

VSCode Windows 64-bit Download

A free and powerful IDE editor launched by Microsoft

PhpStorm Mac version

PhpStorm Mac version

The latest (2018.2.1) professional PHP integrated development tool

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function