摘" 要:随着信息技术的快速发展和广泛应用,Web系统已经成为当今社会中信息交流、商业活动、社会服务等方面的重要载体,也是提高工作、学习效率的高效工具。然而,这也使得Web系统面临着来自各方面的安全威胁,如黑客攻击、数据泄露、恶意软件等。因此,在系统开发过程中,确保信息安全至关重要。丽江文化旅游学院智能出卷系统是基于Django框架和Ajax技术开发的Web系统,在系统设计开发中,运用了数据加密技术和Python中的参数化查询技术,保证了数据在网络传输过程中的完整性和保密性。
关键词:智能出卷系统;数据安全;Django;Ajax;Web
中图分类号:TP393.0" 文献标识码:A" 文章编号:2096-4706(2024)19-0179-05
Data Security Protection and Implementation of Web System Based on Django+Ajax
—Taking the Intelligent Test Paper Generation System of Lijiang Culture and Tourism College as an Example
LI Guangcan, ZAI Faxun, LI Yongchang
(Lijiang Culture and Tourism College, Lijiang" 674199, China)
Abstract: With the rapid development and wide application of information technology, Web systems have become an important carrier for information exchange, business activities, social services, and other aspects in todays society. They are also efficient tools for improving work and learning efficiency. However, this also makes Web systems face security threats from various aspects, such as hacker attacks, data leakage, and malicious softwares. Therefore, ensuring information security is crucial in the system development process. The intelligent test paper generation system of Lijiang Culture and Tourism College is a Web system developed based on Django framework and Ajax technology. In the design and development of the system, data encryption technology and parametric query technology in Python are used to ensure the integrity and confidentiality of data in the process of network transmission.
Keywords: intelligent test paper generation system; data security; Django; Ajax; Web
0" 引" 言
丽江文化旅游学院智能出卷系统是基于Django+Ajax技术开发的Web应用系统,适用于全校所有教职工,借助系统可构建全校各类课程的试题库,可实现试题批量导入、单一试题添加、使用遗传算法实现智能组卷等功能,并根据学校教务处的模板导出试卷及参考答案,系统功能完善,可扩展性强。
由于试题对保密性的要求较高,因此该系统在服务器的安全部署采用了目前主流的安全防护技术,同时结合Django和Ajax、非对称加密技术的特点成功实现了几种技术的融合,解决了在Web访问中如何确保参数传递过程中参数的完整性和保密性问题。
1" Web系统面临的主要安全威胁和攻击
目前,主流的Web系统结构由三部分组成:客户端、Web服务程序、数据库服务程序[1],整个访问过程如图1所示。Web用户与服务器之间的信息通信采用http协议进行,整个交互过程中用户和服务器都暴露在网络中,二者都有可能成为网络攻击的目标。
1.1" 网络通信的通道受到的网络威胁
因特网(Inernet)作为连接Web用户端和服务器端的网络通信通道,其面临着诸多安全威胁:
1)传递数据的完整性被破坏。非法用户利用技术手段在未经授权的情况下获取网络通道中所传输的内容,甚至改变其中的内容破坏数据的完整性。
2)传递数据的保密性被破坏。非法用户利用嗅探软件对通信信息进行监听,窃取秘密数据,破坏被传递数据的保密性。
3)实施网络攻击。非法用户利用通信通道发起大量非法请求,导致网络拥堵,甚至服务器宕机。
1.2" Web服务器受到的网络威胁
Web服务器作为重要的Web服务提供者,它受到的最大的威胁来自服务器漏洞。Web服务器的漏洞一旦被恶意用户或者攻击者发现并加以利用,服务器本身存储的重要信息将会泄露或遭到破坏。此外,Web服务器由于需要面向Web用户提供服务,它还受到下列网络威胁:
1)XSS跨站攻击。跨站脚本攻击又叫作XSS攻击,是1999年由知名的Web安全数据库与安全研究组织(Open Web Applications Security Project, OWASP)报告的一种针对用户层面的恶意代码注入型攻击[2]。这种攻击方式利用了网站对用户输入的不正确处理,使得恶意用户能够向受害者的网页中注入恶意脚本。这些脚本在用户浏览器中执行,从而导致安全风险。
2)SQL注入。SQL注入是指通过在Web用户输入处插入恶意SQL代码,达到欺骗服务器并执行恶意代码获取数据库信息的目的[3]。
3)Web系统中程序开发人员留下的有意或无意的BUG或后门程序。
2" Web系统数据安全应对策略
据不完全统计,当前超过75%的网络攻击和互联网安全侵害来源于应用软件。网页上的漏洞主要源自程序开发者编码不规范和应用部门检测机制不完善。没有经过系统安全训练的程序员,缺乏网页安全知识,无意识间造成漏洞;应用部门缺乏系统、完善的编程规范和代码检测机制等,无法检测出漏洞[4]。
为保障Web系统安全,需要构建完整的防御体系,从技术、硬件及制度上进行立体、多重的防护。
2.1" 硬件防护
在服务器机房出口安装配置硬件防火墙。硬件防火墙的主要作用是给予网络数据访问保护,合理限制数据访问范围,在没有权限的情况下不得访问重要数据[5]。硬件防火墙工作在OSI-4层,主要基于IP报文进行状态监测、地址转换、网络层的访问控制,主要是负责1~4层的网络安全,如图2所示。
在内网出口部署硬件防火墙能够有效抵御某些网络攻击,如DDOS、中间人攻击等。
2.2" 部署入侵检测/入侵防护系统
硬件防火墙虽然能够抵御一部分来自外部的网络攻击,但对于来自内网的攻击硬件防火墙就显得无能为力。这时可以通过在内网部署入侵检测/入侵防护系统,它可以检测到来自内网的攻击势态,并采用取相应的应对措施。
入侵检测技术的实际应用过程可以划分为三个主要阶段,分别是信息搜集、信息剖析以及后续的结果处理阶段[6]。合理部署并配置入侵检测系统能够有效防止来自内网的攻击。
2.3" 使用数据加密技术
Web系统的数据需要借助因特网才能得以交互,数据在整个传递过程中不仅需要确保数据的完整性,还要确保数据的保密性,使用数据加密、数字证书等技术手段可有效提高数据的完整性和保密性。
3" 智能出卷系统中数据安全防护措施
根据上述内容可知,数据安全除了在硬件上需要加以防护,在软件上同样也需要采用相关的安全技术手段。丽江文化旅游学院智能出卷系统在确保数据安全上使用数据加密、防SQL注入等技术。
3.1" 数据加密技术
在Web系统中,当客户端需要将数据提交至服务器,并由服务器加以进行处理时可通过POST或GET方式进行,这两种数据提交方式在形式上有很大区别。
POST方式会将数据封闭在请求的消息体中,参数信息不会出现在URL中,而GET请求的参数则会出现在URL中。POST请求可提交大量数据,但GET请求由于包含在URL中因此数据量受到浏览器的限制。虽然二者在形式上有一定的区别,但都能实现数据的提交。
由于Web系统使用的是http协议进行传输,所有的数据请求都会暴露在网络,很容易受到网络攻击导致数据被篡改和遭到破坏,因此在数据传递过程中,对于POST或GET方式请求的数据进行加密,然后再将密文提交至服务器,服务器获取后先解密密文,再处理相应数据。实现过程如图3所示。
常用的数据加密算法可分为对称加密算法、非对称加密算法和散列算法3类[7]。对称加密是使用同一密钥进行加密和解密操作,适用于大规模数据的加密和解密,典型的对称加密算法有DES、IDEA、AES等。非对称加密密钥分为公钥和私钥,公钥加密数据后只有与之对应的私钥才能解密,反之亦然。非对称加密实现的是原理是基于数学难题,比如当前广泛使用的RSA加密算法就是基于数论中大数分解和素数检测难题来设计和实现的,该类加密技术在数字签名等信息交换领域内具有较好的应用效果[8]。
Web系统对应的用户是网络上的任意一个使用者,若将请求数据进行加密使用的是对称加密方法,那么加密密钥是无法传递给每一个使用者的,即便能够实现加密密钥,每个使用者同样也可以使用该密钥解密数据,因此,在Web系统中将请求数据进行加密只能使用非对称加密算法进行。
在智能出卷系统中,当提交试题信息时,采用POST方式进行提交,查询数据时采用的则是GET方式,对于这两种方式提交的数据均使用RSA非对称加密进行加密处理,前端页面使用RSA公钥将请求数据进行加密,后端使用与之对应的私钥进行解密。前端加密使用的是目前流行的jsencrypt.min.js。具体流程如下:
1)用户发起访问请求。
2)Web服务器根据Django中urls.py中的路由设置,将请求转至views.py中对应的函数进行处理。
3)在views.py对应的函数首先检测用户的合法性,如是否登录成功,身份是否过期等,然后再将页面跳转至模板中对应的页面,同时将公钥一并传递至该页面。公钥的传递必须在页面跳转中实现。
4)跳转至指定页面后,借助Django的DTL(Django模板语言)JS可在html页面中获取到从服务器端传递过来的公钥。
5)当用户在页面中发起查询请求,例如请求查看id = 1的试题信息,JS首先调用jsencrypt.min.js中的方法构建加密对称,然后将参数id的值1进行加密,得到密文后由Ajax向服务器提交GET请求。
6)Web服务器端接收到Ajax的请求后首先提取id的值,此时id的值还是密文,然后服务器使用私钥尝试解密,如果解密成功,说明参数的值未被篡改和破坏,继续进行其他操作;如果解密失败,数据很有可能已经遭到篡改,马上向客户端返回错误信息。
通过以上操作,可以确保提交的数据在网络传输过程中不能篡改和破坏。其中前端获取公钥并加密的核心代码如下:
var rsadata={{ datasafe }}; //获取服务器端传递的公钥
var public_key=rsadata.pub_key; //获取服务器端传递的公钥
var encrypt=new JSEncrypt();
encrypt.setPublicKey(public_key);
var ciphertext=encrypt.encrypt(1); //加密字符1
服务器端使用私钥解密,这里需要特别注意,无论使用POST还是GET方式传递参数,浏览器会将一些特殊字符进行转义,如“+”会被转义为“ ”(空格),因此在后端解密前需要将空格替换为“+”,代码如下:
# 接收参数
id=request.GET.get(\"id\")
#将空格替换为+
id=sjbh.replace(\" \",\"+\")
#实例化rsa对象
rsa=RSA()
#调用rsa对象的decrypt方法进行解密
id=rsa.decrypt(id)
经过RSA加密后提交数据时可以看到提交的数据已经被加密,没有私钥是无法解密和查看到具体的内容的。效果如图4所示。
3.2" 防SQL注入
据不完全统计,SQL注入漏洞是数量最多、影响范围最广的Web系统漏洞之一,根据2013年以来国家信息安全漏洞共享平台(China National Vulnerability Database, CNVD)公布的SQL注入漏洞数量可以看出,从2013年到2021年,公布的SQL注入漏洞数量增长了5倍,如图5所示。
智能出卷系统中要实现对试题的动态管理,必然需要频繁地使用SQL语句操纵数据库中的数据,为了防止出现SQL注入的情况,在系统开发过程中使用了Python中参数化查询技术。参数化查询通过预编译SQL语句并绑定参数的方式,既防止了SQL注入攻击,也提高了数据库操作的安全性和性能[9]。
Python参数化查询是在Python中执行SQL语句时使用的技术,旨在提高安全性和查询效率。该技术通过预先处理SQL语句并绑定参数来执行查询,避免了通过直接拼接SQL语句带来的安全风险。在参数化查询中,使用占位符代替SQL语句中的变量,然后在执行查询时将这些占位符替换为实际的参数值。
Python参数化查询的主要优势在于其安全性。由于参数值在查询执行前被绑定,它们会被自动转义,从而防止了SQL注入攻击。此外,参数化查询还能提高查询效率,因为预处理的SQL语句可以被数据库缓存,从而减少了解析和编译SQL语句的开销。
理论上Python中的所有SQL语句都可以使用参数化查询技术,但在实现过程中确需要注意以下几方面的问题:
1)根据Python语法要求,在参数化查询中会使用占位符代替SQL语句中的变量,占位符的书写格式是“%s”但当我们要执行的SQL语句包含“%”时就会与占位符的符号发生冲突,在这种情形下需要做如下处理:
select * from table where name like %s
先将占位符%s置于like关键字后面,然后在传入变量时传入如下值:
parames = (%+name)+%)
注意,以上代码中的符号均为英文半角状态下的符号。
2)在一些场合需要使用数据库事务功能,同时执行多条语句,如智能出卷系统中当删除某一张试卷时,需要同时完成三个操作:将该试题关联的试卷数减少1,删除试卷明细表中对应的试题ID,最后在试卷管理表中删除对应的试卷。以上三个操作需要全部完成才表示整个试卷删除操作真正执行成功。为了保证这一要求,可以使用数据库事务来进行。事务的概念最早由James Gray提出并成功地应用于数据库系统中,其特点是具有ACID特性,这些特性能有效地保证数据库系统中数据的一致性。如今,事务的概念不再局限于数据库技术,已被应用于分布式计算等技术中[10]。
Python中实现数据库事务的原理非常简单,首先开启数据库事务功能,然后设计一个列表,分别存放所有需要执行的SQL语句,接着遍历该列表逐一执行SQL语句,最后统一提交事务至数据库。由于需要遍历存放SQL语句的列表,参数化查询本身也是通过元组传递参数的变量,因此在执行事务过程中要合理组织SQL语句。实现过程如下:
1)初始化两个列表,分别用于存放SQL语句和对应的参数
2)把需要执行的SQL语句和与之对应的参数逐一存入列表中。SQL语句和参数必须做到一一对应。
3)在执行事务前,使用zip函数将两人列表进行合并,然后遍历。
4)逐一执行SQL语句并提交事务。
核心代码如下:
conn=pymssql.connect(server=DB.server, user=DB.username, password=DB.password, database=DB.database,tds_version=\"7.0\")
cur=conn.cursor()
# 开启事务
conn.autocommit(False)
try:
# 执行查询列表中的每个查询
#print(query_list)
for query,parames in zip(sqllist,parameslist):
cur.execute(query,parames)
# 提交事务
conn.commit()
return cur.rowcount
except Exception as e:
# 发生错误时回滚事务
conn.rollback()
#记录日志
log=Logger(\"DB\")
log.log_error(\"数据库执行事务操作失败\", 失败原因是 + str(e))
raise e
SQL语句组织及参数化查询核心代码如下:
#存放查询语句
sqllist=[]
#存放参数化查询的具体参数
parameslist=[]
sqlscsj=\"delete from Jwsj_Zncjxt_Sj where sjbh in %s and gh=%s\"
paramesscsj=(id_tuple,request.session.get(gh),)
sqlscsjmx=\"delete from Jwsj_Zncjxt_Sj_Mx where sjbh in %s\"
paramesscsjmx=(id_tuple,)
sqlxgglsjs=\"update Jwsj_Zncjxt_Tk_Tm set glsjs=glsjs-(select COUNT(tmid) from Jwsj_Zncjxt_Sj_Mx where sjbh in%s and tmid=Jwsj_Zncjxt_Tk_Tm.id) from Jwsj_Zncjxt_Sj_Mx" join Jwsj_Zncjxt_Tk_Tm on Jwsj_Zncjxt_Tk_Tm.id=Jwsj_Zncjxt_Sj_Mx.tmid where Jwsj_Zncjxt_Sj_Mx.sjbh in%s\"
paramesxgglsjs=(id_tuple,id_tuple,)
#依次存入SQL语句及对应的具体参数
sqllist.append(sqlxgglsjs)
sqllist.append(sqlscsjmx)
sqllist.append(sqlscsj)
parameslist.append(paramesxgglsjs)
parameslist.append(paramesscsjmx)
parameslist.append(paramesscsj)
#执行事务
jg=DB(sqlscsj).Zx_Sw(sqllist,parameslist)
通过Python中的参数化查询技术可以有效地防止SQL注入的发生,能够很好地保护系统的数据安全。
4" 结" 论
本文阐述了智能出卷系统中为了确保数据安全而采用的相关技术及实现方法,同时探讨了RSA加密技术结合Django与Ajax在前后端分离中的实现,可为其他有类似需求的系统开发提供借鉴。
参考文献:
[1] 郭锡泉,陈香锡.Web应用安全的集成风险评估方法 [J].计算机应用与软件,2023,40(4):311-317+323.
[2] 王铃铜,王慧玲,徐苗,等.跨站脚本攻击检测与防御技术综述 [J].计算机应用研究,2024,41(3):652-662.
[3] 刘磊,许静,朱静雯,等.基于攻击反馈模型的SQL注入漏洞渗透测试方法 [J].计算机应用与软件,2023,40(6):323-329.
[4] 黎彦玲,程晓海.企业Web应用的安全防御体系研究 [J].电子质量,2022(12):18-21.
[5] 王菲菲.网络安全技术在校园网中的应用分析 [J].网络安全技术与应用,2023(2):69-70.
[6] 陈军,吴礼发,胥光辉,等.基于本体的Web服务攻击检测技术研究 [J].计算机应用,2011,31(6):1515-1520.
[7] 庄少凯,黄育明,何雪珺.数据安全加密技术在数据服务场景中的融合应用与实践 [J].电子产品可靠性与环境试验,2024,42(1):13-19.
[8] 刘涛,秦彦.数据加密技术在计算机安全中的应用分析 [J].长江信息通信,2023,36(5):160-162.
[9] 刘欣雨.计算机软件工程中的数据库编程技术分析 [C]//Proceedings of 2023 Seminar on New Engineering Technologies and Methods (SNETM 2023).[S.I.s.n.],2023:78-79.
[10] 刘震伟,薛锦云,夏鲸,等.PAR平台中并发分布式事务处理机制及其应用研究 [J].江西师范大学学报:自然科学版,2019,43(6):649-654.
作者简介:李光灿(1985—),男,汉族,云南宾川人,讲师,本科,研究方向:计算机技术应用;宰发训(1982—),男,回族,云南宣威人,讲师,硕士,研究方向:计算机应用;李永昌(1986—),男,彝族,云南大理人,讲师,本科,研究方向:计算机应用。
基金项目:2024年丽江文化旅游学院一般项目(2024xy16)