OJ页面将提交的代码封装成json格式发给web服务器端,服务器端接收json获取信息,进行进一步封装,转发给判题机,拆解json数据获得程序代码,运行程序返回结果。
IO重定向判断程序是否正确,返回json数据,程序的所有输出重定向到一个文件,将输出的文件与标准答案的文件相比较,判断是否正确。
难点:如何防止恶意代码?
如,提交了C++代码,system("shutdown -s -t 120")
,如果服务器照常运行会使服务器关机,造成严重后果。
服务器端生成验证码字符串和验证码图片,验证码字符串存入session中以便登录时判断验证码是否正确,之后Bufferedimage格式图片通过网络IO写入到response,发送到客户端显示,客户端输入内容再发送到服务器端。
自己手写的验证码很容易被OCR计算机视觉识别,一旦拿到了账号和密码,就可以通过程序自动识别验证码并且通过无限制爬取用户信息。
验证码的设计是一场计算机视觉和人之间的博弈,是一场反图灵测试,需要的效果是人能够识别,但机器不能够识别,可以在图片生成时,在图片里加一些干扰,如横线、点等干扰OCR的识别。
把原来识别数字改成识别一个等式比如0+3=?,进一步加大机器识别难度。
一个开源的验证码生成工具
- 因为前后端分离,我们禁用了session,所以我们把验证码放在了redis中,使用一个随机字符串作为key,并传送到前端,前端再把随机字符串和用户输入的验证码提交上来,这样我们就可以通过随机字符串获取到保存的验证码和用户的验证码进行比较了是否正确了。
- 然后因为图片验证码的方式,所以我们进行了encode,把图片进行了base64编码,这样前端就可以显示图片了。