php.ini request_order
在之前的公司祷肯,曾今出現(xiàn)了一次線上運(yùn)營事故沉填,因這個(gè)bug導(dǎo)致項(xiàng)目延遲上線兩小時(shí)。
故事是這樣發(fā)展的佑笋,用戶打開了http://xxx.xxx.com/xx/xx?openid=13445 這里的openid是分享鏈接帶上的參數(shù)翼闹,然后根據(jù)這個(gè)openid進(jìn)行了一系列的業(yè)務(wù),幫這個(gè)分享者加游戲次數(shù)蒋纬,加獎(jiǎng)品猎荠。。蜀备。关摇。。
代碼如下:$shareOpenid = $_REQUEST['openid'];然后奇跡就出現(xiàn)了碾阁,某些人訪問該鏈接時(shí)输虱,明明url后面的openid參數(shù)是A,結(jié)果代碼中變成了BV住O芏谩愁茁!
why!
聰明的人也許覺得這就是一個(gè)沙雕問題亭病。沒錯(cuò)鹅很,確實(shí)很沙雕,在第一行就寫了原因罪帖。php.ini 中的request_order設(shè)置決定了預(yù)定義變量$_REQUEST的值及排序促煮。當(dāng)時(shí)的配置是gpc,也就是說如果querystring 中存在參數(shù)openid值為1胸蛛,post fom-data中存在參數(shù)openid值為2污茵,cookies中存在openid的cookie且值為3,那么通過$_REQUEST['openid'] 獲取到的值就是3.
就是這么基礎(chǔ)的問題葬项。有一堆人訪問了一個(gè)歷史頁面會(huì)設(shè)置一個(gè)當(dāng)前用戶的openid的cookie泞当,然后就炸了。