SQL Injection:网络攻击及其防范措施(6)

END 接着修改我们的Web程序使用参数化的存储过程进行数据查询。 using (var com = new SqlCommand(GetJobs, con)) // Uses store procedure. com.CommandType = CommandType.StoredProcedure; // Pass jobId to sto

  END

接着修改我们的Web程序使用参数化的存储过程进行数据查询。

using (var com = new SqlCommand("GetJobs", con))

// Uses store procedure.

com.CommandType = CommandType.StoredProcedure;

// Pass jobId to store procedure.

gdvData.DataSource = com.ExecuteScalar();

  gdvData.DataBind();

现在我们通过参数化存储过程进行数据库查询,这里我们把之前添加的正则表达式校验注释掉。

图7 存储过程查询结果
图7 存储过程查询结果

大家看到当我们试图在URL中嵌入恶意的SQL语句时,参数化存储过程已经帮我们校验出传递给数据库的变量不是整形,而且使用存储过程的好处是我们还可以很方便地控制用户权限,我们可以给用户分配只读或可读写权限。

但我们想想真的有必要每个数据库操作都定义成存储过程吗?而且那么多的存储过程也不利于日常的维护。

参数化SQL语句

还是回到之前动态拼接SQL基础上,我们知道一旦有恶意SQL代码传递过来,而且被拼接到SQL语句中就会被数据库执行,那么我们是否可以在拼接之前进行判断呢?命名SQL参数。

string sql1 = string.Format("SELECT job_id, job_desc, min_lvl, max_lvl FROM jobs WHERE job_id = @jobId");

using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQLCONN1"].ToString()))

using (var com = new SqlCommand(sql1, con))

// Pass jobId to sql statement.

gdvData.DataSource = com.ExecuteReader();

gdvData.DataBind();

图8 参数化SQL查询结果
图8 参数化SQL查询结果

这样我们就可以避免每个数据库操作(尤其一些简单数据库操作)都编写存储过程了,而且当用户具有数据库中jobs表的读权限才可以执行该SQL语句。

添加新架构

数据库架构是一个独立于数据库用户的非重复命名空间,您可以将架构视为对象的容器(类似于.NET中的命名空间)。

首先我们右击架构文件夹,然后新建架构。

图9 添加HumanResource架构
本页无标题
图9 添加HumanResource架构

(责任编辑:闫小琪)

顶一下
(1)
100%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
热点内容
图片资讯

桌面安全 需采用“深层防御”方法

桌面安全 需采用“深层防御”方法

深层防御方法代表了一套全方位安全哲学,帮助保护计算环境免受许多攻击手法的攻击。 ...[详细]

网络安全巧设置 Win2008 R2 防火墙详解

网络安全巧设置 Win2008 R2 防火墙详解

针对一般中小企业型来说,如果希望对企业网络进行安全管理,不一定非得花高价钱购买专...[详细]

Windows Vista中如何加密文件或文件夹

Windows Vista中如何加密文件或文件夹

要在Windows Vista加密文件或文件夹,可按下面的操作步骤进行:。 ...[详细]

信用卡背后的安全隐患

信用卡背后的安全隐患

Visa组织在2001年推出一个他们称为3DS的安全协议,也就是3 Domain Secure的缩写。试图...[详细]

周鸿祎:AVC证明360杀毒具有世界级技术

周鸿祎:AVC证明360杀毒具有世界级技术

曾令中国杀毒业难堪的AV-Comparatives国际权威评测传来喜讯:在最新公布的AVC回溯测试...[详细]