123
周日早上,雨晴七点就醒了。不是闹钟叫的,是走廊里的脚步声。青旅隔音不好,有人拖着行李箱从门口经过,轮子碾过地板,咕噜咕噜的。她躺在床上看了一会儿天花板,然后拿起手机。
周正平昨晚发了地址。公司在浦东,离青旅不算远,打车二十分钟。她查了一下路线,又看了一眼时间——十点。还早。她翻了个身,群里何意味发了一条消息:“姐,你今天面试?”雨晴回了个“嗯”。何意味发了一个猫加油的表情,苏晚在后面跟了一句“加油”。
起来洗漱。青旅的卫生间是公用的,在走廊尽头。她推门进去,里面已经有人在洗脸了。一个年轻女人,头发湿着,穿着睡衣,嘴里叼着牙刷,含糊地说了声“早”。雨晴说了声“早”,进隔间。
出来的时候年轻女人还在,对着镜子擦脸。她从镜子里看了一眼雨晴,“你也是来参会的?”雨晴说“嗯”。年轻女人擦完脸拧上盖子,说“昨天的分享你听了吗,有个小姑娘讲渗透测试,讲得挺好的”。雨晴洗着手,没接话。“听说是十五岁,这么小的年纪,真厉害。”年轻女人说完走了。雨晴看着镜子里的自己,水龙头的水还在流。她关上,擦干手。
回房间,换衣服。今天穿的是昨天那套——白色长袖T恤,深蓝色薄卫衣,黑色休闲裤。面试穿什么,她没想过。也没有更适合的衣服了。对着手机前置摄像头看了看,头发还是长的,没扎。她从包里翻出一根皮筋,扎了个低马尾。对着镜子看了看,碎发还是掉出来几根,没再弄了。
出门,打车。上海的早晨阳光很好,路边的梧桐树刚发芽,嫩绿的叶子在风里晃。雨晴靠着车窗,看着外面的街景。浦东这边高楼多,玻璃幕墙反射着太阳光,晃得她眯起眼睛。她想起昨天在台上讲的时候,灯光也是这么晃的。今天不用上台了,但比上台还紧张。上台是她自己知道的东西,面试是别人问她不知道的东西。
到众安科技楼下的时候九点四十。她付了车费,站在门口看了一眼。一栋写字楼,二十几层,玻璃幕墙,门口有保安,前台在大堂里。她走进去,前台是个年轻女人,穿着职业装,微笑着问“您好,请问找哪位”。雨晴说“找周正平,周总,约了十点”。前台打了个电话,说“稍等”。过了一会儿一个穿白衬衫的年轻人从电梯里出来,走过来,“陈雨晴?”雨晴点头。那人说“跟我来,周总在等你”。
电梯上楼,十七层。出电梯,走廊里铺着地毯,墙上是公司的标志——众安科技,蓝色字体,下面一行英文。年轻人领她进了一间办公室,不大,一张桌子,两台显示器,几盆绿植。周正平坐在桌子后面,穿着昨天的深灰色西装,领带换了一条,深蓝色的。他站起来,笑了笑,“来了,坐”。
雨晴坐下。周正平给她倒了杯水,放到面前。“先简单聊聊。你昨天讲的那个竞态条件,我回去又看了一遍你的PPT截图,思路很清晰。你是从什么渠道学到这些的?”
雨晴想了想。“网上看文章,自己搭环境练。比赛的时候遇到类似的题,回去复盘了一下。”周正平点了点头,“你比赛那次,第三名。那个比赛我知道,参赛的大部分是大学生和业内的,你一个初中生能拿第三,说明基础不错。”雨晴没说话,端起水杯喝了一口。“那咱们直接点。我们这边需要一个人,做技术顾问,主要工作是去客户公司现场做代码审计、安全加固、应急响应。出差比较多,可能一个月有两三周在外面。你能接受吗?”
雨晴放下杯子。“我没成年。有些场合可能不太方便。”
“这个我们考虑过。每次出差会有同事陪同,不会让你一个人去。你的工作主要是技术层面的,跟客户沟通的部分我们有项目经理负责。”周正平从桌上拿起一个文件夹,“这是保密协议和合作意向书,你先看看。”
雨晴翻开。保密协议条款很多,她扫了一遍,大致意思是不能泄露客户信息、不能把项目代码带出、不能私自留存漏洞。合作意向书上写着工作内容、合作方式、薪酬。薪酬那一栏写的不是固定工资,是按项目结算,每个项目根据难度和时长定价,大概在两千到八千之间。她看到“八千”的时候眼睛跳了一下。一个项目八千,她之前做一个项目才三千。
“薪酬这块,你满意吗?”周正平问。
雨晴合上文件夹。“我想问一下,代码审计我没怎么做过,主要是渗透测试。你们这边有培训吗?”
周正平靠在椅背上。“培训谈不上,但会有老员工带你。第一个项目你跟同事一起做,他教你,你学。做两次就能上手了。你的渗透测试经验对代码审计有帮助,因为你知道漏洞在运行时是什么样子,反过来看代码更容易定位问题。”
雨晴点了点头。
“那要不现场试试?”周正平打开桌上的笔记本,转过来对着她。“这里有一段代码,Java的,你帮我看看有没有漏洞。不着急,慢慢看。”
雨晴凑过去看屏幕。是一段登录功能的代码。从Controller开始,接收用户名和密码,然后调用Service层查询数据库。她一行一行地看。看到DAO层的时候停下来,那里拼接了SQL语句——String sql = "SELECT * FROM user WHERE username='" + username + "' AND password='" + password + "'"。没有用预编译,直接拼接字符串。
“SQL注入。”雨晴指过去。“这里用了拼接,没有参数化查询。用户名或者密码里加一个单引号,就能打断SQL语句的结构,实现万能密码登录或者拖库。”
周正平没说话,示意她继续。
雨晴往下看。再往下是密码处理——password = MD5(password)。用的是MD5,不是BCrypt,也不是加盐的哈希。MD5已经被证明不安全,彩虹表可以快速破解。她把这个问题也说了。还有一处是错误处理——登录失败的时候,返回的提示信息区分了“用户名不存在”和“密码错误”。这个信息泄露可以帮助攻击者枚举有效用户名。她一共找到了三个问题。
周正平点了点头,“不错。那如果让你修,你打算怎么修?”
“第一,改用PreparedStatement或者MyBatis的#{},避免SQL注入。第二,密码哈希换成BCrypt,加盐。第三,错误提示统一用‘用户名或密码错误’,不区分具体原因。”
周正平把笔记本转回去,在键盘上敲了几个字。“可以了。你的水平比我想的要扎实。”他从抽屉里拿出一张A4纸,打印好的,上面写着“技术顾问合作协议”。“这个是正式的。你拿回去看一下,没问题的话签了寄过来。”
雨晴接过去。协议上写的工作内容更详细——代码审计、漏洞修复指导、应急响应、安全培训。出差频次写的是“根据项目需求”,没有固定数字。薪酬部分写了每个项目的定价区间和结算方式。她注意到有一条:“乙方需保证每月累计出差不少于10个工作日。”十天,不算多,但也不少。
“周总,这个出差天数,我还在上学,可能没办法保证。周末和寒暑假可以,平时的话——”
周正平打断她。“平时的话,客户那边的工作日你确实去不了。这样,我们调整一下,优先安排在周末和假期。紧急项目再看。”
“好。”
周正平站起来,伸出手。“那就这样定。你回去跟家人商量一下,没问题就签。希望尽快。”
雨晴站起来,跟他握了手。他的手很干燥,力度不大。
从办公室出来,那个穿白衬衫的年轻人还在走廊里等她。他笑着说“面试怎么样”。雨晴说“还行”。送她到电梯口,年轻人说“我叫张远,以后可能跟你一起出差,多多关照”。雨晴说了声“你好”,电梯来了。
下楼,走出大堂。阳光比来的时候更亮了,照在地面上白花花的。雨晴站在门口,把协议从包里拿出来又看了一眼。众安科技,技术顾问。项目结算,两千到八千。出差。她给林听夏发了条消息:“面完了。过了。让签协议。”
林听夏回:“待遇呢?”
“按项目结。两千到八千。”
“你答应了?”
“说回来考虑。但基本定了。”
林听夏发了一个句号。过了一会儿又来了一条:“那你以后要出差?”
“嗯。周末和假期去。”
林听夏没再问了。
雨晴把手机放进口袋,打车回青旅。收拾东西,退房。下午五点多的火车,她还有好几个小时。箱子放在前台,她出去逛了一圈。没去景点,就在附近走了走。路边有一家书店,她进去看了一会儿。技术类的书,翻了翻,没买。出来的时候路过一家奶茶店,买了一杯芋泥波波,十八块,比郑州贵。她端着奶茶边走边喝,想着面试的事。代码审计,她没做过,但周正平说有人带。出差,每个月至少十天,周末和假期去,不知道会不会跟上学冲突。但她不想拒绝。八千一个项目,做两个就顶之前所有的收入了。她站在路边,把奶茶喝完了。
下午四点,回青旅拿箱子,打车去虹桥站。安检,检票,上车。找到座位,靠窗。火车开的时候天还没黑,窗外的上海慢慢退后,变成楼房,变成工厂,变成农田。她把协议从包里拿出来,又看了一遍。薪酬那一条,她看了很久。然后给周正平发了条消息:“周总,协议我回去签,寄到公司地址?”周正平回:“对。寄到公司,收件人写我。”雨晴回了一个“好”。
她把协议折好放回包里。手机震了。何意味发消息:“姐,几点到?”
“九点多。”
“我去接你。站台还是出站口?”
“出站口。”
“好。”
雨晴靠着车窗。对面坐着一个中年男人,在看手机,外放声音很大,在放一个短视频,一个男人在讲国际局势。雨晴戴上耳机,打开音乐。舒缓的曲子,听了没几分钟就困了。她闭上眼睛,想着这次上海之行。上台演讲,有人递名片,面试,过了。两天,做了这么多事。她翻了个身,头靠在车窗上,玻璃凉凉的。
睡了一觉。醒来的时候天已经黑了,窗外的灯光一闪一闪的,看不清是什么地方。看了一眼手机,八点四十。快到了。她坐直了,理了理头发。群里何意味发了条消息:“姐我到了,在出站口。”苏晚问“你一个人去的?”何意味“嗯,我打车来的”。苏晚“你倒是积极”。何意味发了一张猫等人的图。
火车停了。雨晴拿行李,下车。站台上人不多,她跟着指示牌往出站口走。远远地看到何意味站在玻璃门外面,穿着那件浅蓝色卫衣,帽子没戴,头发好像又长了一点。他在人群中张望,看到雨晴的时候眼睛亮了一下,挥了挥手。
雨晴走出去。何意味接过她的行李箱,“姐,面试怎么样”。
“过了。”
“我就知道。姐最厉害了。”
两个人往停车场走。何意味说他打车来的,司机还在外面等着。雨晴问他“你花了多少钱”。何意味说“四十多”。雨晴说“你来回八十多,就为了接我”。何意味说“嗯”。
上了车。何意味坐前面,雨晴坐后面。司机是个中年男人,没说话,开了导航。车开了,窗外的郑州夜景很熟悉,霓虹灯、路灯、车灯,混在一起。雨晴靠着车窗,有点累。
手机震了。林听夏发的:“到了吗?”
“刚出站。何意味来接我了。”
“那你早点回去休息。”
“好。”
雨晴放下手机。何意味回过头,“姐,你吃饭了吗”。“没”。“那等会儿到了吃个饭?我请你。”雨晴说“不用”,何意味说“我想请”。雨晴没再争。
到家的时候快十点了。何意味帮她把行李箱拎上楼,在门口停下来。“姐你去放东西,我在楼下等你。”雨晴开门,橘子皮蹲在门口,看到她就叫了一声。不是平时那种叫法,声音更响,好像在说“你怎么才回来”。雨晴蹲下来摸了摸它的头,把行李箱推进去,换了件外套,下楼。
小区门口有一家面馆还开着。两个人进去坐下,雨晴点了碗素面,何意味点了碗牛肉面。等面的时候,何意味看着雨晴。“姐,你瘦了。”
“才两天,瘦什么。”
“就是瘦了。在上海没好好吃饭?”
雨晴想了想,好像真的没怎么吃。昨天中午一碗面,今天早上没吃,中午随便吃了点面包。
面来了。雨晴低头吃面,何意味也吃。吃到一半,何意味说,“姐,你以后要去外地出差吗”。
“嗯。签了的话可能要去。”
“去哪?”
“不一定。看项目。”
何意味点了点头。他吃了一口面,“那你一个人去吗”。
“公司会有人陪。”
“那就好。”
吃完面,何意味去付钱。雨晴站在门口等着。出来的时候何意味说,“姐,我以后能跟你一起出差吗”。雨晴看着他,“你不上班了”。何意味说“我可以请假”。雨晴说“不行”,语气不重但很确定。何意味没再问了。
两个人站在小区门口。路灯亮着,把他们的影子拉得很长。
“你回去吧。”雨晴说。
“姐你先上去,我等你灯亮了再走。”
雨晴没推,转身走进小区。上楼的时候楼道里的声控灯亮了,她走到门口,开门进去,按亮了客厅的灯,然后走到窗前,往下看了一眼。何意味还站在路灯下,仰着头,看到灯亮了,挥了挥手,然后转身走了。那件浅蓝色卫衣在路灯下变成了灰白色,背影越来越小,拐进巷口不见了。
雨晴拉上窗帘。橘子皮从床上跳下来走到她脚边蹭了蹭。她蹲下来摸了摸猫的头。
“我回来了。”橘子皮喵了一声。雨晴把它抱起来放在腿上。猫的体温隔着裤子传过来,暖融融的。她从包里拿出那份协议,翻到薪酬那一页又看了一遍。
然后拿起手机,给林听夏发了条消息。“签了。”
林听夏回了一个句号。
雨晴看着那个句号,笑了。她把协议放在桌上,去洗了澡。躺在床上,橘子皮钻到被子里,在她脚边盘成一团。她摸了摸猫的背。
明天周一,有课。
她关了灯。