• 关于部分应用无法向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关键字。呵呵呵

  • 相关阅读:
    Linux初级知识_04 -- 目录结构与目录管理
    查找无限整数序列的第n位1,2,3,4,5,6,7,8,9,10,11,...
    谷歌面试题:在半径为1的圆中随机选取一点
    FtpClient 调用storeFile 抛出 java.net.SocketException异常
    CountDownLatch 使用
    软件版本号比较 java工具类
    pcm文件转wav C语言
    unimrcp更改安装目录
    xpath学习记录
    jackson 实体转json 为NULL或者为空不参加序列化
  • 原文地址:https://www.cnblogs.com/wchrt/p/4600320.html
Copyright © 2020-2023  润新知