如何在学术的世界里做一个侦探

今天给大家讲一幅画的故事。这幅画的名字叫《明皇避暑宫图》轴,绢本,水墨,纵161.5 厘米,横105.6厘米。所长的硕士论文做的就是这幅画,我要把这组宫殿“翻译”出来,画成现代人能看得懂的图纸。

这种画房子的画叫界画。界画是中国画诸多绘画门类里,可能是最特别的一个,因为界画是唯一对建筑有浓厚兴趣,并力图画地越真实越好,这幅画画的有多细,看看这个放大图你就知道了,堪称界画史上惨绝人寰的杰作

在强调意境的中国画里,写实的界画绝对是一个另类,所以它确实很命短,大概只在五代到北宋期间鼎盛过。

《明皇避暑宫图》就诞生在这一鼎盛时期,这幅画相传是生于五代的郭忠恕在北宋初期所作。郭忠恕是界画界的传奇人物,画技及其高超。《圣朝名画评》中评他的界画,为“一时之绝”,列为“神品”。《宣和画谱》中说,“三百年之唐历五代以还,仅得卫贤以画宫室得名。本朝郭忠恕既出,视卫贤辈其余不足数,如忠恕之高者,岂复有斯人之徒欤?”简单说就是郭忠恕一出,其他人都是渣渣

但是郭大爷的性格也及其古怪,是个喝了酒要打人、动不动就炒老板鱿鱼的人,一言不合就罢官。《宋史》卷四百四十三《文苑四・郭忠恕传》说:“……其后流落,不复求仕进,多游歧、雍、京、洛间……有佳山水,即淹留浃旬不能去。”

在我的想象中,郭大爷是这样的。

但更有可能是这样的。

回到这幅画,要“翻译”这一组房子,首先要搞明白,他画的是哪儿?

这组宫殿是现存界画里,规模最大的。因为他画的太真实了,所以艺术史家门一直相信他画的就是一组真实的房子,可是画的是哪呢?一直众说纷纭。

有学者认为“画面内容为骊山华清宫宏伟壮丽宫室建筑的景象”(赵启斌:郭忠恕《明皇避暑宫图》赏析.文物鉴定与鉴赏.20140226),也有学者认为此处应为帝王避暑的仁寿宫即唐时改名的九成宫(彭莱:中国山水画通鉴-界画楼阁.2006),理由是魏征所撰《九成宫礼泉铭》里描写:“冠山抗殿,绝壑为池,跨水架楹,分岩耸阙,高阁周建,长廊四起,栋宇胶葛,台榭参差;仰视则迢递百寻,下临则峥嵘千仞,珠璧交映,金碧相晖,照灼云霞,蔽亏日月。观其移山回涧,穷泰极侈,以人从欲,良足深尤。至于炎景流金,无郁蒸之气;微风徐动,有凄清之凉,信安体之佳所,诚养神之胜地,汉之甘泉不能尚也。”这段话的气势和画面很像。

可是中国古代留下来的那一段文学描述没有虚张声势的成分呢?伟人出生天空一定是有异样的,皇家宫室一定要牛逼到不行。文学家的鬼话是不能相信的,我必须得找到一种新的方法来确认这个房子是否存在。

我首先从画名入手,既然是避暑宫图,那我就找找隋唐两代兴建的离宫到底有多少?《新唐书》卷二十七《地理一》卷二十八《地理二》详细记载了这些离宫的名称和地址。

他们分别是关中19座:隋仁寿宫/唐九成宫(麟游)、隋/唐太和宫(终南山)、唐玉华宫(宜君)、唐华清宫(临潼)、隋/唐长春宫(朝邑)、隋/唐兴德宫(冯翊)、庆善宫(武功)、龙跃宫(高陵)、隋/唐凤泉宫(眉县)、永安宫(麟游)、隋/唐太平宫(户县)、隋/唐金城宫(华阴)、隋华阴宫/琼岳宫(华阴)、隋普德宫/神台宫(华阴)、万全宫(蓝田)、永安宫(永安)、游龙宫(渭南)、望春宫(万年)、望贤宫(咸阳)。

关外(主要是洛阳地区)9座:明德宫(西苑)、襄城宫(汝州)、奉天宫/三阳宫(嵩山)、兴泰宫(寿安)、兰峰宫(永宁)、崎岫宫(永宁)、兰昌宫(福昌)、隋/唐福昌宫(福昌)、连昌宫(寿安)、紫桂宫(渑池)。

在GOOGLE上一座一座的寻找这些离宫画了我一个通宵的时间。这28座离宫中,目前还能找到遗址的有13座。唐代四大离宫九成、翠微、华清玉华都还在,武则天喜欢的凤泉宫现在是个温泉大澡堂,唐太宗李世民渡过黄河之后第一晚驻扎的长春宫现在是一片荒凉的苞米地,而他出生的庆善宫现在是一条河。

这13座离宫遗址跟之前郭大爷的放旷之旅“多游歧、雍、京、洛间”刚好重合,这么说,郭大爷当年造访过某一座离宫的可能性就很大了,毕竟怀古是个永恒的旅行主题。

但是这13座离宫遗址如何跟《明皇避暑宫图》产生关联呢?如果你还仔细看过这幅画,你应该还记得,这幅画上有水、有山、有房子。所以我们用在“依山傍水”来做个筛选,留下的离宫只身下了四座,分别是连昌宫、太平宫、玉华宫和九成宫

对照Google的地图,观看这四座离宫的地形条件,他们分别是这样:玉华宫基本是平地,连昌宫和太平宫是缓坡,九成宫地形变化比较突出。

很明显,九成宫和他们都不一样。

从发掘报告的情况来看,遗址堆土巨大,成上中下三个台地,这与《明皇避暑宫图》上的建筑群落台地关系相似。并且郭忠恕很有可能来过此地,因为第一个台地的高差巨大,他当时一定在心中泛起疑问:“我操,这么高是咋上去的?”

拥有一世英才的郭大爷最终也没想出好的办法,所以在《明皇避暑宫图》中,相同的位置,他设计了一个坡度巨大基本只能手脚并用的“爬梯”。

与此同时,郭大爷画了两个小人在楼梯边,一个人指着楼梯给另一个人说着话,如果要设计一句台词,一定是“老铁,YOU CAN YOU UP!”

另外,遗址报告上显示,遗址侧面有一条河流叫杜水,水流的相对方向跟《明皇避暑宫图》入口水闸处显示的方向一致。有个据说是李思训画的《九成避暑》在河流的方向上就跟遗址报告产生了偏差,正好画反了。

更有趣的是,遗址的北边有一个瀑布,这个和《明皇避暑宫图》上的瀑布正好对应,连相对方向的一致。《九成避暑》也表达了这条飞瀑的存在。

从地形特征、水流方向和高山飞瀑的暗合,基本可以确定《明皇避暑宫图》画的就是九成宫我大概是用建筑学的方法破解了一个艺术史上的难题。

我很兴奋,带着这个结论去开我硕士的题,教授们说,你这是在写侦探小说,学术可不能这么干。

哈哈哈哈哈哈!

[编注]本文中提到的“所长”,指作者个人自媒体title:“不正经历史研究所所长”。

【漏洞预警】Windows SMBv3远程攻击0day漏洞威胁通告

北京时间2月2日,国外技术网站Github曝光了Windows SMBv3存在远程攻击0day漏洞。根据已公开的漏洞验证代码(POC),未经身份验证的攻击者可以迫使受影响系统蓝屏崩溃。目前微软尚未对此漏洞发布公告,暂不明确何时将推出补丁。

经验证,此漏洞主要影响Windows Server 2012/2016、Win8/8.1以及Win10系统。攻击者可以模拟成一个SMB服务器,诱使客户端发起SMB请求来触发漏洞;攻击者也可以通过中间人方式“毒化”SMB回应,插入恶意的SMB回复实现拒绝服务。

图:研究人员在Win10上验证SMBv3远程拒绝服务漏洞攻击

关于Microsoft 服务器消息块(SMB)协议

Microsoft 服务器消息块 (SMB) 协议是 Microsoft Windows 中使用的一项 Microsoft 网络文件共享协议。

漏洞影响范围

此漏洞存在于SMB客户端(mrxsmb20.sys),已公开的POC可以导致系统BSOD,即死亡蓝屏。攻击者可以通过139、445等远程端口,或中间人攻击,甚至以包含UNC路径的邮件、文档或网页诱骗用户点击触发漏洞。

漏洞缓解措施

鉴于该漏洞攻击方法已经公开,且尚无补丁,360安全中心建议企业客户在防火墙处阻止TCP 端口 139 和 445,通过阻止入站和出站 SMB 流量,保护位于防火墙后面的系统防范此漏洞攻击造成的安全风险。

PoC参见https://github.com/lgandx/PoC/tree/master/SMBv3%20Tree%20Connect

*

一个人生活,怎样才能把日子过的优雅且有品位?

上这么多年学,每每都是住在学校宿舍,与几人共处一室,共同生活。我虽性格开朗,但却极希望独处,希望能够拥有自己的私人空间。

现下毕业一年,我终于过上了我想要的生活。

有朋友曾跟我抱怨,她一个人生活,总是过的一团糟,而我为什么却生活的充满诗意?

我想,那是因为她没有真正体会到生活的真谛。

在我看来,生活的真谛是——享受。

享受由不完美变的近乎完美;享受大脑充盈的底气;享受亲手为自己做美食的犒赏;

我的锻炼场地

1.早起锻炼,塑性健身——让自己变美

“一日之计在于晨”,如果你一觉睡到中午起,或者睡到连吃饭的时间都没有就得匆匆忙忙赶到公司工作,如何才能在一天的开始有个美好的开端?

我往往都是早晨六点起床,晨跑30分钟,再洗个热水澡,吃早饭,然后到公司后还有时间写日记与写下对当日的规划。

早起与健身的好处不胜枚举,只让自己精神更好,形体更好一条,就可以令很多人决心斩断对周公的眷恋。

生活的美好,使自己变得赏心悦目也是极其重要的。

六点钟的早晨
透亮的花儿

2.每天都要规定看书任务——充实大脑

宋代黄山谷曾说过:“一日不读书,尘生其中;两日不读书,言语乏味;三日不读书,面目可憎”。

当下是一个快节奏时代,离开了学校后,很多人再也不能认认真真看下一本完整的书了。正因如此,那些依然能静下心来看书的人才显得更加可贵。

无论做什么工作,都应时常看书,不应仅限于专业内书籍,多看些旁书、杂书不仅能够开阔我们的视野,还有助于我们换角度思考问题。

去年看过书的清单,还有没有记录的
今年偷懒了,没看多少书,字有些放纵……

3.有时间的话自己做饭——做最合自己口味的美食

对于做饭这件事,我一直这样认为:不会不伤大雅,但会,岂不是景上添花?

虽说现在社会已不要求女性必须会做饭了,但是在自己想吃时可以做出一顿能打满分的饭,不是很有成就感吗?或者在朋友来访时能亲手做上一顿色香味俱全的美食,岂不是妙哉?

过去我总觉得做饭是一个劳心劳力的事情,会做以后总是得做,但是当看到家人吃到自己做的饭菜时所展现出来的赞赏的目光,与每次饭菜都吃光光后的见底盘碗,就觉得做饭是一个很美好的事情。

做饭,如同做画,也是一项艺术行为。从挑选、清洗、到制作、完活,全部按照自己期待的模样来。

酱牛肉,同事都说很好吃
自己做的便当

4.练字,毛笔、钢笔、普通废液笔,都可——写字静心

在今年开始练习毛笔字以前,我从没想过自己还会在学业完成以后重拾字帖练习写字,但现在我做了,并且一经开始,便一发不可收拾。

现在职场中人,除了签合同与文件需要签名之外,应很少还有需要用笔写字的地方。也因此,很多人也不在乎字写的好坏与否。

尽管生活与工作中看似对手写字没有需求,但我依然喜欢笔尖磨挲纸张时所带来的触感。

写字的过程会令人上瘾。

我至今仍有写日记的习惯,开心的事情记录下来,仿佛将快乐凝固,永远相随,若是不开心的事情,写到日记里,便从脑袋里将其清空,又可以重新变得快乐。

开始练习毛笔字是一个很偶然的开始,但是自从我发觉练习毛笔字的这个过程能够让我自己变得十分平静以后,我就喜欢上了这种感觉。平日里,除却睡觉时,其他时间真的很少能够令自己如此安静,心无杂念,无无旁骛,而且,看着自己的字体写的越来越赏心悦目,不也是一种享受?

就酱,同志仍需努力

5.收拾房间,布置房间——不管房间是不是你的,但是心情是你自己的

我很想住在能永远属于自己的房间里,但无奈,家与工作并不在一个地方,只能住在租来的房间里。

尽管如此,我还是会将现在住的房间当作终身属于我的房间一般对待。房间不是自己的,但生活是自己的。

一切能让生活变得更美好的事情,都是值得做的。

房间保持整洁,物品分门别类归置好;关掉大灯之后,房顶星星点点亮着的小彩灯;床头桌旁一根小小的助于睡眠的
果香;书桌上一瓶插有鲜花的花瓶;地板上一个任你碾压的懒人沙发……

有很多很多事,都可以令你的生活变得优雅且美好,你愿意去做吗?

十块钱一束,但可以令心情愉悦很久

愿你我都能将生活过的优雅有品味。


敲黑板,以下也是重点:

艺术家生活规律:

1.每天晚上必须十一点前睡觉。

2.总是保持好心情。

3.少吃冷的和辣的。

4.多睡觉。

最后,你是一个大艺术家要照顾好自己。

我是妍小主,现更名妍兮,相遇是缘,希望我的文字能使你看后不觉浪费了时间。

毕业第四年,我一个人在大连生活

中元节,加班,归家时天已蒙蒙黑。

等过了三辆公交车,一辆也没挤上去,纠结良久,最后还是决定步行回家。没走几步胃痛的不行,在路边买了个烤冷面,边走边吃。

海大是我回家的必经之路。学生开学了,穿着军训服成群的从我身边穿过,看着他们稚嫩的脸颊,不由得伤感。我站到小路的一侧,让出足够的空间给他们,嘴角也许还残留着油渍。借着路灯微弱的光,我不知道他们会用何样的眼光打量我这个逆行者,或者压根没有注意到我的存在,唯一值得庆幸的是我有夜盲症,根本也看不清对方的表情。

脚步声渐远,说笑声也随之远去,心里难免酸酸的,拾起沉重的失落继续前行。

曾经,和他们一样的年纪,我的身旁也总有三五好友围绕,一起打闹玩笑,肆意张扬毫不在乎旁人眼光。如今回想, 那些往事就跟城里的星光一样,纵使知道它存在,也根本望不见。无言变成了陪伴,耳机才是最忠实的伙伴,闯先生用他异常磁性的声音发问,“你在哪座城市,留下过怎样的故事,又怎样轻轻说声再见……”冬去春来,夏走秋至,一年又一年!

一开始的时候,很不习惯一个人吃饭,一个人逛街,亦或是一个人看电影,怕被熟人看见,怕孤独感被人同情,被人放大。后来才发现,城市那么大,哪有那么多的缘分让你遇见。三年,换过三份工作,真正熟悉的不到50人,剩余认识的人只有在特定的环境下才可以称得上是认识,但大连市一共有700万人口,所有的熟悉感融入700万的洪流中都会变得陌生又渺小。

渐渐地,开始习惯一个人。习惯一个人吃饭,一个人逛街,一个人看电影……果真,从来没遇见过熟人。

友情

近一个月来,我与闺蜜甚少联系,隔着两个城市,一忙起来,根本就没办法顾及彼此,但我知道她一直都在。如今回想那些幼稚的年少时光,最值得庆幸的是:在单纯的年纪交到了闺中密友。否则,我现在的人生将孤独100倍。

中石油爆炸的那天,我在相隔好几区的出租屋里看日剧,她打来电话的时候我才知道这边出事儿了,因为这样的新闻而担心我的,这世界上除了父母好像只有她了。两天前也是,这家伙给我发了条微信,我在一小时之内没有回复,连环call便一个接一个翻山越岭的打进来,得知我只是手机静音她才安心的舒了口气。

虽然从未说过,但是被人关心的感觉可真好。当时我就在心里想,那种失联24小时无法取得联系的新闻估计永远都没办法发生在我身上了……

爱情

我还记得上一次和大学同学的聚会,聊天的时候无意提到了最近结婚的同学,大家开始有意无意的对家庭产生了向往,对于我这种万年单身的人来说注定又沦为了被调侃的对象,只是为了反驳,我才会说出那句至今都在后悔的恶毒话,“没关系啊,等恋爱的分手了、结婚的离婚了,我们不又都一样了。”

几个月后,L在群里说她分手了,没人在意,大家觉得是玩笑话或者充其量也就是闹闹分手,都快结婚的人,怎么可能分手?但确实就是分了。我叫她一起出来吃饭,她说不要同情她,席间我们天南海北的聊,偏偏避开她分手的话题。一语成谶,最后悔的莫过于我曾经说的那句恶毒的话。

新闻上说,中国目前有两亿人单身,这么多人中,为何偏偏遇不到对的那个人?

我想是因为胆怯

在我二十岁的时候,遇见过一个男孩儿,某种特殊的原因,我们只能信件来往,虽然是电邮,但漂洋过海也是成千上万公里,你以为它会是《查令街84号》一样的浪漫故事吗?错了,今年我27岁,二十岁看到会心动的情话,如今看来一文不值,我们真正见面的相处机会少之又少,我们会合适吗?我想要的是见到他,然后确定我的心意。但他想要的却是一个确定的心意,否则漂洋过海的见面不值得。最后的结果就是现在,相忘于江湖,删掉一切可以联系的方式,删掉那些往来的信件,茫茫人海中我们永远不会再相见,也许某天我们甚至都会忘记彼此的姓名,成为真正的陌生人。

这才是成人世界里的感情,没有那么多的年少轻狂,也没有那么多的不顾一切。最为卑微可笑的是,我竟然真的忘记了他所有的好,最后的印象永远留在他答应来见我的那一句。

最后,他食言了。

你知道吗?我竟然还在期待爱情。但我想,也许很难再相信一个男人的诺言了。

亲情

月初刚刚签了新一年的租房合同,同时缴纳四个月的房租,交完房租后,室友兜里只剩五十块,距离发资的20号还有20天。交房租前几天,她用最后的家当给妈妈买了两件衣服邮寄回家。阿姨收到衣服的那天晚上,她们在电话里吵了起来,原因大概是衣服不太合身,因为无法退还,所以阿姨有些上火。女儿一方面要劝母亲别上火,一方面又要压抑自己的委屈,挂断电话她便哭了。

合租两年,这样的事情大概是第一次。她在厨房里炒菜,依然掩饰不了抽泣的声音,彼时我正在屋子里给我的妈妈打电话。挂断电话,对面屋的房门已经紧闭。曾几何时,我也这样在紧闭的房间里偷偷哭泣,一个人在陌生的城市生活,总有许多委屈无法与人言说,这一刻是孤独的,但这一刻也许只有孤独的熬过才能真正的开心起来。

我没有勇气敲动她的门,更没有勇气走过去给她安慰,甚至没有勇气在下一刻看到她时直视她的眼睛,因为不知如何安慰?从公司到出租屋,从一个格子间走回自己的小房间,这个城市相较于家乡而言最大的区别就在于设防感。格子间内,我们肆意孤独,走出去的我们却永远乐观开朗,明知彼此的假面,可没人愿意撕破这层伪装,所以才造就了城市的距离感。

关系再好的人之间,也有距离。

总有不好的时候,亲情既是救命良药,也是压迫设防的最后一根稻草,我只愿家人好,这样我才能心无旁骛的笑闹,孤独总可以熬过,至少我知道,遥远的城市一角,有着对我最赤诚的牵挂,我怎敢不好?

我是谁?我常常质问自己,常常又找不到正确的答案。

有一天,坐在对面的姐姐问我,为什么看起来总是这么开心?我反问她,“我要是不开心,难道会有人逗我开心?”

显然不会有。

毕业第四年,我一个人在大连生活。相比七年前,这个城市变了很多,足球没了,啤酒节取消了,朋友也各奔东西了。多了东港,增设了地铁,还修建了跨海大桥。时光流转,七年转眼即逝,我也褪去了一身稚嫩,但依然想象不到未来的样子?想象不到是否会一辈子在这里安居乐业?

我为什么而努力生活?又为什么而努力微笑?也许我们一辈子都在寻找答案,谁又知道能不能找得到?

昨晚妈妈打来电话,老爸因为牙疼,没吃晚饭就睡着了,她一看才知道,他原来所有的大牙都掉光了,难为他忍了这么久也未提起……

孩提时,疼了可以哭,饿了可以闹!但现在,当我忍着胃痛也要完稿的时候,我就明白了我老爸的做法,原来长大了,总要一个人学着承担些什么!

忘不掉老城,城里诉说着过往的风景

老城印象

01

踽踽独行于新城,入眼高楼林立,却一瞬间厌倦了现代文明演绎的繁华,突然想去老城走走。

趁棚户区改造工程彻底收尾之前,再听一遍落后于时代步伐的老城那饱经沧桑的口吻里溢满的儿时旧时光,拼凑出那模糊的记忆。再忆一遍曾经,回温一遍纯真年岁里笑过的风景。然后,安然于现代文明,任回忆翻滚,定格成此生最美的记忆。

记得小时候,最喜欢的食物就是炒爆米花(家乡俗称炒苞花),候在小摊边,看奔腾的火焰灼红了笨拙的砂炉,炒苞花的老爷爷摇动着手中的铁柄,让每一粒玉米都均匀受热,吐露美丽的花苞,纯白撑破了金黄,绽放出美味的惊喜。最喜欢听开炉一瞬间爆发的嘭嗵声,在一片烟雾萦绕间,香脆糯的爆米花便出炉了,浓浓的玉米味总让人食指大动,根本停不下来,所以大人们也称爆米花为“鬼扯手”,意即不自主的想伸手去抓那么一两颗来吃。

而今颓废的城西,炒苞花的老爷爷坐在火炉边,咂着和记忆中味道一模一样的旱烟。磕一磕老烟斗,抖出的烟灰里记载着爷爷百年如一日的工作里,单纯摇动的岁月。路过门前,老爷爷亲切地招呼:“嬢嬢(niangniang,家乡对女性的称呼),买苞花不?”不忍拂了爷爷的好意买了一袋,一如记忆中的酥脆,好像一瞬间回到了总角之时的蹲守时光。

城西苞谷花

02

街道旁的手工包点铺,大叔奋力地揉着面,豆大的汗珠滴落在水泥地面,浸染出一点不规则水渍,旁边大婶一边给丈夫擦着汗,一边把一个个包好馅的包子放进蒸屉。

烟雾氤氲,流动的不仅仅是味道,还有味道里相濡以沫的爱情。烙好的包谷粑泛着金黄透亮的光泽,咬一口,内层酥脆,外层绵软,香浓的玉米味溢满齿间。一边吃,一边看两边低矮的青砖瓦房,感悟那一砖一瓦里,这个城市过往的味道。

苞谷粑

走进农贸市场,泥泞的路面写满多少匆忙的脚步。不同的小摊贩卖不同的各色蔬果和调味料,如同这个城市里不同的人各自不同的生活,每一种生活都有各自的味道。

野生猕猴桃躺在竹篾里,圆圆滚滚丑丑模样,密布绒毛,生活在城市里孤寂久了的人们,会不会也把自己包裹得满身绒毛只为了增添些许温度,借以慰藉冰冷的内心。一旁的笋尖散发莹白的光芒,像极了凌波缥缈的佳人那一双纤纤素手,惹人怜爱。方明了“指如削葱根”是何种美丽了。

03

走过民安路,水西人习称“挑水湾”,暂不论地名由来,单说这条路上的小吃摊,那可是把油炸食品的美味做到了极致。

炸得金黄的土豆混合纯白的米皮,洒上黄色胡萝卜丝,在油的翻滚下色彩不断跳动,视觉的美丽激活味蕾,是每一个爱土豆的人不可错过的味道。

民安路小吃摊

大转盘路口,卖盐酸的大叔推着单车,小提篮里的盐酸菜撒上辣椒粉花椒面,鲜香麻辣的滋味一直在勾引口水犯罪。麻辣脆还不是当季食材,所以略带绵软,不过丝毫不影响它的美味。小推车贩卖当季开得热烈的绣球花,团团簇簇驱散了灰色的心情,世界变得明亮美妙。

文峰路步行街,千篇一律的地摊和小吃摊。苗银上刻画的图腾,是一个民族文化的传承。五颜六色的冰粉冒着冷气,撒一把芝麻,漂亮得不忍破坏。包裹着各色蔬食的春卷,躺在白色米皮的怀中可爱得像襁褓里的婴儿。手工蛋卷,一张蛋饼一根筷子一裹一卷,温度冷却后成就的圆筒形,好像施魔法一样神奇。酸辣粉在抓放提拉间静卧在碗中,褐色的苕粉晶莹剔透,淋上红油,撒上葱花,浇上高汤,便成就一份无法言说的美味。

冰粉

这里的各色休闲吧,你会听见客人点餐时总会说:“服务员,来杯咖啡,再加一碗酸辣粉哈。”选一个靠窗的位置,看窗外行人如织,浓荫间洒下的阳光在青砖路面打下斑驳光影。慵懒的午后,在一杯咖啡的时光里看人生百态,忽觉岁月静好。

04

老城的痕迹被现代文明一点点磨碎,现代生活融入了人们的日常。现代文明打着继承传统的名义,意图将传统的味道演绎得淋漓尽致。

推陈出新的想法固然可贵,但当你发现咖啡厅里20多块一碗的冰粉寡淡无味,远没有老街小摊上5元一碗来得好吃的时候。就会发现,传统的味道还是需要一定手艺的积淀。

也许是心理原因在作祟,旧情怀总在犯矫情,觉得老底子的味道应该在青砖瓦房小巷这样的意境里才能将味道演绎得近乎完美。

繁华的新城没有那份记忆,自然少了一份味道。

想起沉重的高三时期,每天最宝贵的就是下午放学后的一小时。而我总喜欢在河滨路点一碗脆哨粉。莹白带绿的小葱,汆熟的土豆丝,香酥可口的脆哨,酥脆的花生米和必不可少的红油,食醋酱油的酸咸点缀下,简单的晚餐也可以造就一份独特的味道。饭后买一杯珍珠奶茶,一颗一颗咬破珍珠的小游戏,竟也玩得不亦乐乎,面对即将到来的晚自习,也不觉抵触和疲惫,才明白“热爱食物是热爱生活的开始”这句话的深切寓意。

脆哨粉

当我们用味蕾去邂逅并解读每一种简单食物蕴藏的味道时,说明我们热爱着生活,懂得享受生活的惊喜。

懂得发现生命中的惊喜,也就懂得了人生,懂得发现其中的小幸福,平淡的生活也活得有滋有味。

后来我明白,快乐的源泉是纯真。老城让人割舍不下的,大约就是纯真年代里幸福的时光。

时间把彼时的快乐酿成甘醇清冽的美酒,岁月也让美酒在温度里蒸腾然后渐渐消失,于是在承载着快乐记忆的老城即将湮灭的时候,怀旧情感便如火山爆发一般一发不可收拾。

大约是我们隐隐明白,成长后的我们不会再有懵懂的快乐。那份单纯,随逝去的老城一起,消失在被推倒的灰尘瓦砾之中。但是曾经的记忆,我会好好封存在脑海里,不定时去回味,让旧有的记忆永远鲜活在身体里,诉说我逝去的昔年光影。

总有一些风景和记忆,只能活在过往里。

为了心中那一抹「蓝」

离开果戈里书屋,没走几步路我就找到了位于居民楼内的一凡的工作室,那种感觉很奇妙,仿佛穿过时空隧道,忽然间从一个车水马龙的国度走到一个清静安宁的所在。

这是一凡为何会选择它作为工作室的出发点之一。

这种对「清静」的追求,我从一凡的刺绣或者是扎染的用色上,也可见一斑——她偏爱浓淡相宜,深深浅浅的蓝色。

画框里模仿崔西女士的欧式花鸟画的蓝色羽毛的小鸟、低温却澄明的银光上精细小巧的蓝色荷花、以荷叶荷花为特色的蓝色手帕,或者是茶具,比比皆是。

眼神凝住在上面,感到舒服惬意,不张扬不喧哗,不浮夸,有缓缓入梦的错觉,用手轻轻抚摸,有温良的质感。

「蓝色、荷叶、荷花」是破解一凡的精神密码的一串钥匙。

一种色彩能够象征一种性格,红色代表昂扬热烈,黑色代表含蓄深沉,蓝色代表的,或许就是一种淡泊沉静。

提起「荷叶、荷花」瞬间便想到了唐诗,想到了江南,想到了周敦颐的词,想到了佛,想到了莫奈的花园,心里便浮起静谧,浅淡,悠远,清静的情愫。

这三样事物,又恰恰好是我极其喜欢的,所以冥冥中,我心里产生了某种亲切的感情,仿佛是山水之外,遇见知己。

我方在想,这个生活在北方都市的女子,莫不是有一颗烟雨江南的灵魂,谁知她告诉我,她曾经南下苏州进修过一段时间,学习苏绣,瞬间被苏绣的精致细腻震撼打动,也进而影响了后来,她自己的手工创作。

我问她如何与刺绣结下不解之缘,她告诉我,她从小就很喜欢做手工,五岁的时候,就爱上了织毛衣,本来是一个生龙活虎,男孩儿气的女孩子,只要给她一团毛线,两只织针,她就能一坐一下午。

后来,小小年纪的她参加过许多次手工比赛,用绣出来的一朵花,一个小背包征服了众人,屡屡斩获佳绩,在收获成就感的同时,她对布艺的痴心与热爱其实也越来越深。

许多年后,回忆起这些小细节,她的脸上依然荡漾着感人的欣慰和愉悦的神采,作为一个观众的我,都不觉为之与有荣焉。

后来因为学业,她暂时搁置了自己内心的热爱。踏入社会以后,她陆陆续续涉足过不同的行业,但是没有一份工作真正的让她感到身心畅快,愉悦自在。

与其给别人打工,看别人脸色,为什么不给自己打工,自给自足?

正是怀着这样的念想,一凡离开了从前的生活,独自一人,瞒着家里学起了扎染和刺绣,其实对于从小就「心灵手巧」的她来说,这也不过是一段不断精进的过程。

她的母亲对此抱以不解的态度,第一是她不能够欣赏,认为这样的产品,这样的价格,她无法接受,时间放在这些东西上面,是一种奢侈浪费,第二是她不能够理解,传统的观点认为,只有一份安安稳稳,朝九晚五,日出而作日落而息的工作才算是「好好过日子」。

除此之外,一凡的丈夫也并非百分百赞同,但是作为家庭的重要一份子,作为一个女人的坚强后盾,他选择理解与包容。

来自家人的反对,这还只是压力的一个来源,另一个是来自每个人都不得不去屈尊俯就,忍气吞声从容应对的生活。

开设一家独立的工作室,她不得不面临租金的问题,为了顺应自己的性情,她不愿意假手于人,所以店里大大小小的布艺作品,大多都是她独立完成,一件手工艺作品的完成,往往需要大几个小时的时间,她的作品输出有限,卖出去的成品更加有限,用这有限的所得去供养一座工作室,供养她自己的生活,其实是拮据而捉襟见肘的。

而且,作品的出手也经常面临十分尴尬的处境——制作者自己珍惜耗费的光阴和心血,价格不可能定得太低,太高的话自然「曲高和寡」,然而手工艺者自身觉着高不成低不就的价格落在许多消费者眼中,依然是物不抵所值,他们想要的是物美价廉的产品,这也无可厚非,但是如果一意孤行,不知适当地换位思考,这里面就存在着某种价值的断层。

其实这也是大多数手工艺者们共同的生存困境——为了寻找一种更加符合自己心意的生活方式,抛弃了四平八稳,五险一金的工作,但是自给自足,自主创业也并非一蹴而就,行云流水的事情,这其中夹杂着重重叠叠,不为人知的苦辛。

尽管面临的是种种压力,一凡却并未泄气,她说,因为热爱,所以愿意坚持。

她的工作室也在向更好的态势发展,新的工作室即将圆满成立,届时一凡会设置专门的体验课以及手作小伙伴的课,一方面给其他手工艺人们一个展示自我的舞台,另一方面也给了对手作感兴趣的人一个学习的平台。

她也将新的计划纳入日程,就是制作出更多针对幼儿的布艺作品——肚兜,小被儿之类的东西。

离开一凡工作室的时候,阳光依然明媚地盛放,我相信,在未知的前途,她能够攻坚克难,一步一步,经营好属于自己的布艺人生。

贪吃日记:八月早餐合集

假期最后的早餐

梁实秋先生说:“美食者不必是饕餮客”,一言以蔽之:美食重在质,而非量。明天要回学校了,看到相册里的早餐图,或许比不了美食博主的手艺,但是还是想和大家分享一下~

我属于自由的灵魂,说着要减肥,但是有时候吃的并不是低脂食物,抵抗不了诱惑哇,毕竟吃肉的感觉超幸福的,嘿嘿。开始啦~

三明治君~一口咬下去可以吃到火腿+芝士+黄瓜+胡萝卜,大满足~而且煎蛋易作,懒人福音,哈哈

蒸茄子+秋葵,低热量,放少量调味品就可以啦,不会吃起来很腻。凉拌的话也超棒,加入小米椒和香醋,不说了要流口水了,出去吃饭也必点茄子,哈哈。

看着这盘早餐,莫名想唱“一闪一闪亮晶晶”。。

水煮蛋+土司+秋葵,很清淡的一款早餐,适合减脂期间的你哦,而且唯一需要花点时间的就只有煮鸡蛋和秋葵,也是一款快手早餐~推荐

莲蓉蛋黄夹心饼+蒸茄子。这是好朋友来的时候一起吃的早餐,她喜欢吃莲蓉,所以还特地跑了好远买的,为了吃,拼尽全力啦

这是最偷懒的一款早餐了,是用了市场买来的薄饼,直接卷了炒过的黄瓜丝和胡萝卜丝,再加番茄酱夹心土司,哈哈。果然不能偷懒,不然颜色就会不太好看啦,反思ing。。。

烤面包片+煎火腿片+什锦鸡蛋碎,颜色还是可以的吧,除了火腿煎的时间短了,没有煎出来特别香的味道,所以颜色也差了一点。

燕麦酸奶~七夕小福利,嘿嘿

自制煎馍片+鸡蛋碎+水蜜桃片+黄瓜条+小番茄+爱心火腿片~现在看着才发现内容好丰富,嘿嘿

超爱的秋葵君,水煮加盐就觉得很好吃,火腿片这次煎的时间足够了,超级香哦。

豆腐豆腐!我的一枚真爱,而且热量低~煎的过程中加入少量盐和孜然粉,味道不熟外面做的豆腐呢,哈哈

今天早上的主食是紫薯夹心三明治+炒鸡蛋+黄瓜胡萝卜+小番茄,不得不说,颜色很不错哦(允许自恋一下,哈哈)

秋葵炒鸡胸肉丁+紫薯球,七夕的午餐~之前一篇文章写过哒,现在看到又想吃了,可是并不可以了,只能等寒假啦,等着我,我一定会回来的$_$

酸奶+紫薯泥,心有所属~七夕节给自己的安慰早餐,吃完瞬间被治愈^o^不需要加糖的紫薯泥+酸奶,不怕长胖,嘿嘿

突然咽口水……生菜丝+煎蛋+香煎鸡胸肉+黄瓜和小番茄。自己居然被食物颜色征服了。。。

除了这一盘子呀,另外还吃了一片土司,味道好到停不下来,哈哈

香菇青菜+馍片+鸡蛋+羊角瓜,简单日常的一款早餐,青菜香菇也都是我的心头爱呢,于是就有了下面一款早餐:

内容很像吧,但是我是忍着到第二天才做来吃的,毕竟要减肥,要瘦瘦瘦哇~~

紫薯+水煮蛋+鸡肉丁+黄瓜+蒸胡萝卜+番茄,仿佛那一天胃口特别大,两个紫薯块我都给吃完了,呜,罪过(但是可以满足胃的需求,也很开心啊,哈哈)

全麦杂粮土司(超市采购回来的特产,味道超好)+秋葵+鸡肉+黄瓜+鸡蛋+胡萝卜,或许这款早餐叫“众星拱月”?$_$

全麦面包+香菇青菜+火腿+黄瓜胡萝卜,吃过又收获满满的元气~

全麦三明治+黑布林+黄瓜胡萝卜~最后一片芝士在三明治中被消灭,默默心疼一秒,然后继续吃吃吃,哈哈,因为好吃停不下来~

全麦土司+什锦鸡蛋碎+黑布林+胡萝卜黄瓜。杂粮全麦土司中间部分也有南瓜瓜子仁,意外之喜,真的超好吃,下次回去还要再去买买买~

紫薯片+火腿+黄瓜胡萝卜片+水蜜桃味QQ糖,也是一份心爱的早餐啊,又开始期待假期,可以回去自己动手丰衣足食。。。但是才开学啊,要忍住忍住

蔬果碗集合~番茄+黄瓜+胡萝卜是常客,有时候也会加入其他的,比如黑布林、葡萄、羊角瓜,下午可以吃到一碗蔬果拼,幸福感爆棚~没错,吃货就是这么容易满足,哈哈

点击有惊喜哦

以一张神奇的拼图结束分享咯,我知道在吃吃吃的道路上有很多小伙伴都在勇往直前,但是在贪吃的时候也要注意合理分配卡路里哦。

我们的目标是:贪吃却不胖!T^T

享受美食的时间是快乐的,但是等待美食出炉的时间是最快乐的。所以爱吃就开始动手吧~

(小问答:大家说标题里两个“好”字怎么读? ( ˙-˙ ))

妈咪,我要嫁给你(1)

“菏泽到了,有下车旅客的抓紧时间准备一下。来,让一让。菏泽到了……”

嘈杂和闷热企图撑开我的睡眼,迷离之中,我看到一个三十出头的乘务员从我身旁挪过,旺盛的皮脂腺分泌物从他脸上的毛孔中溢出。他小心翼翼地穿梭在人潮涌动的车厢,不知是怕踩到过道儿里熟睡的乘客,还是怕脸上的油花摔到地上。

“阿蔡,醒醒吧,别睡了。”屁股嵌在座位里的老温摘下眼镜,朝着鼻托吹了口气,奇迹般的变出一只小虫儿。

“呦,什么时候学的这招?”我揉了下惺忪的睡眼,站起来伸了个懒腰。

“这是秘密。黑夜给了我们黑色的眼睛,而你却用来投降,委实佩服。”戴上眼镜的老温冲我嗤笑了一声,抚弄起他那头秀发来。

笑而不语的我拿起了餐桌上的杯子,轻轻地拧开了盖子,缓缓放到了嘴边。

从沈阳北——西安的k2045列车沉重地喘着粗气,像一头刚做完噩梦的老牛,在黑暗的世界里疲惫的醒来,静静地看着这个乱成一锅粥的世界。

坐在我身旁的妙龄少女抬起了被修身牛仔紧裹的臀部,纤细白嫩的玉手熟练地从鬓角延伸到后脑勺,紧接着优美的淡黄色波浪夹着香气扫过我的鼻尖。我低垂的眼睑刹那间似乎要跳上眉毛,再也盖不住不安分的眸子,任它流露着垂涎,从妙龄少女脚下的银白色百丽开始,一直延伸并定格到她胸前的两座高耸。

“看什么看,人家睡会觉都睡不踏实。”妙龄少女临走前用眼睛剜了我一眼,恶狠狠地说道,同时也惊扰了我为自己编织的梦。

“噗,看什么看,人家睡会觉都睡不踏实。”坐在我对面的老温已笑的蜷缩起了身子。

“老温,她说这话什么意思?这个人是什么时候上的车?”一脸懵逼的我踢了老温一脚,望着妙龄少女远去的背影舔了舔嘴唇。

“逗逼,笑死我了。”

无语的我轻咽了下唾液,放到餐桌上的右手不小心打翻了水杯。

“你真不知道铁钉什么时候上的车吗?”片刻,老温用无名指扫了下眼角,涨红着脸开了口。

“铁钉?”

“就是刚才勾起你欲火的那个姑娘。”老温一本正经道。

“欲火?明明是怒火好不好,你看看她……”老温的揶揄换了我一个鄙视的眼神。

“欲盖弥彰。不过这姑娘真仗义。”

“你们两个认识?是不是还有故事?”我换了个姿势,瘫在座位上,打趣道。

“认识啊。”老温抽搐了下鼻子,傲娇下掩盖不住的是风骚。

“认识多久了?”

“大概两个小时左右吧。”

“那个女的在聊城上的车?”瘫在座位上的我近乎跳了起来,目瞪口呆地盯着正襟危坐的老温。

“你不傻。”老温冲我淡淡笑了一下。

“两个小时就……就认识了?”

“张铁钉,26岁,北京某刊物知名撰稿人。六点左右的时候还在天津塘沽陪男朋友,正打算吃饭的时候接了个失恋朋友的电话,随即上了火车……”

我被一股力量徐徐拉回到座位,老温下巴上的毛囊在稀疏挺立的胡子下、在我的视线里,慢慢消失。

“你当真不知道那姑娘什么时候上的车?”老温翘起二郎腿,浓郁的腿毛从小腿一直蔓延到黑色大裤衩里。

“嗯?真不知道。”我摇了摇头,脑海里挥不去的是两座高耸。

“二新,我真服了你。你的睡眠质量、体重甚至智商,想必真和你老祖宗的遗传有关。”

我点点头,倏地又觉得不对劲,双目怒视着老温。

“唉,真替张铁钉感到不甘啊,一副年轻香滑的肩膀,愣是让一头留着哈喇子的呆猪靠了一路,推都推不开,叫也叫不醒。”说罢,老温啧啧起来。

炙热的座位开始烘烤我的身体,沸腾的血液在血管里翻滚,冲进我的大脑,然后从我还算白嫩的脸上流出。我的心猛地咯噔了一下,一个熟悉又陌生的人将它推开,温柔地亲吻、舔舐、调弄、撕咬。

“够了。”我大声喝道。

“你丫有病吧!”老温一掌拍在我的肩膀,然后侧身从餐桌上的纸抽里抽出两张餐巾纸,在裤裆附近反复摩擦起来。

“对……对不起啊老温,我来帮你。”从思绪中抽离回来的我来不及去看周围乘客惊愕的目光,慌忙从纸抽里抽出两张餐巾纸。

“停,你要干嘛?坐回去。”老温一把推开我那向他靠近的手臂,双腿慌忙拢在一起。

“不好意思啊老温,我刚才做了个噩梦。”

“梦到个母的吧?”老温说着,将一团湿润的餐巾纸丢进餐桌上的垃圾袋。

“嗯,不,你乱说什么啊。”昏暗中,我咒骂着自己。往昔的泪海再次于内心的伤口处涨潮,冲刷起无尽的猩红,我的脑袋里恍若一团浆糊,克制的思绪被一阵轻风拂过,搅揉成一个人形。

“是不是你自己心里清楚。”老温掸了下裤裆附近的白色纸沫,直勾勾地看着我,他的眼睛仿若能洞察一切。

“菏泽到了,有下车的旅客抓紧时间下车。列车马上要起动了,请大家抓紧时间。菏泽到了…”恰逢此时,原路返回的中年乘务员走到我们身旁。

“温兄,十分钟后,老地方见。”乘务员揩了一把脸上的皮脂腺分泌物,真诚地看着老温。

“好的小安,十分钟后,老地方见。”老温向对方投以笑意。

“这个小安不会也是刚认识两个小时左右吧?”我呷了口水,瞥了眼窗外的昏暗,扯开了话题。

“不是,认识他两年多了,那次大概是去洛阳,我们聊了很久。”老温说的那么自然。

“乘务员这工作够辛苦的。”

“是的,但终归要有人做这份工作。他觉得还行吧,只是不想让他的老婆做这个了。”

“他老婆也是乘务员?”显然,我有些惊讶,但我说不清楚是为什么。

“他老婆也在这趟列车上。”老温再次抽搐了下鼻子。

“挺幸福的。”老温的话像一阵轻风,吹起我一些思绪的片段。

“由于长期的生物钟紊乱,小安的第二个孩子刚刚成型,就先兆性流产了。”讲到这儿,老温叹了口气。

“底层老百姓都不容易。”听了老温的话,我瞬间对那个满脸皮脂腺分泌物的中年男子,对,小安,有了好感。“他说的老地方是哪?”

“在他们休息区的厕所和车厢的接头处。你可以一起去,小安的媳妇老周是西安人,做的糯藕酥好吃的一逼,每次在他们上车前一天,老周都会做一些带着。”老温眯着眼,一脸陶醉。

“糯藕酥?是不是藕去两头节,藕孔中填塞糯米,煨酥然后切片,还可以蘸着白糖吃?”

“想不到你还是见过一些世面的嘛!”

web学习笔记13-移动端搜索框提示功能

    最近项目一直在迭代更新,说忙也不算忙,说不忙也还挺忙的,没有什么新的东西做,所以拿出来一个搜索的小模块分享下,功能就是输入关键字能出来相关字的联想吧,删除一些字的时候顺带可以保存上一段的联想,从外观上来看,效果还罢了,这里分享给大家,可以供大家看看。最近也在初步学习nodejs的基础,虽然之前写过node相关的,但是现在再看这些,感觉有点懵。不过这些以后再写文说吧。

    搜索功能效果图如下,github链接在此search_demo

9月-05-2017 16-32-02.gif

按照老规矩,下面就直接写编写过程了

第一步:创建文件

    创建相应的html,js,css文件,引入jquery。

图片.png

第二步:引入文件,设置meta,编写html以及样式

html:

<!DOCTYPE html> <html lang="en"> <head>     <!--通用媒体查询-->     <meta charset="UTF-8" />     <meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0,minimum-scale=1, maximum-scale=1" />     <link rel="stylesheet" href="search.css">     <title>搜索</title> </head> <body> <div class="search_nav">     <input type="search" class="search_input searchProduct" placeholder="查找您需要的商品">     <div class="search_cancel">取消</div> </div> <div class="search_find">     <div class="search_history">         历史搜索     </div>     <div class="search_find_line">        <!--搜索结果和搜索历史-->     </div> </div>  <script src="jquery.js"></script> <script src="search.js" type="application/javascript"></script> </body> </html> 

css:

 *{     margin: 0;     padding: 0; } body{     background-color: #f5f5f9; } .search_nav{     width: 100%;     height: 45px;     position: fixed;     top:0;     left: 0;     background-color: #20232b; } .search_input{     float: left;     width: 75%;     height: 35px;     margin-left: 30px;     margin-top: 5px;     font-size: 15px;     text-indent: 30px;     /*border: none;*/     border: 1px solid black;     border-radius: 40px;     outline: none; } input::-webkit-search-cancel-button {display: none;} .search_cancel{     float: right;     width: 15%;     height: 100%;     color:white;     text-align: center;     line-height: 45px;     /*background-color: lightblue;*/ } .search_find{     background:#fff;     line-height:42px;     margin-top: 45px; } .search_history{     padding-left:10px;     font-weight:700;     font-size:16px } .search_find_title{     display:block;     /*margin-top: 45px;*/     position:relative;     padding-left:15px;     padding-right:10px;     font-size:14px;     color:#8a8a8a;     width:100%;     box-sizing:border-box } .search_find_title:after{     content:'';     position:absolute;     top:0;     left:15px;     box-sizing:border-box;     width:92%;     height:1px;     color:#ddd;     border-bottom:1px solid #ddd;     -webkit-transform-origin:0 0;     transform-origin:0 0;     -webkit-transform:scaleY(.4);     transform:scaleY(.4) }   

    当然了,这里面的样式格局什么的在自己实际项目中需要根据自己的项目来调整,不需要跟我这写的一样,重要的是逻辑部分。

第三步:编写js逻辑

    一般情况下,我们在进入搜索页面的时候,大多数会出现历史搜索,也就是搜索记录,我们首先需要的就是进行历史搜索的渲染,我这里历史搜索都是用localStorage进行存储,大家根据需要可以进行对应的存储或者获取。

var history_search = [];//存储历史搜索数据  //获取历史搜索数据,若没有则为空 if(localStorage.getItem("history_search")){     history_search = JSON.parse(localStorage.getItem("history_search"));//获取历史搜索数据 }else{     history_search = []; } 

    接下来在获取了历史记录的前提下,我们要把历史记录渲染到页面上

//渲染历史记录 function setpage(){     var product_list = '';     //动态添加元素至页面上     if(history_search.length != 0){         $(".search_history").show();         if(history_search.length >= 10){             for(var i = 0; i < 10 ;i++){                 product_list = '<a class="search_find_title">'+history_search[i]+'</a>';                 $(".search_find_line").append(product_list);             }         }else{             for(var i = 0; i < history_search.length;i++){                 product_list = '<a class="search_find_title">'+history_search[i]+'</a>';                 $(".search_find_line").append(product_list);             }         }     }else{         $(".search_history").hide();     } } setpage(); 

    这里我们需要注意的是,一般的历史记录不会是太多的,一般会显示前十条最近搜索的,我这边在渲染的时候做了截取,其实在存的时候就应该去做判断,在超出10条或者规定条数的时候我们只保存十条或者规定条数,然后在渲染的时候就不需要再去截取了。

    接下来需要做的处理就是在输入关键字的时候,一些请求和缓存搜索出来的提示数据

var obj_arr = [];//请求结果 var timeout = 0; var keyName = '';//搜索关键字 var ajaxCache = {};//定义缓存对象(保存请求出来的数据) 

    这里我先把另外两个方法先提出来先写了,一个是渲染页面的方法,一个是判断字符串是否为空的方法,这两个方法在接下来的逻辑中需要调用。

//渲染页面方法 function setListPage(obj,no){     console.log(obj);     console.log(no);     ajaxCache = {};     obj_arr = obj;     $(".search_find_line").empty();     if(no == 1){         $(".search_history").hide();     }else{         $(".search_history").show();     }      var search_res = '';     for(var i = 0; i < obj.length;i++){         search_res = '<a class="search_find_title">'+obj[i]+'</a>';         $(".search_find_line").append(search_res);     } }  //判断字符串是不是为空 function isNull( str ){     if ( str == "" ) return true;     var regu = "^[ ]+$";     var re = new RegExp(regu);     return re.test(str); } 

    这里就是最重要的一部分了。

//当按钮被松开时,触发事件 $('.searchProduct').keyup(function(evt){ //获取到关键字     keyName = $(this).val(); //判断关键字是否为空     if(isNull(keyName) == false || keyName != ''){         //若输入字符串不为空,则显示网络请求搜索。         clearTimeout(timeout);         timeout = setTimeout(function(){             if(!!ajaxCache[keyName]){                 //显示自动提示框,给框里填关联词条的内容                 setListPage(ajaxCache[keyName],1);                 ajaxCache = {};             }else{                 var sendData = {                     "keyName":keyName                 };                  $.ajax({                     type: "POST",                     url: url,//我们自个的接口没法公开,大
家可以用自己的。                     data:JSON.stringify(sendData),                     dataType: 'json',                     success: function (data) {                         console.log(data);                         if(data){                             if(data.data){                                 //显示自动提示框,给框里填关联词条的内容                                 ajaxCache[keyName]=[];                                 ajaxCache[keyName]=data.data;//给缓存对象赋值                                 setListPage(data.data,1);                             }                         }                     },                     error: function (err) {                         console.log(err);                     }                 });             }         },200);     }else{         //若输入字符串为空,则显示历史搜索。         ajaxCache = {};         if(history_search.length == 0){             //若数组为空,历史搜索不显示             $(".search_history").hide();         }else{             $(".search_history").show();             setListPage(history_search,2)         }     } //手机端按下右下角的搜索按钮的时候触发事件    if (evt.keyCode == 13) {         localStorage.setItem('search_keyName',keyName);         var count = 0;         //判断历史搜索中是否已经存在当前搜索的关键字         for(var j = 0; j < history_search.length;j++){             if(keyName == history_search[j]){                 count += 1;             }else{                 count += 0;             }         }         //如果没有,则添加进历史搜索         if(count == 0){             history_search.unshift(keyName);         }         //这边缺少的处理是历史搜索排序的问题。         localStorage.setItem("history_search",JSON.stringify(history_search));         window.location.href="";//跳转到搜索结果页之类的页面     } 

    这就基本完成了,这里没有加一个搜索结果页,在出现提示搜索的时候,应该在<a class="search_find_title"></a>上添加点击事件,以跳转到搜索结果页之类的,这边可以根据自己的需求来处理。
    这上面的流程基本上就能编写出移动端搜索功能,要是有什么问题可以留言探讨。

Apache CVE-2017-7659漏洞重现及利用分析

近日,apache在其网站发布了最新的安全公告,其中涉及多个漏洞。针对CVE-2017-7659漏洞的介绍是这样的:

A maliciously constructedHTTP/2 request could cause mod_http2 to dereference a NULL pointer and crashthe server process.

可以看到这是apache WEB服务器(httpd)中的一个HTTP 2.0协议处理的漏洞。未然实验室安全研究人员针对此漏洞的技术细节和利用方法进行了深入的研究,欢迎安全爱好者们一起分享和讨论。

0×01补丁分析

在redhat的bugzilla上可以找到该漏洞:

https://bugzilla.redhat.com/show_bug.cgi?id=1463199

在github上有对该漏洞的修复提交:

https://github.com/apache/httpd/commit/672187c168b94b562d8065e08e2cad5b00cdd0e3

修改前后的代码差异比较如下:

可以看到,修复内容很简单,就是增加了对h2_request_rcreate函数返回值的判断。官方推荐升级到2.4.26修复漏洞。

0×02漏洞成因

https://archive.apache.org/dist/httpd/httpd-2.4.25.tar.gz下载到有漏洞的服务器代码后,通过补丁的修改进行漏洞成因的逆向分析。

首先查看漏洞函数h2_stream_set_request_rec,发现是调用h2_request_rcreat创建http 2.0请求的数据结构req,h2_request_rcreat执行失败时req为空,此时在日志函数ap_log_rerror中直接解引用req导致进程崩溃:

继续查看函数h2_request_rcreate,看到首先会把req置为0,然后判断4个变量r->method,scheme,r->hostname,path,任何一个为空则返回失败,而此时req还是0,就会导致进程崩溃:

那么这4个变量是哪一个为空导致的漏洞呢?scheme是先判断了是否为空再赋值的,首先排除;path是从r->parsed_uri中解析出来,解析函数apr_uri_unparse在其它地方有多次使用,直觉path也不会为空;r->method保存请求的方法字段,在HTTP请求中必须存在,因此也不应该为空;因此只有r->hostname,保存请求的主机名,也就是域名,可能为空。

我们知道,HTTP请求中,有2个地方可以表示主机名:

1) 请求的路径以完整URL方式表示,URL中包含主机名,例如GET http://www.example.com/ HTTP/1.1,这里主机名就是 www.example.com。服务器中是在ap_parse_uri函数中解析这种主机名的

2) 在Host请求头中包含主机名,例如:

GET / HTTP/1.1

Host: www.example.com

服务器中是在fix_hostname函数中解析这种主机名的

分别审计ap_parse_uri和fix_hostname函数,发现如果请求中没有Host头,那么r->hostname确实是空。但是服务器也考虑到了这种情况,在ap_read_request函数中做了判断:

这里的判断逻辑,如果满足下面2个条件之一

1) r->hostname为空,且请求的HTTP版本大于等于1.1

2) 没有Host头,且请求的HTTP版本等于1.1

就会立刻回复400状态码的错误页面,并不会触发后面的漏洞。在注释里也说明了,HTTP/1.1的RFC2616的14.23节中明确指明,HTTP/1.1请求必须包含Host头。

但是,开发者是不是忘了什么,HTTP还有1.0版本啊,且HTTP/1.0和HTTP/1.1的处理流程一样,虽然HTTP/1.0确实没有规定请求必须包含Host头。因此HTTP/1.0请求是可以没有Host头的,程序会一直按照流程执行,最终执行到h2_stream_set_request_rec函数,此时r->hostname为空,从而触发漏洞。

0×03漏洞验证及漏洞利用

综合上面的分析,该漏洞利用成功需要如下条件:

1) 服务器支持HTTP/2

2) 请求是HTTP/1.0版本

3) 请求中没有Host头

服务器配置

在server上要配置开启HTTP/2功能,使用apache默认的站点配置,在配置文件中首先加载mod_http2.so:

然后加入下面配置,重新启动apache httpd就可以了:

验证POC

验证时,我们首先起一个单一进程的apache httpd服务,方便验证进程崩溃后的效果:

正常访问,返回欢迎页面:

将构造的POC通过burpsuite发送:

果然超时没有响应,同时在服务器上发现httpd进程已经崩溃:

再次访问服务器时,页面已经无法访问了:

漏洞利用

在上一节,我们已经验证了在单一进程模式下,如何通过该漏洞导致apache服务器异常终止。但是通常情况下apache服务器在启动时,会同时启动多个工作进程:

而且当worker进程崩溃时,apache会自动启动新的worker进程。那么在真实的网络环境中,黑客会如何利用此漏洞对服务器进行攻击呢?

我们尝试编写了一个多线程(并发100个线程)的程序,同时发起多个畸形请求,以不断触发后台worker崩溃,并让apache服务器不断陷入重新分配worker的处理之中:

执行脚本时,发起的请求:

请求发起后,我们发现,并不需要特别的并发连接,便可以让服务器进入拒绝服务状态:

0×04 漏洞影响

在apache的漏洞公告中,只有2.4.25版本的httpd服务器受此漏洞影响。但是根据未然实验室的测试,从2.4.17开始的所有版本的httpd服务器,受到这段POC攻击时都会崩溃,而httpd也是从2.4.17版本开始支持HTTP 2.0协议的。因此可以说这个漏洞会影响httpd的所有支持HTTP 2.0的版本,未然实验室强烈建议用户更新到最新的2.4.26版本。

2.4.25之前的版本代码与2.4.25版本不尽相同,以2.4.17为例,在h2_request_rwrite函数中:

收到攻击POC后,r->hostname为空,因此req->authority也为空,而ap_strchr_c其实通过下面的宏进行定义的:

因此在上面的函数中,调用strchr的第一个参数为空,此时会导致进程崩溃。

0×05总结

apache在其HTTP Server 2.4.26版本修复了多个漏洞,业界普遍认为这些漏洞比较鸡肋,难以利用。未然实验室挑选其中个别漏洞进行了深入的分析和利用尝试,发现其中有些漏洞其实影响还是很大,尤其是对于一些高价值站点。

本文讨论的部分方法可能会造成目标网站拒绝服务,影响目标网站的业务正常运行,所以请勿对真实目标进行尝试,否则由此引起的一切后果未然实验室概不负责。

水平所限,文章内容难免有不足之处,欢迎大家指正。您可通过未然实验室公共邮箱weiran.labs@huawei.com或关注我们的微信公众号“WeiRanLabs”与我们联系,期待与各位专家交流。

*