个人网站制作程序,网络营销怎么理解,软件开发有哪些,网址大全最新版的转载自: 我的个人博客
OJ实验平台#xff0c;采用沙箱后端运行代码#xff0c;实现安全的实时评测#xff08;OJ#xff09;。此平台搭建的初衷为学校的数据结构实验提供课程代码的编写和测评#xff0c;以此方便学生实验时得到实时的反馈#xff0c;此后陆续被多个实验…转载自: 我的个人博客
OJ实验平台采用沙箱后端运行代码实现安全的实时评测OJ。此平台搭建的初衷为学校的数据结构实验提供课程代码的编写和测评以此方便学生实验时得到实时的反馈此后陆续被多个实验课程采用。本人在项目开发过程中主要承担了OJ部分和题目部分的后端开发。
需求分析
将实验平台的功能分为核心业务和底层服务两大模块。
核心业务模块
OJ评测模块用户管理模块(涉及验证)作业提交模块
底层服务模块:
日志记录限流保护用户反馈评论/题解数据库请求题目、题解、评论等
技术栈
Springboot 后端开发框架简化应用的搭建和开发过程Redis 非关系型数据库可用于缓存保存非持久化数据MySQL 关系型数据库管理系统MyBatis 持久层框架简化数据库访问Java 后端开发语言七牛云 用户头像图片存储Vue 构建界面的JavaScript框架提供了一套声明式的、组件化的编程模型ElementUI Vue组件集合JavaScript web脚本语言动态更新内容Node.js javascript运行时环境
开发工具
IDEA 后端开发WebStorm 前端开发Xftp 服务器间文件传输Postman 后端接口测试工具模拟发送http请求
相关技术原理
沙箱
github仓库: https://github.com/criyle/go-judge
系统架构
------------------------------------------------------------------------
| 传输层 (HTTP / WebSocket / FFI / ...) |
------------------------------------------------------------------------
| 工作协程 (环境池 和 环境生产者) |
-----------------------------------------------------------------------
| 运行环境 | 文件存储 |
--------------------------------------------------------------------
| Linux (go-sandbox) | Windows (winc) | macOS (app sandbox) | 内存 | 磁盘|
--------------------------------------------------------------------运行的代码以文件形式存储在沙箱服务器的内存/磁盘在linux上创建功能受限的容器使代码在容器内运行避免破坏环境。通过发送HTTP请求使沙箱执行相应操作在受限的环境中运行程序具体API接口如下一部分所示
REST API 接口
沙箱服务提供 REST API 接口来在受限制的环境中运行程序。本质是 envexec 的简单封装。
/run POST 在受限制的环境中运行程序下面有例子/file GET 得到所有在文件存储中的文件 ID 到原始命名映射/file POST 上传一个文件到文件存储返回一个文件 ID 用于提供给 /run 接口/file/:fileId GET 下载文件 ID 指定的文件/file/:fileId DELETE 删除文件 ID 指定的文件/ws /run 接口的 WebSocket 版/metrics 提供 prometheus 版监控 (使用 ES_ENABLE_METRICS1 环境变量开启)/debug 提供 go 语言调试接口 (使用 ES_ENABLE_DEBUG1 环境变量开启)/version 得到本程序编译版本和 go 语言运行时版本
/run 接口返回状态
Accepted: 程序在资源限制内正常退出Memory Limit Exceeded: 超出内存限制Time Limit Exceeded: 超出 timeLimit 时间限制或者超过 clockLimit 等待时间限制 Output Limit Exceeded: 超出 pipeCollector 限制或者超出 -output-limit 最大输出限制 File Error: copyIn 指定文件不存在或者 copyIn 指定文件大小超出沙箱文件系统限制或者 copyOut 指定文件不存在 Non Zero Exit Status: 程序用非 0 返回值退出Signalled: 程序收到结束信号而退出例如 SIGSEGVDangerous Syscall: 程序被 seccomp 过滤器结束Internal Error: 指定程序路径不存在或者容器创建失败 比如使用非特权 docker或者在个人目录下以 root 权限运行 或者其他错误
接口定义
interface Cmd {args: string[]; // 程序命令行参数env?: string[]; // 程序环境变量// 指定 标准输入、标准输出和标准错误的文件files?: (LocalFile | MemoryFile | PreparedFile | Pipe | null)[];tty?: boolean; // 开启 TTY 需要保证标准输出和标准错误为同一文件同时需要指定 TERM 环境变量 例如 TERMxterm// 资源限制cpuLimit?: number; // CPU时间限制单位纳秒clockLimit?: number; // 等待时间限制单位纳秒 通常为 cpuLimit 两倍memoryLimit?: number; // 内存限制单位 bytestackLimit?: number; // 栈内存限制单位 byteprocLimit?: number; // 线程数量限制strictMemoryLimit?: boolean; // 开启严格内存限制 仅 Linux设置 rlimit 内存限制// 在执行程序之前复制进容器的文件列表copyIn?: {[dst:string]:LocalFile | MemoryFile | PreparedFile};// 在执行程序后从容器文件系统中复制出来的文件列表// 在文件名之后加入 ? 来使文件变为可选可选文件不存在的情况不会触发 FileErrorcopyOut?: string[];// 和 copyOut 相同不过文件不返回内容而是返回一个对应文件 ID 内容可以通过 /file/:fileId 接口下载copyOutCached?: string[];// 指定 copyOut 复制文件大小限制单位 bytecopyOutMax: number;
}enum Status {Accepted, // normalMemoryLimitExceeded, // mleTimeLimitExceeded, // tleOutputLimitExceeded, // oleFileError, // feRuntimeError, // reDangerousSyscall, // dgsInternalError, // system error
}interface Request {requestId?: string; // 给 WebSocket 使用cmd: Cmd[];pipeMapping: PipeMap[];
}interface Result {status: Status;error?: string; // 详细错误信息exitStatus: number; // 程序返回值time: number; // 程序运行 CPU 时间单位纳秒memory: number; // 程序运行内存单位 byterunTime: number; // 程序运行现实时间单位纳秒// copyOut 和 pipeCollector 指定的文件内容files?: {[name:string]:string};// copyFileCached 指定的文件 idfileIds?: {[name:string]:string};
}
RSA加密原理
RSA是经典的非对称加密算法拥有两个密钥公钥和私钥。
公钥和私钥的生成
准备两个非常大的素数 p p p和 q q q。利用字符串模拟计算大素数 p p p和 q q q 的乘积。同样方法计算 m ( p − 1 ) ( q − 1 ) m (p-1)(q-1) m(p−1)(q−1)这里的 m m m为 n n n的欧拉函数。找到一个数 e ( 1 e m ) e(1em) e(1em)满足 g c d ( m , e ) 1 gcd(m,e)1 gcd(m,e)1( m , e m, e m,e互素)。计算 e e e在模 m m m上的逆元 d d d即满足$ ed \ mod \ m 1$。公钥和私钥生成完毕 ( n , e ) (n,e) (n,e)为公钥 ( n , d ) (n,d) (n,d)为私钥。
加密
对于明文 x x x用公钥 ( n , e ) (n,e) (n,e)对 x x x加密后得到的密文y为 y x e m o d n y x^e \ mod \ n yxe mod n。
解密
对于密文 y y y用私钥 ( n , d ) (n,d) (n,d)对 y y y解密后得到的明文x为 x y d m o d n x y^d \ mod \ n xyd mod n。
主要功能实现思路
OJ在线评测
OJ评测部分的流程大致如下图所示
根据时间创建文件将提交的代码以文件形式存入沙箱。在Cmd类对象中填入运行代码所需的工具链如c语言对应gcc。将代码按沙箱规定的输入格式进行转化。向沙箱请求/run接口发送HTTP请求并对沙箱返回的结果进行解码。若返回状态不是Accepted则代码执行失败将错误输出返回给用户提示用户修改代码。若返回状态为Accepted则代码执行成功返回代码执行的时间所占用的内存输出等信息。删除存放在沙箱中的代码文件。将用户提交的程序的输出和数据库中对应题目的正确答案进行对比若一致则创建提交记录其状态为成功否则创建提交记录其状态为对应的失败原因。
用户管理–邮箱验证
随机产生6位验证码包括字母/数字并将其按用户对应的键存储到Redis。只用JavaMailSender将验证码和提示信息发送给用户。用户在页面输入验证码提交验证码由前端通过接口传到后端。后端验证用户提交的验证码是否与Redis中存储的一致若一致则验证通过若不一致或Redis中不存在对应验证码过期则验证失败。
为什么使用Redis作为验证码的存储方式
Redis可设置过期时长与验证码的时效性相吻合。验证码是临时的数据不需要持久化。数据运行在内存中唯有持久化时才写到磁盘中读写性能高。
用户管理–登录
首先验证账户是否存在前端发送用户账户名后端生成验证码a并以一定的名称用户id作为键存入Redis有效期5min将验证码a和查询数据库所得的用户id返回给前端。若用户id不存在则登录失败。前端将用户输入的密码第1步返回的验证码a拼接用SHA256加密后发送给后端。后端将正确密码验证码a拼接用SHA256加密和前端传来的密文进行比较。若一致则登录成功否则密码不正确登录失败。删除Redis中存储的验证码a。根据用户名、用户id、权限级别创建验证码b以online_{id}作为键存在Redis中7天有效。即意味着用户登陆后7天有效无需每次使用时重新登录。
用户管理–修改密码
1 旧密码已知直接修改
验证账户是否存在。前端发送用户账户名后端生成验证码a有效期5min并以一定的名称用户id作为键存入Redis将验证码a和查询数据库所得的用户id返回给前端。若用户id不存在则验证失败。验证旧密码是否正确。前端将用户输入的旧密码第1步返回的验证码a拼接用SHA256加密后发送给后端。后端将正确旧密码验证码a拼接用SHA256加密和前端传来的密文进行比较。若一致则旧密码验证成功否则密码不正确旧密码验证失败修改密码失败操作终止。删除Redis中存储的验证码a。若旧密码验证成功生成验证码b有效期5min并以一定的名称用户id作为键存入Redis一段时间后失效标志旧密码验证成功。若旧密码验证成功返回用于加密的RSA公钥。修改新密码。若验证码b在redis中不存在则修改失败退出。若验证码b在redis中存在接受前端发送的用公钥加密后的密码用RSA的私钥对加密后的密码解密存入数据库。
2 旧密码遗忘通过邮箱验证修改
验证账户是否存在。前端发送用户账户名后端生成验证码a并以一定的名称用户id作为键存入Redis。将第1步生成的验证码a发送到用户的邮箱。用户查看邮件后在页面输入收到的验证码。若用户输入的验证码与redis中存储的一致则将验证码a删除并生成验证码b一定的名称用户id作为键存入Redis并返回RSA公钥。若用户输入的验证码与redis中存储的不一致提示用户验证码不正确。若用户邮箱验证成功验证码b在redis中存在则用RSA私钥解码前端传来的加密后的新密码更新数据库删除验证码b。 文章转载自: http://www.morning.jxfmn.cn.gov.cn.jxfmn.cn http://www.morning.rpwht.cn.gov.cn.rpwht.cn http://www.morning.pcgmw.cn.gov.cn.pcgmw.cn http://www.morning.gtqws.cn.gov.cn.gtqws.cn http://www.morning.aiai201.cn.gov.cn.aiai201.cn http://www.morning.ywzqk.cn.gov.cn.ywzqk.cn http://www.morning.kcfnp.cn.gov.cn.kcfnp.cn http://www.morning.wrysm.cn.gov.cn.wrysm.cn http://www.morning.trtdg.cn.gov.cn.trtdg.cn http://www.morning.lthtp.cn.gov.cn.lthtp.cn http://www.morning.fnczn.cn.gov.cn.fnczn.cn http://www.morning.kjlia.com.gov.cn.kjlia.com http://www.morning.iznek.com.gov.cn.iznek.com http://www.morning.pnfwd.cn.gov.cn.pnfwd.cn http://www.morning.kpyyf.cn.gov.cn.kpyyf.cn http://www.morning.lzph.cn.gov.cn.lzph.cn http://www.morning.bpcf.cn.gov.cn.bpcf.cn http://www.morning.fhsgw.cn.gov.cn.fhsgw.cn http://www.morning.mqwdh.cn.gov.cn.mqwdh.cn http://www.morning.nkyc.cn.gov.cn.nkyc.cn http://www.morning.rmdwp.cn.gov.cn.rmdwp.cn http://www.morning.pfnrj.cn.gov.cn.pfnrj.cn http://www.morning.kxnjg.cn.gov.cn.kxnjg.cn http://www.morning.nhzxd.cn.gov.cn.nhzxd.cn http://www.morning.tgdys.cn.gov.cn.tgdys.cn http://www.morning.kpxzq.cn.gov.cn.kpxzq.cn http://www.morning.fllfz.cn.gov.cn.fllfz.cn http://www.morning.mbnhr.cn.gov.cn.mbnhr.cn http://www.morning.zzaxr.cn.gov.cn.zzaxr.cn http://www.morning.lctrz.cn.gov.cn.lctrz.cn http://www.morning.pdmml.cn.gov.cn.pdmml.cn http://www.morning.dtmjn.cn.gov.cn.dtmjn.cn http://www.morning.qprtm.cn.gov.cn.qprtm.cn http://www.morning.jwfqq.cn.gov.cn.jwfqq.cn http://www.morning.fbnsx.cn.gov.cn.fbnsx.cn http://www.morning.xqkjp.cn.gov.cn.xqkjp.cn http://www.morning.phjny.cn.gov.cn.phjny.cn http://www.morning.baguiwei.com.gov.cn.baguiwei.com http://www.morning.pkfpl.cn.gov.cn.pkfpl.cn http://www.morning.rhfh.cn.gov.cn.rhfh.cn http://www.morning.tbqdm.cn.gov.cn.tbqdm.cn http://www.morning.qhkx.cn.gov.cn.qhkx.cn http://www.morning.qxjck.cn.gov.cn.qxjck.cn http://www.morning.gqmhq.cn.gov.cn.gqmhq.cn http://www.morning.kttbx.cn.gov.cn.kttbx.cn http://www.morning.bhwll.cn.gov.cn.bhwll.cn http://www.morning.yfnhg.cn.gov.cn.yfnhg.cn http://www.morning.tndhm.cn.gov.cn.tndhm.cn http://www.morning.wnjsp.cn.gov.cn.wnjsp.cn http://www.morning.lqchz.cn.gov.cn.lqchz.cn http://www.morning.yrmpz.cn.gov.cn.yrmpz.cn http://www.morning.hryhq.cn.gov.cn.hryhq.cn http://www.morning.rqmr.cn.gov.cn.rqmr.cn http://www.morning.tntgc.cn.gov.cn.tntgc.cn http://www.morning.bxrlt.cn.gov.cn.bxrlt.cn http://www.morning.mslsn.cn.gov.cn.mslsn.cn http://www.morning.qbpqw.cn.gov.cn.qbpqw.cn http://www.morning.zkpwk.cn.gov.cn.zkpwk.cn http://www.morning.ddjp.cn.gov.cn.ddjp.cn http://www.morning.yongkangyiyuan-pfk.com.gov.cn.yongkangyiyuan-pfk.com http://www.morning.kqzxk.cn.gov.cn.kqzxk.cn http://www.morning.rpkg.cn.gov.cn.rpkg.cn http://www.morning.mkccd.cn.gov.cn.mkccd.cn http://www.morning.qtsks.cn.gov.cn.qtsks.cn http://www.morning.sfnr.cn.gov.cn.sfnr.cn http://www.morning.rqgbd.cn.gov.cn.rqgbd.cn http://www.morning.kqwsy.cn.gov.cn.kqwsy.cn http://www.morning.xxzjb.cn.gov.cn.xxzjb.cn http://www.morning.qwqzk.cn.gov.cn.qwqzk.cn http://www.morning.qnrpj.cn.gov.cn.qnrpj.cn http://www.morning.rkqkb.cn.gov.cn.rkqkb.cn http://www.morning.jnbsx.cn.gov.cn.jnbsx.cn http://www.morning.ljdjn.cn.gov.cn.ljdjn.cn http://www.morning.fwcnx.cn.gov.cn.fwcnx.cn http://www.morning.ztfzm.cn.gov.cn.ztfzm.cn http://www.morning.cytr.cn.gov.cn.cytr.cn http://www.morning.3jiax.cn.gov.cn.3jiax.cn http://www.morning.nqlnd.cn.gov.cn.nqlnd.cn http://www.morning.fsrtm.cn.gov.cn.fsrtm.cn http://www.morning.xcyhy.cn.gov.cn.xcyhy.cn