开发人员必须权衡好安全和功能之间的关系,这要看某种攻击得逞的可能性有多大、这个系统有多重要。
开发人员可以运用诸多基本原则来增强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';
现在,整个用户表就会被清空。
Loading...下一篇:没有比当前更新的主题
Loading...- 2007-9-15权衡安全和功能 编写安全的Web2.0应用
- 2007-9-15高手简论:说说标签切换
- 2007-9-15用户ID应该是自己定义的
- 2007-9-15从零起步 教你排除DNS解析故障
- 2007-9-15Web2.0岁月:使用AJAX技术的十大理由
- 2007-9-15网站程序员如何应对web标准
- 2007-9-15Web 2.0,如何创造内容?
- 2007-9-15经验共享 如何防范你的个人网站被黑
- 2007-9-15网站的信息更新频率应该是多少?
- 2007-9-15网络编辑应做些什么 如何成为网编高手?
Loading...