web随想笔记(一)

1 OJ大概架构

1.0 OJ页面–>WEB服务器(SpringBoot)–>判题机(Linux)

OJ页面将提交的代码封装成json格式发给web服务器端,服务器端接收json获取信息,进行进一步封装,转发给判题机,拆解json数据获得程序代码,运行程序返回结果。

1.1 判题机

IO重定向判断程序是否正确,返回json数据,程序的所有输出重定向到一个文件,将输出的文件与标准答案的文件相比较,判断是否正确。

难点:如何防止恶意代码

如,提交了C++代码,system("shutdown -s -t 120"),如果服务器照常运行会使服务器关机,造成严重后果。

1.2 解决方法

  1. 构造沙箱,记录运行情况
  2. 黑名单:禁用部分危险函数库的使用(难度较大)
  3. 关键字过滤(行不通,C语言有强大的宏定义)
  4. docker(存在安全隐患)
  5. 白名单(推荐):只给它常用的调用函数,其他的都不能调用,危险操作被禁止,优点:简单方便易实现

2 验证码设计

2.1 朴素思路

服务器端生成验证码字符串和验证码图片,验证码字符串存入session中以便登录时判断验证码是否正确,之后Bufferedimage格式图片通过网络IO写入到response,发送到客户端显示,客户端输入内容再发送到服务器端。

2.2 存在问题

自己手写的验证码很容易被OCR计算机视觉识别,一旦拿到了账号和密码,就可以通过程序自动识别验证码并且通过无限制爬取用户信息。

2.3 解决

验证码的设计是一场计算机视觉和人之间的博弈,是一场反图灵测试,需要的效果是人能够识别,但机器不能够识别,可以在图片生成时,在图片里加一些干扰,如横线、点等干扰OCR的识别。

把原来识别数字改成识别一个等式比如0+3=?,进一步加大机器识别难度。

2.4 jcaptcha

一个开源的验证码生成工具

2.5 前后端分离(Springsecurity结合boot,jwt,Redis,图片验证码实现登录认证权限功能)

在这里插入图片描述 在这里插入图片描述
  • 因为我们是想要实现图片验证码功能,但是我们发现security给我们默认提供的UsernamePasswordAuthentication的filter是不能用的,因为他那里只是对用户名和密码进行校验,因此我们可以这样想,我们使用验证码其实就是在用户名和密码的校验上多了一层而已,因此我们可以在这个过滤器之前再加一个过滤器来进行验证码校验,当然我们也可以通过自定义过滤器继承UsernamePasswordAuthenticationFilter,然后自己把验证码验证逻辑和认证逻辑写在一起,这也是一种解决方式。
  • 这里我们便采用加前置图片过滤器CaptchaFilter来提前校验验证码是否正确,这样的话我们是可以继续使用security给我们提供的用户名与密码的过滤器的,然后登录正常或失败我们都可以通过对应的Handler来返回我们特定格式的封装结果数据。
  • 因为前后端分离,我们禁用了session,所以我们把验证码放在了redis中,使用一个随机字符串作为key,并传送到前端,前端再把随机字符串和用户输入的验证码提交上来,这样我们就可以通过随机字符串获取到保存的验证码和用户的验证码进行比较了是否正确了。
  • 然后因为图片验证码的方式,所以我们进行了encode,把图片进行了base64编码,这样前端就可以显示图片了。
在这里插入图片描述
BNUEP Offline Judge 北京师范大学珠海分校离线评测系统是在具备题目测试数据的情况下,能无联网自动评测ACM/ICPC模式的源代码评测系统(即本地测试工具、评测)。它主要有以下功能(所有的功能都无需联网,在本即可实现): *评测核心功能: 基本具备Online Judge的判题核心功能,如编译代码、内存限定,时间限定,获取代码长度等; *支持多种语言: 1.0 Beta2版本支持C/C++、Pascal、C#、JAVA; *出题模式 可以在有标准输入数据和标准程序的情况下,由系统产生标准输出数据,并可批量保存,同时自动命名标准输出数据的后缀; *文本高亮对比 在判题后,可以直接在本系统中将自己的程序输出和标准输出进行高亮的文本差异对比,操作类似于一些文本对比软件,在一定程度上可以较方便地发现WA代码的出错细节; *支持不限时执行代码 这个功能可以在一定程度上检测TLE代码的算法是否正确的,当然,不能是跑一天都没跑出来的程序; *打包与加密测试数据 使用加密后的数据可以正常判题,但不显示标准输出。这个功能是为了弥补放出去给别人评测的测试数据是明文的缺陷。加密之后评测方就看不到测试数据。这样就既可以实现离线评测,又可以实现Online Judge上的对测试数据屏蔽; ACM-ICPC简介: ACM国际大学生程序设计竞赛(简称ACM-ICPC)是由国际计算界具有悠久历史的权威性组织ACM学会(Association for Computing Machinery)主办,是世界上公认的规模最大、水平最高、参与人数最多的大学生程序设计竞赛,其宗旨是使大学生能通过计算充分展示自己分析问题和解决问题的能力。 ACM-ICPC的每一道题,都具备题目、需求描述、输入格式描述、输出格式描述、样例输入和样例输出共六大信息,有些题目还有一定的提示。此外,裁判还额外存储了关于该题的一组或多组对选手屏蔽的标准输入和标准输出数据,这些测试数据已经经过验证符合题意要求。当用户提交一道题目的源码之后,裁判会将该源码放入评测系统中编译运行,并使用标准输入作为用户程序的输入,然后获取用户程序的输出,接着,将用户程序输出和标准输出比较,最后返回给用户一个评判结果。评判结果包括:Accepted(测试通过)、Compile Error(编译失败)、Memory Limit Exceed(内存超出限制)、Presentation Error(格式错误)、Runtime Error(运行时错误,可能是数组越界,改写只读的内存,除零,栈或堆溢出等错误)、Time Limit Exceed(时间超出限制)、Wrong Answer(答案错误)等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程哥哥吖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值