SQL注入解决思路(C#示例)

最近在编程中遇到一个SQL注入防护的问题。在这里顺便把SQL注入小结一下。以MYSQL(5.1)为例。

一、常规的SQL语句

观察SQL语句

SELECT * FROM [tableName] WHERE col1='value1'

这个语句由3个部分组成,SELECT子句筛选得到结果,FROM子句指定了筛选的范围,WHERE子句指定了条件。当在其中进行如下置换:

SELECT * FROM [tableName] WHERE 1

之后,选出了[tableName]表中的全部内容。分析其语法不难发现,WHERE将其后的真值表达式求值,然后作为筛选的条件。

二、WHERE子句的理解

现在(在MYSQL5.1)中测试以下语句

SELECT * FROM [tableName] WHERE false or 1=‘1’ and '1'='1' and "1"="1"

同样得到了[tableName]表种的全部内容。

这个测试说明了两点:

1、WHERE对后面的表达式进行真值计算

2、不带符号、‘与"都可以通过真值测试,可能不是个别特殊符号的问题

三、WHERE子句在编程中的使用

通常是采用字符串拼接的方式來构建WHERE子句。一般有:

SELECT * + FROM [tableName] + WHERE col1=' + value1 + ' 

其中的value1常常是由输入所得。然而当WHERE子句具备(二)中的某种特征时就可能存在意外了。如果只是按照拼接來构建WHERE子句的话,那么WHERE子句可能会演化成这样的形式:

SELECT * FROM [tableName] WHERE col1='badvalue' or 1='1'

也就是说,用户熟悉SQL语句并精心构造了一个包含SQL特殊字符的输入{badvalue‘
or 1=‘1},这时候会返回整张表。

当程序员采用"工作时,类似也有:

SELECT * FROM [tableName] WHERE col1="badvalue" or 1="1"

中的{badvalue" or 1="1}。

总之,一旦程序员采用直接将用户输入拼接进SQL语句时就存在偷换WHERE真值的风险。像这样,用户通过简单地改变终端输入而改变了应用逻辑的情况,叫做注入。

四、更加奔放的情况

观察上面大括号里面的内容,在MYSQL(5.1)中还存在这样的情况:

SELECT * FROM [tableName] WHERE col1='badvalue' ; select * from [another] where 1='1'

也就是说,填入{badvalue‘ ; select * from [another] where 1=‘1}。完全可以把填入括号中的select换成drop、update等等。起作用的前提是程序员不作任何处理地将用户输入接入了SQL查询语句中。

可以做一个简单的结论,SQL特殊字符在概念上是嵌套的,然而由于在处理中使用了直接拼接的方式,使得用户参与了SQL语句的编写,输入特殊字符让SQL截短解析,最终导致意料以外的后果。

五、解决问题的现状

完全没有必要搞得高深莫测。但是解决的方法通常是会引起争论的。

我用的最久的语言是C#。因为某种二缺的原因,我第一门认真学习的语言是C#。在这里给出一个C#的解决方法吧。

六、解决方法构思与部署

主要是要隔离开用户输入对“构建”SQL语句的参与权。用户输入只能作为数据提供。只要满足这个原则,WHERE子句的组装还是比较清晰的。

我们可以尽量把非用户输入的部分写完整,然后把用户输入的特殊字符全部转义。这样,就有了示意的Where函数

/**
  * affirmNodePair 示例:
  *   {"or col1=","value1"}
  *   {"and col2>","value2"}
* * /
public string Where (Dictionary<string,string> affirmNodePair)
{
	StringBuilder builder=new StringBuilder();
	// 预处理
	builder.Append(" where 1 ");

	foreach (var item in affirmNodePair) {
		builder.Append(item.Key);
		builder.Append("'");

		//过滤用户输入:将用户输入的特殊字符转义
		foreach (var c in item.Value) {
			switch (c) {
			case '\'':
				builder.Append(@"\");
				break;
			case '\"':
				builder.Append(@"\");
				break;
			case ';':
				builder.Append(@"\");
				break;
			default:
				break;
			}
			builder.Append(c);
		}
		builder.Append("'");

		builder.Append(" ");
	}
	return builder.ToString();
}

这样形成的Where子句类似于:

	Where 1 or col1='value1' and col2>'value2'

当填入{badvalue‘ or 1=‘1}后得到转义后的结果

	Where 1 or col1='badvalue\' or 1=\'1'

在我测试使用的MYSQL(5.1)中能够符合预期地报错。具体的部署要结合实际情况,限于工作条件,这里只提供了一个基础性思路。谢谢大家耐心看完。

时间: 2024-10-05 20:51:52

SQL注入解决思路(C#示例)的相关文章

【代码实现】防止SQL注入解决办法

文章来源:PHP开发学习门户 地址:http://www.phpthinking.com/archives/494 SQL注入是我们在程序开发过程中经常要注意的问题,属于发生于应用程序之数据库层的安全漏洞,通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统. 简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去

SQL注入原理与解决方法代码示例

一.什么是sql注入? 1.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击.如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入. 黑客通过SQL注入攻击

SQL注入思路与手工猜解大进阶

什么叫SQL注入? 许多网站程序在编写时,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患.用户可以提交一段数据库查询代码,(一般是在浏览器地址栏进行,通过正常的www端口访问)根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入. SQL注入的思路 思路最重要.其实好多人都不知道SQL到底能做什么呢?这里总结一下SQL注入入侵的总体的思路: 1. SQL注入漏洞的判断,即寻找注入点 2. 判断后台数据库类型 3. 确定XP_CMDSHELL

SQL注入攻击---web安全

一.什么是sql注入呢?         所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击.如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入. 黑客通过SQL注入攻击可以拿到

如何防止SQL注入 http://zhangzhaoaaa.iteye.com/blog/1975932

如何防止SQL注入 博客分类: 技术转载数据库 转自:http://021.net/vpsfaq/152.html -----解决方案-------------------------------------------------------- 过滤URL中的一些特殊字符,动态SQL语句使用PrepareStatement.. ------解决方案-------------------------------------------------------- 注入的方式就是在查询条件里加入SQ

WAF的SQL注入绕过手段和防御技术

一.关于SQL注入 SQL注入是一种常见的入侵WEB应用的手法.SQL注入是利用应用系统的编程漏洞和SQL语言的语法特征,改变原始的SQL语句执行逻辑而产生的. 攻击者向Web应用发送精心构造的输入数据,这些输入中的一部分被解释成SQL指令,改变了原来的正常SQL执行逻辑,执行了攻击者发出的SQL命令,最终使攻击者获取Web应用的管理员权限或者下载了Web应用存到数据库中的敏感信息. 二.SQL注入如何实现 为了对本文进行更好的讲解,下面简单地对SQL注入的原理进行示例性说明. 如下图是某网站的

【安全牛学习笔记】手动漏洞挖掘-SQL注入

[email protected]:~# john --format=raw-MD5 dvwa.txt [email protected]:~# cd .john/ [email protected]:~/.john# ls john.log  john.pot [email protected]:~/.john# cat john.log [email protected]:~/.john# cat john.pot [email protected]:~/.john# rm *       

防止SQL注入攻击

SQL注入攻击的危害性很大.在讲解其防止办法之前,数据库管理员有必要先了解一下其攻击的原理.这有利于管理员采取有针对性的防治措施. 一. SQL注入攻击的简单示例. statement := "SELECT * FROM Users WHERE Value= " + a_variable + " 上面这条语句是很普通的一条SQL语句,他主要实现的功能就是让用户输入一个员工编号然后查询处这个员工的信息.但是若这条语句被不法攻击者改装过后,就可能成为破坏数据的黑手.如攻击者在输入

php安全编程—sql注入攻击

原文:php安全编程-sql注入攻击 php安全编程--sql注入攻击 定义 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统. 根据相关技术原理,SQL注入可以分为平台层注入和代码层注入.前者由不安全的数据库配置或数据库平台的漏洞所致:后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询.基于此,SQL注入的产生