个人编程资料整理整理

关于验证码安全

PHP2019-11-13 14:54:59

验证码处理不好,很容易被暴库。
这里暂且不谈网站被“打码”的问题,说两个验证码校验中的两个坑。
下面代码以PHP作为示例,适用于所有语言。

1、验证码相等的判断

<?php
if($_SESSION['code'] != $_POST['code']){
    echo '验证码错误';
    exit;
}
?>

正常访问网站情况下,没毛病。
但是,如果我根本没访问过你的表单页,直接构造http请求,这代码就形同虚设。
因为,没访问表单页,$_SESSION['code']是空的,我只要构造一个http请求,不传递code值,就绕过了。
原因:没有判断用户输入是否为空。

2、既判断了相等,又判断了空值。

<?php
if($_SESSION['code'] != $_POST['code'] || empty($_POST['code'])){
    echo '验证码错误';
    exit;
}
?>

安全了么?安全了啊,你看,既判断了空值,又判断了是否相等,万无一失!
请注意,session是有生命周期的,生命周期不是页面级别,是会话级别的,只要维持一个会话,session就一直在。

怎么绕过?
Chrome,F12打开控制台,进入network选项。

第一次,正常访问表单页,输入验证码,正常提交表单。
控制台看下http请求,一般会有cookie头。只要把cookie取出来,http模拟提交的时候设置下cookie值,暴库。
有些平台,使用过Url查询参数来维持会话的,原理跟cookie一样。

原因:验证后,没有清空验证码的session值。
建议:不管验证通过不通过,一律清空验证码的session。

其实,这都是同一个问题导致的:相信了用户输入。
不管写什么样的程序,一个原则:永远不要相信用户的输入。

文章分类

  • 最新评论
  •  
  •