频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

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

来源:qqread 作者:佚名 出处:巧巧读书 2007-04-14 进入讨论组
下一页 1 2 

精华网络内容 :http://www.qqread.com/network/


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

  开发人员可以运用诸多基本原则来增强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); //执行命令,并检索输出参数值

更多文章 更多内容请看路由安全配置专题系统安全设置配置安全的操作系统专题,或进入讨论组讨论。
下一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章