PHP中没用的验证码
我們常常在提交頁(yè)面設(shè)置驗(yàn)證碼防止重復(fù)提交,但有些時(shí)候設(shè)置了驗(yàn)證碼不一定有用,看看下面的例子:
實(shí)現(xiàn)用戶注冊(cè)的功能,需要提交以下字段:username,password,regCode,注冊(cè)成功后跳轉(zhuǎn)到登錄頁(yè)面,接受頁(yè)面進(jìn)行如下處理:
if($_POST['regCode'] != $_SESSION['regCode']) {msg('驗(yàn)證碼不一致'); } $username = $_POST['username']; $password = $_POST['password']; if(! check_username($username)) {msg('用戶名不合法'); } if(! check_password($password))) {msg('密碼不合法'); } if(check_user_exists($username)) {msg('用戶名已被占用'); } if(! $this->user_model->save(array('username' => $username,'password' => $password, ))) {msg('注冊(cè)失敗'); } header("Location:login.php");可以看到對(duì)用戶名、密碼都做了校驗(yàn),且設(shè)置了驗(yàn)證碼,那是不是就沒問(wèn)題了呢?可以看到服務(wù)端只做了驗(yàn)證碼校驗(yàn),但在使用完驗(yàn)證碼后并未刪掉驗(yàn)證碼,這樣在下次請(qǐng)求中驗(yàn)證碼是否可以重復(fù)使用呢? 我們知道驗(yàn)證碼通常情況下存儲(chǔ)在SESSION中,只要SESSION中驗(yàn)證碼不被刪掉而客戶端請(qǐng)求的CookieID相同,服務(wù)端會(huì)認(rèn)為是同一個(gè)用戶,根據(jù)同一個(gè)CookieID想必服務(wù)端還可以拿到驗(yàn)證碼再次使用。 我們可以這個(gè)動(dòng)作用程序來(lái)模擬,并嘗試多次執(zhí)行:
$cookie = 'PHPSESSID=pgfac511q271k5vvije46kf634'; $post_data = array('username' => 'pp'.time(),'password' => time(),'regCode' => 'dksi', ); $ch = curl_init("http://localhost/regist.php"); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data)); curl_setopt($ch,CURLOPT_HTTPHEADER, array("Cookie: ".$cookie)); $rs = curl_exec($ch); if(curl_errno($ch)) {throw new Exception('Curl Error:'.curl_error($ch)); } curl_close($ch); var_dump($rs);我們只需要從瀏覽器上取到產(chǎn)生的cookie內(nèi)容和顯示的驗(yàn)證碼即可,而這些通過(guò)ff或者chrome很容易就可以拿到。多次執(zhí)行之后會(huì)發(fā)現(xiàn)數(shù)據(jù)庫(kù)插入了多條記錄,也就是驗(yàn)證碼沒有起到防刷的目的。同樣,也可以在提交頁(yè)面的時(shí)候嘗試直接F5刷新,上面的邏輯則會(huì)提示用戶名已被占用。
該問(wèn)題產(chǎn)生的根本原因就是驗(yàn)證碼使用一次之后還可以再次使用,所以解決也很簡(jiǎn)單,只需要在注冊(cè)成功之后清掉驗(yàn)證碼的值即可,再次請(qǐng)求時(shí)服務(wù)端session里已經(jīng)沒有該值了,驗(yàn)證碼就校驗(yàn)不通過(guò)了。
這樣的問(wèn)題本屬于很小的問(wèn)題,但是在系統(tǒng)中不經(jīng)意就發(fā)生了,不要讓驗(yàn)證碼變得毫無(wú)意義,等刷了幾百萬(wàn)用戶后才后知后覺
總結(jié)
以上是生活随笔為你收集整理的PHP中没用的验证码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 大胃王为什么那么能吃?
- 下一篇: PHP中一些可用的方法