验证码被绕过的处理方法

 更新时间:2016年11月25日 17:41  点击:1764

我们先来分析下,有验证码发布的流程
1,显示表单
2,显示验证码(条用生成验证码的程序), 将验证码加密后放进 session 或者 cookie
3,用户提交表单
4,核对验证码无误,数据合法后 写入数据库教程完成

用户如果再发布一条,正常情况下,会再次访问表单页面,验证码图片被动 更新, session 和 cookie 也就跟着变了
但是灌水机操作 不一定非要使用表单页面,它可以直接 模拟post 向服务端程序 发送数据;这样验证码程序没有被调用,当然session和cookie存储的加密验证码就是上次的值,也就没有更新,这样以后无限次的通过post直接发送的数据 ,而不考虑验证码,验证码形同虚设!

所以,在核对验证码后 先将 session和cookie的值清空,然后做数据合法性判断,然偶入库!
这样 一个漏洞就被补上了!

 代码如下 复制代码
<?php教程
if ( md5($_post['vcode']) == $_session['vcode']  ) {
    $_session['vcode']='';//这句非常重要
} else {
    exit '验证码不对!';
}
//接下来的处理
......
?>

生成验证码图片的程序

 代码如下 复制代码
<?php
session_start();
......
$v = new authcode();
$vcode = $v->getauthcode();
$_session['vcode'] = md5($vcode );
........
?>

表单页面

 代码如下 复制代码
<form action="save.php" method="post">
......
<input type="text" name="vcode" size="4" /> <img src="vcode.php" alt="看不清请刷新页面" />
</form>


 验证码是怎样被绕过的

由于某种原因ajax默认就是uft-8的编码,那么我们使用一gbk就容易出现乱码的问题,下面我们就来告诉你php ajax乱码的解决方法吧。

传递中文参数,然后修改数据库教程的。

 代码如下 复制代码

<script>
var url="admin/ajaxmodify.php?"+key+"=";
 url+=encodeuricomponent(encodeuricomponent(value));
  xmlhttp.open("get",url,true);
  xmlhttp.send(null);
</script>
参数是中文encodeuricomponent这个方法必须调用两次
*/

function utf8rawurldecode ($source) {
  $decodedstr = "";
  $pos = 0;
  $len = strlen ($source);
  while ($pos < $len) {
  $charat = substr ($source, $pos, 1);
  if ($charat == '%') {
  $pos++;
  $charat = substr ($source, $pos, 1);
  if ($charat == 'u') {
  // we got a unicode character
  $pos++;
  $unicodehexval = substr ($source, $pos, 4);
  $unicode = hexdec ($unicodehexval);
  $entity = "&#". $unicode . ';';
  $decodedstr .= utf8_encode ($entity);
  $pos += 4;
  }
  else {
  // we have an escaped ascii character
  $hexval = substr ($source, $pos, 2);
  $decodedstr .= chr (hexdec ($hexval));
  $pos += 2;
  }
  } else {
  $decodedstr .= $charat;
  $pos++;
  }
  }
  return $decodedstr;
}


/*
注:js中,在使用字符转码的时候,推荐使用 encodeuricomponent() 或者 encodeuri(),而非escape()。原因在于,escape() 只是为 ascii字符 做转换工作,转换成的 %unnnn 这样的码,如果要用更多的字符如 utf-8字符库就一定要用 encodeuricomponent() 或 encodeuri() 转换才可以成 %nn%nn 这的码才可以。

js:encodeuricomponent —— decodeuricomponent;php: rawurlencode —— rawurldecode


*/

本款php 5.3环境配置方法是利用Apache2.2.16+PHP5.3.3+MySQL5.1.49的配置哦,下面来看看安装配置教程哦。

第一步:下载安装的文件
1. mysql:下载地址mysql-5.1.49-win32.msi;
2. apache: 下载地址httpd-2.2.16-win32-x86-openssl-0.9.8o.msi;
3. php5.3.3 下载地址php-5.3.3-win32-vc6-x86注意:一定要下载php-5.3.3-win32-vc6-x86版本
的,不要下载php-5.3.3-nts-win32-vc6-x86版本,更不要下载vc9版本的,因为他是iis服务器安装版本。
第二步:安装文件
1. 在要安装的磁盘建一个文件夹(笔者的做法是在d盘的根目录下创建一个php文件夹d:php)。
2. 安装apache服务器,安装完成后的目录结果是:d:phppache。
3. 把下载的php-5.3.3-win32-vc6-x86解压的d:php目录中,可以把文件夹的名字改短,结果d:phpphp5
4. 安装mysql数据库教程,它的安装和一般情况一样。笔者把他安装在(d:phpmysql)和php同目录。
第三步:配置php5.3.3
1. 配置php5.3.3,打开php安装目录(笔者是d:phpphp5)可以看到目录下有两个这样的文件php.ini- development和php.ini-production,第一个是开发使用的配置文件,第二个是标准的生产环境的配置。
2. 选择php.ini-development复制一份到同目录下,并改名为php.ini使用文本工具打开,查找extension_dir,可以
看到两个,选择on windows:下面的那个并去得前面的分号修改为extension_dir = "d:/php/php5/ext",读者根
据自己的目录结构配置,目的是找到和php.ini同目录下的ext文件夹中的扩展库。
3. 查找extension=php_,去掉extension=php_curl.dll、extension=php_gd2.dll、extension=php_mbstring.dll、
extension=php_mysql.dll、extension=php_mysqli.dll、extension=php_pdo_mysql.dll、extension=php_xmlrpc.dll前面
的分号。查找short_open_tag = off把它修改成short_open_tag = on,让其支持短标签。
4. 复制php5ts.dll文件到windows/system32目录下,只有php-5.3.3-win32-vc6-x86版本中才有php5ts.dll
php-5.3.3-nts-win32-vc6-x86版本是没有的。
第四步:配置apache
1. 打开apache目录下conf目录中的httpd.conf文件,查找#loadmodule,在其末尾处大概是128行的地方
添加:
loadmodule php5_module "d:/php/php5/php5apache2_2.dll"
phpinidir "d:/php/php5"
addtype application/x-httpd-php .php
addtype application/x-httpd-php .htm
addtype application/x-httpd-php .html
目录结构根据用户自己目录配置。
2. 查找directoryindex index.html 将其修改成directoryindex index.php default.php index.html index.htm default.html
default.htm
3. 查找documentroot将其修改为指向你需要放置web文件的文件夹上(笔者在d:/php目录中创建了一个
www文件夹)所以documentroot就是documentroot "d:/php/www",读者可以根据自己配置来修改。
4. 查找<directory将其修改为你自己配置的documentroot的路径(笔者是<directory "d:/php/www">)
第五步:测试php+apache+mysql是否配置成功
1. 打开mysql在mysql中创建一个新数据库和表。(笔者是userinfo数据库和users表就有id和name两个字段)
测试吗?简单就好,呵呵!!
2. 在上面创建的www文件夹中创建一个index.php文件使用editplus或者其他文本工具打开。
3. 写入:


复制代码 代码如下:

 代码如下 复制代码

<?
$db_host = "localhost";
$db_user = "root";
$db_pass = "root";
$db_name = "userinfo";

mysql_connect($db_host,$db_user,$db_pass);
mysql_select_db($db_name);

mysql_query("set names gb2312");
$sql = "select * from users";
$result = mysql_query($sql);
while($data=mysql_fetch_array($result)){
echo "------------------------";
echo $data['id']."<br/>";
echo $data['name']."<br/>";
}
mysql_close();
?>

4.启动apache服务器,在浏览器输入http://www.111cn.net回车。
如果看到下图:表示我们大功告成了!祝贺祝贺!

本款php正则日期教程,提供了三种验证用户输入的日期是不是正确的日期格式哦,二种是用正则日期验证,一种是用checkdate来验证。

$days = date("y-m-d");

//方法一正则验证日期

 代码如下 复制代码

$reg="/d{4}-d{2}-d{2}/";
preg_match($reg,$days,$arr);
print_r($arr);


//方法二用cehckdate验证

 代码如下 复制代码
$k = explode('-',$days);
if( checkdate($k[1],$k[2],$k[0])  )
{
 echo $days,'日期合法';
}
else
{
 echo '不是有效的日期';
}

//方法三简单直观正则验证

 代码如下 复制代码
if( ereg("(19|20)[0-9]{2}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$",$days))
{
 echo $days,'为有效日期';
}
else
{
 echo

'无效日期';
}

/*
关于 checkdate函数

checkdate() 函数验证一个格里高里日期。

如果指定的值合法,则该函数返回 true,否则返回 false。

日期在下列情况下为合法:
month 介于且包括 1 - 12
day 的值在给定的 month 所应该具有的天数范围之内,闰年已经考虑进去了。
year 介于且包括 1 到 32767


验证格式为 月/日/年

本站原创教程,转载注明来源于www.111cn.net/phper/php.html
*/

下面这三款获取当前时间都很好的解决8小时差距问题的,只要在获取时间前加上date_default_timezone_set(\\\"Asia/Chongqing\\\");就解决的时区问题,一般我们用date(),time()函数都会存在时差问题。


/**
  * 获取服务器当前日期时间
  */

 代码如下 复制代码
 function get_server_datetime()
 {
  date_default_timezone_set("asia/chongqing");
  return date("y-m-d h:i:s");
 }

 /**
  * 获取服务器当前日期
  */

 代码如下 复制代码
 function get_server_date()
 {
  date_default_timezone_set("asia/chongqing");
  return date("ymd");
 }

 /**
   * 获取服务器当前时间
   */

 代码如下 复制代码
 function get_time()
 {
      date_default_timezone_set("asia/chongqing");
      $timeval["h"] = date("h"); //小时
      $timeval["i"] = date("i"); //分钟
      $timeval["s"] = date("s"); //秒
      return $timeval;
    }
[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • Windows批量搜索并复制/剪切文件的批处理程序实例

    这篇文章主要介绍了Windows批量搜索并复制/剪切文件的批处理程序实例,需要的朋友可以参考下...2020-06-30
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
  • BAT批处理判断服务是否正常运行的方法(批处理命令综合应用)

    批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。这篇文章主要介绍了BAT批处理判断服务是否正常运行(批处理命令综合应用),需要的朋友可以参考下...2020-06-30
  • js控制页面控件隐藏显示的两种方法介绍

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • C#方法的总结详解

    本篇文章是对C#方法进行了详细的总结与介绍,需要的朋友参考下...2020-06-25
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04