我们常常在提交页面设置验证码防止重复提交,但有些时候设置了验证码不一定有用,看看下面的例子: 实现用户注册的功能,需要提交以下字段:username,password,regCode,注册成功后跳转到登录页面,接受页面进行如下处理: if($_POST['regCode'] != $_SESSIO
我们常常在提交页面设置验证码防止重复提交,但有些时候设置了验证码不一定有用,看看下面的例子:
实现用户注册的功能,需要提交以下字段:username,password,regCode,注册成功后跳转到登录页面,接受页面进行如下处理:
if($_POST['regCode'] != $_SESSION['regCode']) { msg('验证码不一致'); } $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('注册失败'); } header("Location:login.php");
可以看到对用户名、密码都做了校验,且设置了验证码,那是不是就没问题了呢?可以看到服务端只做了验证码校验,但在使用完验证码后并未删掉验证码,这样在下次请求中验证码是否可以重复使用呢?
我们知道验证码通常情况下存储在SESSION中,只要SESSION中验证码不被删掉而客户端请求的CookieID相同,服务端会认为是同一个用户,根据同一个CookieID想必服务端还可以拿到验证码再次使用。
我们可以这个动作用程序来模拟,并尝试多次执行:
$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);
我们只需要从浏览器上取到产生的cookie内容和显示的验证码即可,而这些通过ff或者chrome很容易就可以拿到。多次执行之后会发现数据库插入了多条记录,也就是验证码没有起到防刷的目的。同样,也可以在提交页面的时候尝试直接F5刷新,上面的逻辑则会提示用户名已被占用。
该问题产生的根本原因就是验证码使用一次之后还可以再次使用,所以解决也很简单,只需要在注册成功之后清掉验证码的值即可,再次请求时服务端session里已经没有该值了,验证码就校验不通过了。
这样的问题本属于很小的问题,但是在系统中不经意就发生了,不要让验证码变得毫无意义,等刷了几百万用户后才后知后觉^_^
原文地址:没用的验证码, 感谢原作者分享。

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기

ZendStudio 13.5.1 맥
강력한 PHP 통합 개발 환경

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.
