|
知识路径: > 电子商务系统程序设计基础 > 电子商务系统建设 > 电子商务系统安全设计 >
|
被考次数:1次
被考频率:低频率
总体答错率:43%  
知识难度系数:
|
由 软考在线 用户真实做题大数据统计生成
|
相关知识点:2个
|
|
|
|
电子商务系统设计的安全措施有很多种,例如用户密码加密、验证码技术、防止SQL注入攻击、安全脚本程序、定期备份数据等,本书将重点介绍用户密码加密、验证码技术、防止SQL注入攻击、安全脚本程序这几种安全措施。
|
|
|
|
用户密码等信息是保密性要求非常高的信息,因此,即使密码保存在数据库中,也要对密码进行加密,将密码以密文的形式存放在数据库中,以防止密码泄露。
|
|
|
数据加密的方法有两种:双向加密和单向加密。双向加密是指数据既能被加密也能被解密。单向加密是指数据只能加密,而不能被解密;数据一旦被转换为密文之后,无论采用什么方法都无法还原为最初的数据。单向加密的优点就在于:即使密文被泄露,也不能理解这些密文信息的真正含义。
|
|
|
单向加密一般所采用的方法是哈希算法,哈希算法是将任意长度的二进制值映射为固定长度的较小二进制值,这个二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。MD5是最常用的哈希算法,也是采用单向加密的加密算法,MD5有两个非常重要的特性:第一是任意两段不同的数据,加密之后的密文也是不相同的;第二是任意一段数据,经过加密以后,其结果永远是相同的。
|
|
|
C#提供了有关MD5哈希算法的类——MD5CryptoServiceProvider。MD5CryptoService Provider类位于System.Security.Cryptography命名空间中,作用是使用加密服务提供程序提供的方法完成对输入数据MD5哈希值的计算。计算哈希值的方法为:
|
|
|
|
此方法只能接受byte型数组作为最初的原始数据,输出的密文数据也是byte型数组。因此,在对字符串加密之前,首先需将这些字符串转化为byte型数组(使用UTF8Encoding类的GetBytes方法)。加密方法的程序如下:
|
|
|
|
用户注册时,调用加密方法将密码加密,将密文密码保存在数据库中。用户登录时,同样也调用该方法对用户输入的密码进行加密得到密文密码,然后再与数据库中的密文密码进行比对,以此判断用户的合法性。
|
|
|
|
验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自动区分计算机和人类的图灵测试)的缩写,是一种区分用户是计算机和人的技术。可以防止恶意破解密码、刷票、论坛灌水等现象。在电子商务系统中,可以通过验证码控件实现验证码的功能。
|
|
|
验证码控件一般属于第三方控件,将验证码控件引入到.NET系统中就可以使用了。在用户注册页面上增加一个验证码控件及输入验证码的文本框,主要代码如下:
|
|
|
|
在用户注册页后台类文件中,首先在页面加载方法中生成验证码,主要程序如下:
|
|
|
|
在用户提交注册信息的时候,首先要判断验证码是否正确,程序如下:
|
|
|
|
|
SQL注入攻击是黑客对数据库进行攻击的常用手段之一。很多程序员在编写代码的时候,没有对用户输入数据的合法性进行验证,使应用程序存在安全隐患。如果用户在提交数据时,提交了一段数据库查询代码,而程序在没有做输入数据合法性验证的情况下,就会根据提交的查询代码执行并返回结果,从而获得数据库中的数据,这就是所谓的SQL Injection,即SQL注入攻击。
|
|
|
|
|
在用户输入的数据没有过滤转义字符时,就会发生这种形式的注入式攻击。例如在ASP.NET程序中,用户登录时,使用下面的SQL语句查询用户的合法性:
|
|
|
|
这条代码的设计功能根据输入的用户名和密码在用户表中查找数据,但是,如果密码被一个恶意的用户用一种特定的方式伪造,这个语句所执行的操作可能就不是预计的功能了。例如,将密码变量(即sw_password)设置为:
|
|
|
|
|
|
SQL查询条件'1'='1'永远是正确的,因此不管用户名和密码合不合法,只要用户表中存在数据,那么一定能查到记录,也就可以成功登录系统了。甚至还有一些SQL注入可以删除数据、非法查询所有数据等。下面语句中的密码值将会导致删除用户表,还可以从“sw_product”表中选择所有的数据。
|
|
|
|
|
|
造成这些安全威胁的原因就是没有过滤转义字符,如果对用户输入的内容中的“’”等SQL语句中的特定字符进行转义,这种形式的SQL注入将会出现SQL语法错误、无法执行,从而避免了漏洞。
|
|
|
|
如果一个用户提供的字段并非一个强类型,或者没有实施类型强制,就会发生这种形式的攻击。当在一个SQL语句中使用一个数字字段时,如果程序员没有检查用户输入的合法性(是否为数字型)就会发生这种攻击。例如:
|
|
|
|
这条语句设计的目的是通过数字型的值查找用户。但是如果变量userid类型是字符串型,将userid设置为:“1;DROP TABLE sw_users”,SQL语句变成:
|
|
|
|
|
|
当一个Web应用程序遭受攻击而又不显示其结果,就会发生所谓的盲目SQL注入式攻击。有漏洞的网页可能并不会显示数据,而是根据注入到合法语句中的逻辑语句的结果显示不同的内容。这种攻击相当耗时,因为必须为每一个获得的字段而精心构造一个新的语句。
|
|
|
|
如果SQL语句中的WHERE条件为真,这种类型的盲目SQL注入会迫使数据库执行一个引起错误的语句,从而导致一个SQL错误。例如:
|
|
|
|
显然,如果用户名为“zhangsan”的记录存在,被零除将导致错误。
|
|
|
|
时间延误是一种盲目的SQL注入,根据所注入的逻辑,它可以导致SQL引擎执行一个长队列或者是一个时间延误语句。攻击者可以衡量页面加载的时间,从而决定所注入的语句是否为真。
|
|
|
实际中SQL注入攻击还有很多种,而且将来可能还会有新的类型出现。这里只介绍了一些常见的SQL注入。
|
|
|
|
|
要防御SQL注入,用户的输入就不能直接被嵌入到SQL语句中,必须经过过滤,或者使用参数化的语句。参数化的语句使用参数而不是将用户输入嵌入到语句中。在多数情况中,SQL语句就得以修正。例如,在ASP.NET程序中:
|
|
|
|
|
(2)在程序出现错误或异常时,要避免出现一些详细的错误或异常消息,因为这些信息会为攻击者带来方便。
|
|
|
(3)在Web应用程序开发过程的所有阶段实施代码的安全检查。首先,要在部署Web应用之前实施安全测试,其次,企业还应当在部署之后用漏洞扫描工具和站点监视工具对网站进行测试。
|
|
|
|
脚本攻击是指将恶意的字符插入到网页中来,浏览器无法验证这些插入的字符,并且会将它们作为网页的一部分进行处理。
|
|
|
从浏览器的角度来看,网页只是一个长的字符串,浏览器会按照顺序处理这个字符串,在此过程中,会显示某些字符,同时按照某些规则解释其他字符。如果恶意用户将某些特殊字符插入到网页中来,则浏览器不知道这些特殊字符不应该处于该位置,而将它们作为页面的一部分进行处理。
|
|
|
假如现在用户在TextBox中输入恶意代码如:,我们单击一个按钮在Lable控件上显示用户输入的内容,单击按钮就会弹出一个提示框,这种情况被称为脚本攻击。
|
|
|
这些攻击可以窃取用户的信息或传播病毒等,其威胁也是非常大的,一般来说,脚本攻击分为两类。
|
|
|
|
此类攻击例如弹出警告框、加入HTML标记等,由于程序上过滤的不严密,使攻击者可以植入这些安全威胁小的非法脚本代码。
|
|
|
|
这类脚本攻击已经过渡到可以窃取管理员或者是其他用户信息的程度上了。例如cookies窃取,利用脚本对客户端进行本地的写操作等。
|
|
|
在ASP.NET中,防范脚本攻击的措施是对脚本进行过滤,可以使用Server.HtmlEncode()方法对输入的字符串进行HTML编码,使用户输入的字符串起不到脚本的作用。但有些时候,用户正常输入了一些敏感字符,例如“>”等,如果全部采用Server. HtmlEncode()方法进行编码,就无法实现用户的正常需求了,为了方便的过滤,一般只需要将HTML脚本和JS脚本中的几个关键字符过滤掉就可以了,过滤的程序如下:
|
|
|
|
用户的输入使用该方法进行过滤,屏蔽了那些可能会产生脚本攻击的特殊字符,当然,程序员也可以根据需要增减要替换的字符,以满足安全需要。
|
|
|