分享DEDECMS 验证码的一个细节问题。附提问一个疑惑,有关SESSION的
问题:重复提交问题。表单提交成功了,发现页面单击右键点击返回上一页,浏览器提示“此页面不可用”,按下F5重新刷新,结果又提交成功了。导致“如果不停地刷新”就可以不停地提交成功!验证码的问题。
代码:
<br />if($dopost == 'add'){<br /> $svali = GetCkVdValue();<br /> if(strtolower($vdcode)!=$svali || $svali=='')<br /> {<br /> ResetVdValue();<br /> ShowMsg('验证码错误!', '-1');<br /> exit();<br /> }<br />}<br />
解决: 一开始以为是ResetVdValue();这个函数的问题,最后才发现是执行顺序的问题,把 ResetVdValue(); 放到判断“提交的验证码是否正确”的代码之前就可以了。
<br />if($dopost == 'add'){<br /> $svali = GetCkVdValue();<br /> ResetVdValue(); //位置移前<br /> if(strtolower($vdcode)!=$svali || $svali=='')<br /> {<br /> ShowMsg('验证码错误!', '-1');<br /> exit();<br /> }<br />}<br />
后来看了验证码方面的获取和销毁的函数,有一个疑问的地方:
1.未改动前的文件:/include/commo@本文来源gaodaimacom搞#代%码@网-搞代gaodaima码n.func.php,函数GetCkVdValue()和ResetVdValue()
<br />/**<br /> * 获取验证码的session值<br /> *<br /> * @return string<br /> */<br />function GetCkVdValue()<br />{<br /> @session_id($_COOKIE['PHPSESSID']);<br /> @session_start();<br /> return isset($_SESSION['securimage_code_value']) ? $_SESSION['securimage_code_value'] : '';<br />}<br /><br />/**<br /> * PHP某些版本有Bug,不能在同一作用域中同时读session并改注销它,因此调用后需执行本函数<br /> *<br /> * @return void<br /> */<br />function ResetVdValue()<br />{<br /> @session_start();<br /> $_SESSION['securimage_code_value'] = '';<br />}<br />
2.未改动前的验证码生成程序:/include/vdimgck.php 开头的地方有写
<br />$sessSavePath = DEDEDATA."/sessions/";<br /><br />// Session保存路径<br />if(is_writeable($sessSavePath) && is_readable($sessSavePath)){ session_save_path($sessSavePath); }<br />if(!empty($cfg_domain_cookie)) session_set_cookie_params(0,'/',$cfg_domain_cookie);<br /><br />session_start();<br />
个人将代码修改成如下,文件/include/common.func.php
/**
* 获取验证码的session值
*
* @return string
*/
function GetCkVdValue()
{
$sessSavePath = DEDEDATA."/sessions/";
if(is_writeable($sessSavePath) && is_readable($sessSavePath)){ session_save_path($sessSavePath); }
if(!empty($GLOBALS['cfg_domain_cookie'])) session_set_cookie_params(0,'/',$GLOBALS['cfg_domain_cookie']);@session_id($_COOKIE['PHPSESSID']);
@session_start();
return isset($_SESSION['securimage_code_value']) ? $_SESSION['securimage_code_value'] : '';
}/**
* PHP某些版本有Bug,不能在同一作用域中同时读session并改注销它,因此调用后需执行本函数
*
* @return void
*/
function ResetVdValue()
{
$sessSavePath = DEDEDATA."/sessions/";
if(is_writeable($sessSavePath) && is_readable($sessSavePath)){ session_save_path($sessSavePath); }搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:分享DEDECMS 验证码的一个细节有关问题。附提问一个疑惑,有关SESSION的