{"content":["
有了小崔给的主机,开辟了很多新领域。
不用暴力地琢磨纯静态页面了,可以开始自己开发网页后端。刚起步,先用 Node.js+Express 做后端。写了个配平化学式的接口(/chemist?H2+O2=H2O)。
用 WebSocket 可以实现服务器与客户端的即时通讯,原先搭载在 LeanCloud 上的五子棋计算部分可以迁移到本地了。
","近日研究了 Bootstrap 框架很多不错的设计,如按钮组团等,进行了应用。
今天开始尝试在本地搭建 MySQL 数据库。希望是日后能建起一个存放中学化学式的数据库。
把化学式配平、相对质量计算的网页实现出来了,接下来还要加上 MySQL 的上传。
为所有按钮加上了好玩的悬浮样式。这可真不容易,为了去掉浏览器自带的丑陋黑色边框,我进行了不懈的斗争,最后发现是除了 :focus
和 :active
选择器,还得写上 :focus:active
。
在首页加上了黑暗模式,以及非常愚蠢的秘密消息(其实更多是对 Bootstrap 响应式布局的测试)。
进一步完善按钮样式。
折腾了半天,总算把网站放到公网上了。
为了方便,我大致梳理一下,原先只是在 schtonn.github.io 和 schtonn.gitee.io 上写博客,随后把实现的几个小功能拉起来拼凑了个页面。
后来gitee停止服务了,我又想学习学习后端开发,所以目前网站在 http: //43.143.233.184/,应该会保持更新,不过暂时还没有购置域名的打算。
实现了对数据库中化学方程式的查询,虽然目前数据库里只放了两个式子,但等我实现添加功能后会往里加的。
大量运用了正则表达式(没有你我活不了啊!)。
认识到了 SQL 注入的危害,并用简陋的手段做了防护。
实现了添加化学式的操作,往里加了几个式子,但是对删除操作的处理非常纠结,因为 MySQL 的自增主键是不受删除影响的,删除一个元素后仍然占用着这个编号。
倒也有解决办法,就是强制覆盖自增的位置,但这样很难应对在序列中间删除的情况,所以删除功能基本是不会上线了,只能由我在后台自己维护。
今天的发现特别离谱。
心意答查询成绩的接口只经过了一层双向加密,没有丝毫验证身份的手段,并且返回的数据也多于显示的数据,结果就是只要知道考试编号、科目编号和数字校园号就能直接查到这个人,以及他的班级详尽的成绩。
更有甚者,在线学习平台直接放出了全年级所有人的姓名和数字校园号的对照表,以至于只要知道姓名就能查出成绩来。
以及,它返回信息的模式属于能返则返,也就是说我不知道科目编号,可以直接放两百个进接口里,它还自动筛选出存在的科目编号;不知道考试编号也能一个一个试出来:就算考试和校园号完全对不上,它也会返回考试名称。对我们这些阴险的窃取者来说,这简直是太方便了。
只需要知道一个姓名,你历次考试的成绩就全都查出来,这就是信息泄露的危害...
查成绩的接口,这样的安全性不能说离谱,只能说是离谱至极。
除此之外,今天还把博客通过暴力粘贴的方式搬运过来了。
这个心意答,简直就是活靶子,循循善诱地让人把他完全攻破。
它还有个合适的难度曲线,从未加密的接口里偷数据,到双向加密的接口进行解密,到伪造 cookie 和 localStorage,再到骗过虚假的 uuid 验证,每一步都能放出刺激而又吓人的新信息。
我们只能期望,不要有太多人来想着攻击这些接口,不然来一个攻破一个,到时候大家的成绩都成公开的秘密了。
我们说它蠢事做尽,还好它坏事没做到底,至少阅卷的权限还握在登陆验证手里。可是,既然会登陆验证了,其他各种东西,如每次考试的成绩单、详细的分析,这些却都完全不需要登陆验证。只要在客户端合适的位置写好老师的校园号(可以从校园邮箱里检索),再模仿网页进行加密,或是直接篡改网页的javascript,你就得到了老师的身份,全校所有人的各种信息都暴露无遗。
它在加密上也完全没有用心,只草草加了一层 base64 和 AES,密码竟然明文放在 javascript文件里,加密函数的名称也没有混淆。而且,这样危险的接口完全不是这么加密来的吧!理应在每个有敏感信息的接口都放上登陆验证,这才能体现出对学生隐私的重视。问题出在哪儿?问题就出在开发者犯懒。
话又说回来,要是它加上了登陆验证,我还怎么偷你们的成绩呢??也许我可以学学机房大佬,用易语言开发一个木马,然后把老师的账号密码偷过来。或者远程控制老师的电脑,用惊悚图片把老师吓跑,再趁机操作他的帐号。
写了个集修改 localStorage,替换 javascript,伪造老师身份于一身的用户脚本,但技术能力有限,还得要用户手动屏蔽原来的 javascript。
给图表加上了令人舒适的自适应窗口变化功能。
准备写各科的分析,现在能拿到接口数据了,还得研究怎么处理。
为了方便调试,把心意答接口的加密过程硬编码了一下,以后就可以直接从这里处理了。
把成绩查询的一些冗余文字删减了。把又臭又长的代码压缩了一下,体积减了一半还多。
梳理了一下前两天嗅探心意答数据的过程,发现要是我的工具流传特别广,学校还坚决要以这个为由告我,好像还真能定一个提供侵入、非法控制计算机信息系统程序、工具罪...
提供侵入、非法控制计算机信息系统的程序、工具,具有下列情形之一的,应当认定为刑法第二百八十五条第三款规定的情节严重:
(一)提供能够用于非法获取支付结算、证券交易、期货交易等网络金融服务身份认证信息的专门性程序、工具5人次以上的;
(二)提供第(一)项以外的专门用于侵入、非法控制计算机信息系统的程序、工具20人次以上的;...
——节选自《关于办理危害计算机信息系统安全刑事案件应用法律若干问题的解释》
怎么说呢,希望学校不要告我吧...
实现了整理答题卡小分的功能,选择题只标出错题,其他题目也标明总分,比心意答上那一堆勾勾叉叉的看着顺眼多了。
本来以为获取到的坐标很难转化成文档流直接定位的形式,后来发现原来 XYWH 代表坐标和大小,单位都是像素,这样只要我再乘一个图片缩放的系数就能定位了。
让所有扣分点晃来晃去;多好玩。
录入多人时增加了一个图表,让比较更直接。
修改了首页排版,移除了过多的阴影。
用 Git Hooks 科技实现了博客的自动推送更新,这样就不用我每次都暴力粘贴了。hook 这个名字听着很高大上,其实就是 git push
之后执行一个脚本,把原来的博客文件夹覆盖了而已,也就是把暴力粘贴的工作自动化。
给首页加上了背景图,是我在潭柘寺拍的鸽子。这张图太大了,我云服务器的公网出流量要省着用,所以我托管到图床上了。(我后来看了一下,好像我一个月只能用掉流量包的 0.86%... 但无论如何图床还是更快)
发现了一个很神奇的 js 压缩工具,Roadroller,能把代码压到原来的百分之几大小,所以我稍微压了一下成绩查询和化学数据库的代码。
把首页的一些东西塞到了二级页面里去,不仅看上去清爽多了,而且我同时也把根目录清理了一下,免得找不着文件在哪。
把 sans 小游戏的两个版本所用的资源进行了合并,节省了一些冗余空间(其实根本没有,git 都记录在那呢)。
还有一些无所谓的小改动,就是让页面和代码都更干净了。
把平时的一些很没劲的创作搬上来了。
说实话,让这个进度条又能点,又是响应式,又能放多个,还是挺费劲的。要是没有 this
这个令人极度舒适的特性,我估计一天之内调不好。
此外,今天还把氯、钠、铁的化学式加入到数据库里了,总数快要破百了。
今天建立了三天的访问日志,结果发现一件怪事——
我的 GET 请求总会在 5 到 10 分钟后被重复一次,内容完全相同。对正常内容没什么影响,但是对于吃性能的化学式计算之类还是挺有影响的。
我得着手调查一下了,以及按照行业规范,含参的请求应该用 POST,回头重写一下代码。
嗯。。看来 ip 扫描,网站入侵这个事已经产业化了。
我记录日志这段时间内,有各种各样不同来源、不同方式嗅探漏洞的请求,都是 GET 或 POST 某个(我没有的)接口或文件,尝试利用已知的漏洞,但凡你部署的时候把这些漏洞放出去了,很快就会让人扫到,然后入侵。
倒是我的 git 文件夹真叫人从头到尾扫了一遍,不过反正我也没存什么敏感信息,都和 github 上同步的。现在我把对 git 的请求屏蔽了,一切都好。
今天可算是干了两件大事。
首先,我把邮箱服务运行起来了,虽然目前大部分邮箱不接收我的邮件,但至少我能收到他们发来的邮件。我以后愿意的时候,就可以用1@schtonn.top来收邮件了。
当然,这个邮箱是可以无限注册的,所以谁想要拿它玩玩也可以找我注册。
第二件大事是我用 acme.sh 搞定了 SSL 的证书(acme.sh --issue -d 43.143.233.184 --webroot public路径 --server http://acme.hi.cn/directory
、acme.sh --issue -d mail.schtonn.top --dns dns_dp --server letsencrypt
),虽然没用,但它很难搞定,因此搞定后让人极度舒适。看着左上角那个锁终于没再说“不安全”,我真是感到发自内心地满足。
愚蠢的是,心意答的接口居然没有 https(考虑到他对安全性的种种忽视,这也在情理之中),导致我想继续查成绩,就得把成绩查询的页面回退到 http 上(其实还有个办法,就是让服务器作为代理去收集数据,但那样心意答就能查出来我的 ip,而且你们的信息也得经我的手了,不太好)。好在我把剩下大部分能搬迁到本地的服务都搬过来了,所以只有那一个页面受影响。
为了方便,我把服务交给了 nginx 来代理,让它来处理 http,https 之间各种胡乱的转换。SSL 这个玩意也真是有点矫情,每个接口都要上一层加密,不仅是 http,就连五子棋的 ws 也要升级成 wss(ws 万岁万万岁)。
其实还有件小事,就是我注册了太帅了.cn,正如我在首页所强调的,这么好的域名没人注册,凸显出中国人是在不懂浪漫。
今天增加了 Minecraft 服务器的描述页面,放了很多历史影像,现在看都是妥妥的回忆啊。
同时增加了日志的在线上传功能,这样我就能随时随地增加条目了。(别人也能随时随地给我插入恶意代码了,不过谁怕谁,我的服务器不管哪来的请求都一视同仁,但凡压力一上来就崩溃)
试试手机上能不能上传日志
通过 ``
包裹,简化了有些可读性较低的字符串相加操作,但后来觉得好像可读性更低了。
好好琢磨了一下 Promise 的用法,发现我原来根本都用错了,应该是异步操作中每个函数返回一个 Promise,然后直接调用 .then()
,这样就不用层层往里嵌套了。现在把代码改过来,舒服多了。
这两天和 74 桌原作者合作开发了成绩整理,很有趣。难受的是我用云服务器开发挂不了梯子,总也没法同步代码,只好复制到本地再 push。更新,对于这个问题,我后来在 3001、3002 端口建立了 Gogs 服务,用我的服务器充当云端,效果非常好,对于这种不需要额外功能的开发可以替代用 github 了。第一次见用 python FastAPI 做后端接口的思路,连文档都有,确实很完善。
初步建立了化学数据库的链接机制,目前能把化学方程式和离子方程式对应起来。
Nginx 就是好,现在全站都扔到 https 上了,邮件服务也都套上了 SSL,针对邮件和 gogs 的 http 访问已经被我关闭了,不过对主站为了保险还是开着吧。
今天开始尝试搭建数字校园的替代品。这个数字校园的一坨代码真是古老而庞大,神秘的后端渲染,不知所云的 cookie 十分让人抓狂。
由于数字校园没有设置跨域请求,我只能将所有请求全部代理,再从 nginx 上添加返回头。同时,它的 cookie 由于携带了 HttpOnly
,前端是无法直接读取的,但通过 nginx 乱搞一下就把这个字段删掉了。
通过充分运用“每个子页面都要新的 cookie”和“不管什么都要 302 一下”的原则,数字校园让替代品从登录这一步开始就举步维艰。更加愚蠢的是,fetch
遇到 302 会自动跳转,中途各种精细的 cookie 配置叫人完全没法下手。好在我通过 nginx 把 302 全部改为携带网址的 200,解决了这一问题。
经过很多个小时的努力,数字校园终于有了成色。目前实现了修改密码,成绩,收发消息的功能,并且一次登录后鉴权就基本无感了。我把所有请求和鉴权判断,重新登陆以及 cookie 获取这些功能都扔到一个函数里,专门用来请求,完事之后再来一个回调函数。这样封装好之后,大大提高了编写效率,真是优雅啊。