长江大学一键评教项目简要分析

长江大学换新的教务处系统了,现在还没上线,等更新了我再来修改
很硬很硬的软广:长江大学一键评教

0x00. 写在前面

首先要声明的是,这个项目不是我从零写起的,我在这个知乎专栏看到了这篇介绍四川大学评教网站的简介才有了改写的想法,所以整个项目的基础基本和这个专栏里写的是一样的,就不再赘述了,这里主要讲一下我踩的坑和修改的地方。

废话不多说,代码传送门

0x01. 分析教务处网站

虽然我们学校的教务处系统到底是谁写的已经不可考究,不过可以肯定的一点是,我们教务处系统的接口和表单和四川大学的肯定是不一样的,所以原文作者介绍的直接修改表单或教务处 IP 的方法行不通了。不过归根结底,这个项目原理上也是一个爬虫项目,所以第一步从分析原网站做起。

我们的教务处系统是使用 APS.NET 技术栈编写的,服务器也是用的 IIS,在登陆界面上有一个验证码,想要搞定它已经有大把的方法,譬如用 C++ 或者 Python 编写一个基于 OpenCV 的 Node.js Addon 用来识别验证码,但这里我们用了一个很神奇的办法来绕过它,你可以参考我们学校「长大在线」成员 @Vito-Yan工作来了解这个前辈们可能忘了的漏洞接口。

登陆界面很简单,表单项有3个:学号、密码、身份。但是 ASP.NET 的页面还有两个隐藏的校验参数分别为:__VIEWSTATE__EVENTVALIDATION,如果向后台提交的 POST 表单中不包含这两项会被后台认为是无效的表单。教务处使用的表单应该是 ASP.NET 提供的表单控件,所以可以预期的是所有教务处上出现的表单应该都包含这两个隐藏项。

教务处登陆表单

0x02. 模拟登陆教务处

能够提交登陆表单后,经过抓包分析,发现我们学校同样也只是用了 Cookie 来标识用户的登陆情况,其中包含一个 ASP.Session_id 字段用来记录服务器的 Session 会话 id。那么只需要获取到这个值,就相当于登陆了网站。这里实现的做法和原作者是一样的,不再复述。

0x03. 模拟一键评教

可以预见的一件事是,大部分同学(如果和老师没有什么深仇大恨)应该会直接给老师打上“满意”了事,所以我们的评价方案也是一样。但我们学校的评教系统问题就出在这里,它在对每一个老师评价之后都需要主动提交一次,但由于服务器的问题这里很容易崩溃或者无响应,刷新页面后又要重填一次,搞多了甚至还要重新登录。这也是我编写本应用的首要原因。

上一步拿到 Cookie 后就可以提交评教表单了。这里有个很玄学的坑,就是评教表单是放在 <tabel> 里的字段,但它的 id 却是不规则的。这里用了一个很笨的办法,就是在获取教师列表时手动去掉标题和表头两行,只保留教师信息并添加一个从 2 开始的 index 属性,用来表示教师所在行的相关信息,并用 JavaScript 的模版字符串拼接一个 id 出来,再放到表单中一起提交。

0x04. Bug 和「坑」

坑总是有的,Bug 总是无法避免的,现在已知的 Bug 有:

  • 必修课评教不正常;
  • 有时出现玄学无法登陆的情况(应该是教务处限制了 IP 连接数,毕竟都是我的服务器发出的) 现在服务器换到校内了,再有问题服务器表示这锅不背;
  • 。。。(未完待续)

还有一些地方写的很丑,但暂时不想改:

  • 爬教师列表时就已经可以评教了,没必要在每次评教前再爬(原作者的逻辑是这样的我懒。。。)
  • 提交了多次之后 __VIEWSTATE__EVENTVALIDATION 可能会变导致后面的评教失败,但刷新之后可以继续评(所以。。。)
  • 。。。(未完待续)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值