关于部分应用无法向POJ提交代码的解决方案
有个一年没做过题了,最近有骚年反映他们的VirtualJudge无法做POJ的题目,一直都是JudgeError状态。
于是登录到那个VJudge试了试,代码的确一直无法提交成功,他们的服务器发回500错误代码。
试了试自己写的voj内核,果然有问题,又试了一下国内其他的Vjudge都没法交到POJ,但是是用HUST最新的VJudge提交POJ没问题,这个问题他们应该已经早处理好了。
那么问题应该在代码post的部分,可能是pojpost代码的协议有一些变化。于是登陆到poj的提交代码界面,先试试提交一个代码:

但是点击submit后代码框的内容突然做出了变化,还没看清就到了status界面,于是将浏览器倒转回来,发现代码内容变成了这样:

。。。代码加密了。
看到最后的等号,脑海中最先浮现出的是des加密和base64加密。但想想就在html界面加密应该不会用到秘钥算法,我猜大概就是base64。
打开网页的源码看到它的post表单部分:
<form method=POST action=submit onsubmit="return encodeSource()">//这里的onsubmit触发了一个encodeSource函数,是对代码内容加密的函数
<div align=center><font size=4 color=#333399>Submit Your Solution Via Web</font><br><br>
Problem ID:<input type=text name=problem_id value="1000" size=20 accesskey=p><br>
Language:<select size=1 name=language accesskey=l>
<option value=0>G++</option>
<option value=1>GCC</option>
<option value=2>Java</option>
<option value=3 selected>Pascal</option>
<option value=4>C++</option>
<option value=5>C</option>
<option value=6>Fortran</option>
</select><br>
<font color=red>Java is J2SE 1.5, enjoy it!</font><br>
Source: <br>
<textarea rows=30 name=source id=source cols=79 accesskey=c></textarea><br>
<input type=submit value=Submit name=submit accesskey=s>
<input type=reset value=Reset name=reset>
<input type=hidden value=1 name=encoded>//多了一个是否编码加密的input
</div></form>
顺藤摸瓜,找到JS部分的encodeSource函数:
function encodeSource() {
document.getElementById("source").value = Base64.encode(document.getElementById("source").value);
return true;
}
果然,对Source的内容进行了base64加密,于是将那部分加密的密文进行验证:

嗯,确认是将提交的代码内容用Base64进行了一次加密后提交到poj的服务器的。
问题找到了,现在需要解决这个问题,解决方案有两种:
1、通过不加密的方式来提交代码
该方法较为简单,我们注意到表单最后有一个input:
<input type=hidden value=1 name=encoded>
就是的Source部分是否加密的意思,一般来说value设为0时就不用加密了。
voj的逻辑不需要做什么变化,只需要在poj的post部分加上encoded=0的值即可

这样做不一定能保证能提交成功,因为poj那边不一定允许不加密。但凡事试试就知道,我在自己的voj的poj的post部分添加上encoded=0后,进行提交,成功了。

现在voj可以正常运行了

2、将代码加密后提交到服务器
前面的方法是解决了问题,但有个担忧的地方,以后poj可能会会不允许非加密的代码提交,那就不得不加密后才能提交,甚至有可能其他的oj也会这样做。
实现方法就是在将提交的代码加入到post之前,将其进行base64加密。
加上这样的功能挺快的,但对于很多不是自己的voj程序,这样做需要修改源码,不只是修改配置文件能解决的问题。这样的情况建议升级voj程序。(有源码的童鞋可以自己改,会hook的可以自己钩,不什么都不想动的可以在提交前手动编码。。。)
为什么要BASE64加密?(纯属个人胡乱猜想)
简化格式与编码:以前自己写Voj内核的时候,遇到了很多的编码问题尤其是空格和一些转义字符,比如说空格转为%20。经过BASE64编码后,文本中就不会有空格这样的特殊字符。
代码保密:代码在提交的过程中是明文传输的,题目答案有可能在传输中被他人抓包到,于是他人就知道该题的解题了。但是base64加密并没有什么用,将暗文进行base64解密就能得到原始代码。因此这个原因应该是不对的。
用于长文本HTTP传输:有很多的题目,所需要的解决方案代码比较长,用base64加密后方便与http传输。(有一种人叫“打表哥”,他们的解题思路就是将答案静态地打印在代码中,用于直接调用,这样的代码往往会很长)。
数据库安全考虑: 编码后的代码可有效防止数据库注入攻击。
未知原因:我试着不加密提交一份java版a+b,结果被服务器拒绝,因为含有System关键字。呵呵呵
关于部分应用无法向POJ提交代码的解决方案的更多相关文章
- Git提交代码解决方案
最近做项目不再用小乌龟了,开始用git,便做了记录如下,后期可以看看自己是怎么使用的 下载安装就不说了,直接进入使用环节. 1.使用规则 git pull origin master 和 gi ...
- svn 提交代码报错
svn 提交代码报错 最近新安装了TortoiseSvn 1.92,在上传代码,其中有新增加的文件,出现如下错误: 解决方法: 1.用vs生成patch文件 2.生成的patch文件中讲nonexis ...
- 在Myeclipse中提交代码到GitHub中
这需要借助插件Egit,首先就是先下载该插件了,可以再eclipse中下载,也可以在外面下载,下载就不说了.下载地址git://github.com/houyongchao/plugin-Egit.g ...
- github提交代码时,报permission denied publickey
在像github提交代码时,报permission denied publickey. 查找了一下,可能是因为github的key失效了. 按照以下步骤,重新生成key. ssh-keygen 一路默 ...
- github提交代码流程:
(1) 检查一遍代码改动 $git status (2) 将工作目录中的代码提交到暂存区 $ git add filename git add -A (3) 提交代码到本 ...
- ssh git免密码提交代码
使用ssh协议通过密钥验证的方式提交代码,不用再每次提交时输入账户密码. 1.打开bash 输入一下命令, ssh-keygen -t rsa -C youremail@example.com(把邮件 ...
- intellij 提交代码到git
.配置git .create git repository .git-->add commit Directory .提交代码 git remote add origin https://git ...
- 关于github在mac 10.10上无法提交代码的解决办法---备用
接下来是正文:本文主要说明在mac 10.10版本下github无法提交代码的问题 首先如果你是一个用终端提交代码的,你可以不用看这篇文章了,这篇文章主要是用于解决github客户端提交代码的问题,此 ...
- 【技术贴】解决myeclipse SVN 提交代码 commit:remains in tree-conflict错误的解决办法
[技术贴]解决myeclipse SVN 提交代码 commit:remains in tree-conflict错误的解决办法 错误是:Aborting commit: xxxxx’ remains ...
随机推荐
- debug openStack
ERROR neutron.agent.l3.agent [-] An interface driver must be specified No valid host was found. Ther ...
- javascript笔记4之运算符
/* var box = 100; --box; //前置递增,box = box +1 alert(box);//99 var box = 100; var age = ++box; //先box累 ...
- c语言typedef与define的相同
#include <stdio.h> #include <stdlib.h> #define INT int typedef short SHORT;//看此处有没有分号 // ...
- Grizzly开发Echoserver实战
Grizzly开发Echoserver实战 作者:chszs,转载需注明. 博客主页:http://blog.csdn.net/chszs 用Java编写可伸缩的server应用是有难度的.用Java ...
- 线程、线程句柄、线程ID
什么是句柄:句柄是一种指向指针的指针.我们知道,所谓指针是一种内存地址.应用程序启动后,组成这个程序的各对象是住留在内存的.如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址 ...
- gulp 构建工具
1. gulp 的简介 gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器:她不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成:使用她,我们不仅可以 ...
- 浪潮服务器通过ipmitool获取mac地址
一.GPU服务器 #配置两个主板集成千兆四个外插PCI万兆网卡# 板载网卡可以使用命令获取到:RAW 0X30 0X21 就可以读取到第一块网卡的MAC,就是以下返回值的后6位. 0c,c4,7a,5 ...
- DEV GridControl 根据单元格值改变背景色
GridControl 根据单元格值改变背景色(需要用到CustomDrawCell事件) 方法1: private void gdvClient_CustomDrawCell(object send ...
- asp net 编程问题 实现下一篇 和上一篇效果
首先是access数据库,有一个名为news的表,里面有三个字段,分别为id,classid 和name 其中id为主键,classid可以重复 现在有以下数据: id classid name 1 ...
- Javascript判断空对象
最近在项目开发中判断空对象时,用了“!”运算符,结果程序出现bug,找了好久才找到原因. 其实自己范了一些低级错误,现在把自己经验总结一下: 在JavaScript中,任意JavaScript的值都可 ...