Python爬蟲(chóng)—破解JS加密的Cookie

作者:Jerry

鏈接:https://zhuanlan.zhihu.com/p/25957793

來(lái)源:知乎

著作權(quán)歸作者所有拱撵,轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)株灸。

前言

在GitHub上維護(hù)了一個(gè)代理池的項(xiàng)目,代理來(lái)源是抓取一些免費(fèi)的代理發(fā)布網(wǎng)站芦劣。上午有個(gè)小哥告訴我說(shuō)有個(gè)代理抓取接口不能用了,返回狀態(tài)521。抱著幫人解決問(wèn)題的心態(tài)去跑了一遍代碼特咆。發(fā)現(xiàn)果真是這樣。

通過(guò)Fiddler抓包比較录粱,基本可以確定是JavaScript生成加密Cookie導(dǎo)致原來(lái)的請(qǐng)求返回521腻格。

發(fā)現(xiàn)問(wèn)題

打開(kāi)Fiddler軟件,用瀏覽器打開(kāi)目標(biāo)站點(diǎn)(http://www.kuaidaili.com/proxylist/2/) 啥繁〔酥埃可以發(fā)現(xiàn)瀏覽器對(duì)這個(gè)頁(yè)面加載了兩次,第一次返回521旗闽,第二次才正常返回?cái)?shù)據(jù)酬核。很多沒(méi)有寫過(guò)網(wǎng)站或是爬蟲(chóng)經(jīng)驗(yàn)不足的童鞋,可能就會(huì)覺(jué)得奇怪為什么會(huì)這樣适室?為什么瀏覽器可能正常返回?cái)?shù)據(jù)而代碼卻不行嫡意?

仔細(xì)觀察兩次返回的結(jié)果可以發(fā)現(xiàn):

1、第二次請(qǐng)求比第一次請(qǐng)求的Cookie內(nèi)容多了個(gè)這個(gè)_ydclearance=0c316df6ea04c5281b421aa8-5570-47ae-9768-2510d9fe9107-1490254971

2捣辆、第一次返回的內(nèi)容一些復(fù)雜看不懂的JS代碼蔬螟,第二次返回的就是正確的內(nèi)容

其實(shí)這是網(wǎng)站反爬蟲(chóng)的常用手段。大致過(guò)程是這樣的:首次請(qǐng)求數(shù)據(jù)時(shí)汽畴,服務(wù)端返回動(dòng)態(tài)的混淆加密過(guò)的JS旧巾,而這段JS的作用是給Cookie添加新的內(nèi)容用于服務(wù)端驗(yàn)證,此時(shí)返回的狀態(tài)碼是521忍些。瀏覽器帶上新的Cookie再次請(qǐng)求鲁猩,服務(wù)端驗(yàn)證Cookie通過(guò)返回?cái)?shù)據(jù)(這也是為嘛代碼不能返回?cái)?shù)據(jù)的原因)。

解決問(wèn)題

其實(shí)我第一次遇到這樣的問(wèn)題是坐昙,一開(kāi)始想的就是既然你是用JS生成的Cookie, 那么我也可以將JS函數(shù)翻譯成Python運(yùn)行绳匀。但是最后還是發(fā)現(xiàn)我太傻太天真,因?yàn)楝F(xiàn)在的JS都流行混淆加密炸客,原始的JS這樣的:

function lq(VA) {? ? var qo, mo = "", no = "", oo = [0x8c, 0xcd, 0x4c, 0xf9, 0xd7, 0x4d, 0x25, 0xba, 0x3c, 0x16, 0x96, 0x44, 0x8d, 0x0b, 0x90, 0x1e, 0xa3, 0x39, 0xc9, 0x86, 0x23, 0x61, 0x2f, 0xc8, 0x30, 0xdd, 0x57, 0xec, 0x92, 0x84, 0xc4, 0x6a, 0xeb, 0x99, 0x37, 0xeb, 0x25, 0x0e, 0xbb, 0xb0, 0x95, 0x76, 0x45, 0xde, 0x80, 0x59, 0xf6, 0x9c, 0x58, 0x39, 0x12, 0xc7, 0x9c, 0x8d, 0x18, 0xe0, 0xc5, 0x77, 0x50, 0x39, 0x01, 0xed, 0x93, 0x39, 0x02, 0x7e, 0x72, 0x4f, 0x24, 0x01, 0xe9, 0x66, 0x75, 0x4e, 0x2b, 0xd8, 0x6e, 0xe2, 0xfa, 0xc7, 0xa4, 0x85, 0x4e, 0xc2, 0xa5, 0x96, 0x6b, 0x58, 0x39, 0xd2, 0x7f, 0x44, 0xe5, 0x7b, 0x48, 0x2d, 0xf6, 0xdf, 0xbc, 0x31, 0x1e, 0xf6, 0xbf, 0x84, 0x6d, 0x5e, 0x33, 0x0c, 0x97, 0x5c, 0x39, 0x26, 0xf2, 0x9b, 0x77, 0x0d, 0xd6, 0xc0, 0x46, 0x38, 0x5f, 0xf4, 0xe2, 0x9f, 0xf1, 0x7b, 0xe8, 0xbe, 0x37, 0xdf, 0xd0, 0xbd, 0xb9, 0x36, 0x2c, 0xd1, 0xc3, 0x40, 0xe7, 0xcc, 0xa9, 0x52, 0x3b, 0x20, 0x40, 0x09, 0xe1, 0xd2, 0xa3, 0x80, 0x25, 0x0a, 0xb2, 0xd8, 0xce, 0x21, 0x69, 0x3e, 0xe6, 0x80, 0xfd, 0x73, 0xab, 0x51, 0xde, 0x60, 0x15, 0x95, 0x07, 0x94, 0x6a, 0x18, 0x9d, 0x37, 0x31, 0xde, 0x64, 0xdd, 0x63, 0xe3, 0x57, 0x05, 0x82, 0xff, 0xcc, 0x75, 0x79, 0x63, 0x09, 0xe2, 0x6c, 0x21, 0x5c, 0xe0, 0x7d, 0x4a, 0xf2, 0xd8, 0x9c, 0x22, 0xa3, 0x3d, 0xba, 0xa0, 0xaf, 0x30, 0xc1, 0x47, 0xf4, 0xca, 0xee, 0x64, 0xf9, 0x7b, 0x55, 0xd5, 0xd2, 0x4c, 0xc9, 0x7f, 0x25, 0xfe, 0x48, 0xcd, 0x4b, 0xcc, 0x81, 0x1b, 0x05, 0x82, 0x38, 0x0e, 0x83, 0x19, 0xe3, 0x65, 0x3f, 0xbf, 0x16, 0x88, 0x93, 0xdd, 0x3b];? ? qo = "qo=241; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>3)|((oo[qo]<<5)&0xff))-70)&0xff;} while(--qo>=2);";? ? eval(qo);? ? qo = 240;? ? do {? ? ? ? oo[qo] = (oo[qo] - oo[qo - 1]) & 0xff;? ? } while (--qo >= 3);? ? qo = 1;? ? for (; ;) {? ? ? ? if (qo > 240) break;? ? ? ? oo[qo] = ((((((oo[qo] + 2) & 0xff) + 76) & 0xff) << 1) & 0xff) | (((((oo[qo] + 2) & 0xff) + 76) & 0xff) >> 7);? ? ? ? qo++;? ? }? ? po = "";? ? for (qo = 1; qo < oo.length - 1; qo++) if (qo % 6) po += String.fromCharCode(oo[qo] ^ VA);? ? eval("qo=eval;qo(po);");}

看到這樣的JS代碼疾棵,只能說(shuō)原諒我JS能力差,還原不了痹仙。是尔。。

但是前端經(jīng)驗(yàn)豐富的童鞋馬上就能想到還有種方法可解开仰,那就是利用瀏覽器的JS代碼調(diào)試功能拟枚。這樣一切就迎刃而解薪铜,新建一個(gè)html文件,將第一次返回的html原文復(fù)制進(jìn)去恩溅,保存用瀏覽器打開(kāi)隔箍,在eval之前打上斷點(diǎn),看到這樣的輸出:

可以看到這個(gè)變量po為document.cookie='_ydclearance=0c316df6ea04c5281b421aa8-5570-47ae-9768-2510d9fe9107-1490254971; expires=Thu, 23-Mar-17 07:42:51 GMT; domain=.kuaidaili.com; path=/'; window.document.location=document.URL,下面還有個(gè)eval("qo=eval;qo(po);")脚乡。JS里面的eval和Python的差不多蜒滩,第二句的意思就是將eval方法賦給qo。然后去eval字符串po奶稠。而字符串po的前半段的意思是給瀏覽器添加Cooklie,后半段window.document.location=document.URL是刷新當(dāng)前頁(yè)面俯艰。

這也印證了我上面的說(shuō)法,首次請(qǐng)求沒(méi)有Cookie锌订,服務(wù)端回返回一段生成Cookie并自動(dòng)刷新的JS代碼竹握。瀏覽器拿到代碼能夠成功執(zhí)行,帶著新的Cookie再次請(qǐng)求獲取數(shù)據(jù)辆飘。而Python拿到這段代碼就只能停留在第一步啦辐。

那么如何才能使Python也能執(zhí)行這段JS呢,答案是PyV8劈猪。V8是Chromium中內(nèi)嵌的javascript引擎昧甘,號(hào)稱跑的最快。PyV8是用Python在V8的外部API包裝了一個(gè)python殼战得,這樣便可以使python可以直接與javascript操作充边。PyV8的安裝大家可以自行百度。

代碼

分析完成常侦,下面切入正題擼代碼浇冰。

首先是正常請(qǐng)求網(wǎng)頁(yè),返回帶加密的JS函數(shù)的html:

import reimport PyV8import requestsTARGET_URL = "http://www.kuaidaili.com/proxylist/1/"def getHtml(url, cookie=None):? ? header = {? ? ? ? "Host": "www.kuaidaili.com",? ? ? ? 'Connection': 'keep-alive',? ? ? ? 'Cache-Control': 'max-age=0',? ? ? ? 'Upgrade-Insecure-Requests': '1',? ? ? ? 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36',? ? ? ? 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',? ? ? ? 'Accept-Encoding': 'gzip, deflate, sdch',? ? ? ? 'Accept-Language': 'zh-CN,zh;q=0.8',? ? }? ? html = requests.get(url=url, headers=header, timeout=30, cookies=cookie).content? ? return html# 第一次訪問(wèn)獲取動(dòng)態(tài)加密的JSfirst_html = getHtml(TARGET_URL)

由于返回的是html聋亡,并不單純的JS函數(shù)肘习,所以需要用正則提取JS函數(shù)的參數(shù)的參數(shù)。

# 提取其中的JS加密函數(shù)js_func = ''.join(re.findall(r'(function .*?)', first_html))print 'get js func:\n', js_func# 提取其中執(zhí)行JS函數(shù)的參數(shù)js_arg = ''.join(re.findall(r'setTimeout\(\"\D+\((\d+)\)\"', first_html))print 'get ja arg:\n', js_arg

還有一點(diǎn)需要注意坡倔,在JS函數(shù)中并沒(méi)有返回cookie漂佩,而是直接將cookie set到瀏覽器,所以我們需要將eval("qo=eval;qo(po);")替換成return po罪塔。這樣就能成功返回po中的內(nèi)容投蝉。

def executeJS(js_func_string, arg):? ? ctxt = PyV8.JSContext()? ? ctxt.enter()? ? func = ctxt.eval("({js})".format(js=js_func_string))? ? return func(arg)# 修改JS函數(shù),使其返回Cookie內(nèi)容js_func = js_func.replace('eval("qo=eval;qo(po);")', 'return po')# 執(zhí)行JS獲取Cookiecookie_str = executeJS(js_func, js_arg)

這樣返回的cookie是字符串格式征堪,但是用requests.get()需要字典形式瘩缆,所以將其轉(zhuǎn)換成字典:

def parseCookie(string):? ? string = string.replace("document.cookie='", "")? ? clearance = string.split(';')[0]? ? return {clearance.split('=')[0]: clearance.split('=')[1]}# 將Cookie轉(zhuǎn)換為字典格式cookie = parseCookie(cookie_str)

最后帶上解析出來(lái)的Cookie再次訪問(wèn)網(wǎng)頁(yè),成功獲取數(shù)據(jù):

# 帶上Cookie再次訪問(wèn)url,獲取正確數(shù)據(jù)print getHtml(TARGET_URL, cookie)[0:500]

下面是完整代碼:

# -*- coding: utf-8 -*-"""-------------------------------------------------? File Name:? ? demo_1.py.py? ? Description :? Python爬蟲(chóng)—破解JS加密的Cookie 快代理網(wǎng)站為例:http://www.kuaidaili.com/proxylist/1/? ? ? ? ? ? ? ? ? Document:? Author :? ? ? JHao? date:? ? ? ? ? 2017/3/23-------------------------------------------------? Change Activity:? ? ? ? ? ? ? ? ? 2017/3/23: 破解JS加密的Cookie-------------------------------------------------"""__author__ = 'JHao'import reimport PyV8import requestsTARGET_URL = "http://www.kuaidaili.com/proxylist/1/"def getHtml(url, cookie=None):? ? header = {? ? ? ? "Host": "www.kuaidaili.com",? ? ? ? 'Connection': 'keep-alive',? ? ? ? 'Cache-Control': 'max-age=0',? ? ? ? 'Upgrade-Insecure-Requests': '1',? ? ? ? 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36',? ? ? ? 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',? ? ? ? 'Accept-Encoding': 'gzip, deflate, sdch',? ? ? ? 'Accept-Language': 'zh-CN,zh;q=0.8',? ? }? ? html = requests.get(url=url, headers=header, timeout=30, cookies=cookie).content? ? return htmldef executeJS(js_func_string, arg):? ? ctxt = PyV8.JSContext()? ? ctxt.enter()? ? func = ctxt.eval("({js})".format(js=js_func_string))? ? return func(arg)def parseCookie(string):? ? string = string.replace("document.cookie='", "")? ? clearance = string.split(';')[0]? ? return {clearance.split('=')[0]: clearance.split('=')[1]}# 第一次訪問(wèn)獲取動(dòng)態(tài)加密的JSfirst_html = getHtml(TARGET_URL)# first_html = """# window.onload=setTimeout("lu(158)", 200); function lu(OE) {var qo, mo="", no="", oo = [0x64,0xaa,0x98,0x3d,0x56,0x64,0x8b,0xb0,0x88,0xe1,0x0d,0xf4,0x99,0x31,0xd8,0xb6,0x5d,0x73,0x98,0xc3,0xc4,0x7a,0x1e,0x38,0x9d,0xe8,0x8d,0xe4,0x0a,0x2e,0x6c,0x45,0x69,0x41,0xe5,0xd0,0xe5,0x11,0x0b,0x35,0x7b,0xe4,0x09,0xb1,0x2b,0x6d,0x82,0x7c,0x25,0xdd,0x70,0x5a,0xc4,0xaa,0xd3,0x74,0x98,0x42,0x3c,0x60,0x2d,0x42,0x66,0xe0,0x0a,0x2e,0x96,0xbb,0xe2,0x1d,0x38,0xdc,0xb1,0xd6,0x0e,0x0d,0x76,0xae,0xc3,0xa9,0x3b,0x62,0x47,0x40,0x15,0x93,0xb7,0xee,0xc3,0x3e,0xfd,0xd3,0x0d,0xf6,0x61,0xdc,0xf1,0x2c,0x54,0x8c,0x90,0xfa,0x24,0x5b,0x83,0x0c,0x75,0xaf,0x18,0x01,0x7e,0x68,0xe0,0x0a,0x72,0x1e,0x88,0x33,0xa7,0xcc,0x31,0x9b,0xf3,0x1a,0xf2,0x9a,0xbf,0x58,0x83,0xe4,0x87,0xed,0x07,0x7e,0xe2,0x00,0xe9,0x92,0xc9,0xe8,0x59,0x7d,0x56,0x8d,0xb5,0xb2,0x6c,0xe0,0x49,0x73,0xfc,0xe7,0x20,0x49,0x34,0x09,0x71,0xeb,0x60,0xfd,0x8e,0xad,0x0f,0xb9,0x2e,0x77,0xdc,0x74,0x9b,0xbf,0x8f,0xa5,0x8d,0xb8,0xb0,0x06,0xac,0xc5,0xe9,0x10,0x12,0x77,0x9b,0xb1,0x19,0x4e,0x64,0x5c,0x00,0x98,0xc6,0xed,0x98,0x0d,0x65,0x11,0x35,0x9e,0xf4,0x30,0x93,0x4b,0x00,0xab,0x20,0x8f,0x29,0x4f,0x27,0x8c,0xc2,0x6a,0x04,0xfb,0x51,0xa3,0x4b,0xef,0x09,0x30,0x28,0x4d,0x25,0x8e,0x76,0x58,0xbf,0x57,0xfb,0x20,0x78,0xd1,0xf7,0x9f,0x77,0x0f,0x3a,0x9f,0x37,0xdb,0xd3,0xfc,0x14,0x39,0x11,0x3b,0x94,0x8c,0xad,0x8e,0x5c,0xd3,0x3b];qo = "qo=251; do{oo[qo]=(-oo[qo])&0xff; oo[qo]=(((oo[qo]>>4)|((oo[qo]=2);"; eval(qo);qo = 250; do { oo[qo] = (oo[qo] - oo[qo - 1]) & 0xff; } while (-- qo >= 3 );qo = 1; for (;;) { if (qo > 250) break; oo[qo] = ((((((oo[qo] + 200) & 0xff) + 121) & 0xff) > 2); qo++;}po = ""; for (qo = 1; qo # """# 提取其中的JS加密函數(shù)js_func = ''.join(re.findall(r'(function .*?)', first_html))print 'get js func:\n', js_func# 提取其中執(zhí)行JS函數(shù)的參數(shù)js_arg = ''.join(re.findall(r'setTimeout\(\"\D+\((\d+)\)\"', first_html))print 'get ja arg:\n', js_arg# 修改JS函數(shù)佃蚜,使其返回Cookie內(nèi)容js_func = js_func.replace('eval("qo=eval;qo(po);")', 'return po')# 執(zhí)行JS獲取Cookiecookie_str = executeJS(js_func, js_arg)# 將Cookie轉(zhuǎn)換為字典格式cookie = parseCookie(cookie_str)print cookie# 帶上Cookie再次訪問(wèn)url,獲取正確數(shù)據(jù)print getHtml(TARGET_URL, cookie)[0:500]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庸娱,一起剝皮案震驚了整個(gè)濱河市着绊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熟尉,老刑警劉巖归露,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異斤儿,居然都是意外死亡靶擦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門雇毫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人踩蔚,你說(shuō)我怎么就攤上這事棚放。” “怎么了馅闽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵飘蚯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我福也,道長(zhǎng)局骤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任暴凑,我火速辦了婚禮峦甩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘现喳。我一直安慰自己凯傲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布嗦篱。 她就那樣靜靜地躺著冰单,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灸促。 梳的紋絲不亂的頭發(fā)上诫欠,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天,我揣著相機(jī)與錄音浴栽,去河邊找鬼荒叼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吃度,可吹牛的內(nèi)容都是我干的甩挫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼椿每,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼伊者!你這毒婦竟也來(lái)了英遭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤亦渗,失蹤者是張志新(化名)和其女友劉穎挖诸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體法精,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡多律,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了搂蜓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狼荞。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖帮碰,靈堂內(nèi)的尸體忽然破棺而出相味,到底是詐尸還是另有隱情,我是刑警寧澤殉挽,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布丰涉,位于F島的核電站,受9級(jí)特大地震影響斯碌,放射性物質(zhì)發(fā)生泄漏一死。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一傻唾、第九天 我趴在偏房一處隱蔽的房頂上張望投慈。 院中可真熱鬧,春花似錦冠骄、人聲如沸逛裤。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)带族。三九已至,卻和暖如春蟀给,著一層夾襖步出監(jiān)牢的瞬間蝙砌,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工跋理, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留择克,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓前普,卻偏偏與公主長(zhǎng)得像肚邢,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • HTTP cookie(也稱為web cookie,網(wǎng)絡(luò)cookie,瀏覽器cookie或者簡(jiǎn)稱cookie)是網(wǎng)...
    留七七閱讀 17,941評(píng)論 2 71
  • 模板引擎其實(shí)就是將一個(gè)帶有自定義標(biāo)簽的字符串骡湖,通過(guò)相應(yīng)的規(guī)則解析贱纠,返回php可以解析的字符串,這其中正則的運(yùn)用是必...
    hopevow閱讀 1,343評(píng)論 0 10
  • 之前積累了XSS 有一段時(shí)間响蕴,因?yàn)槟壳伴_(kāi)始了一件有趣的工程谆焊,需要整合非常多的知識(shí),其中Web 安全這一塊出現(xiàn)最多的...
    刀背藏身閱讀 9,057評(píng)論 0 16
  • 遇見(jiàn)L浦夷,F(xiàn)終于相信了一見(jiàn)鐘情辖试。 大學(xué)軍訓(xùn)的時(shí)候,F(xiàn) 就注意到了L 劈狐。L是四連的指揮員罐孝,F(xiàn)是十一連的無(wú)名小卒,在隊(duì)伍...
    anangli閱讀 312評(píng)論 0 1
  • 《迷路》 作者:明至 我最親愛(ài)的小孩肥缔, 不必?zé)o助又啼哭肾档。 跟隨內(nèi)心的指引, 便會(huì)找到回家路辫继。 (材料:速寫本、8B...
    作家明至閱讀 252評(píng)論 0 2