分享DEDECMS 验证码的一个细节问题。附提问一个疑惑,有关SESSION的
本帖最后由 default7 于 2012-12-01 15:54:51 编辑
问题:重复提交问题。表单提交成功了,发现页面单击右键点击返回上一页,浏览器提示“此页面不可用”,按下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/common.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
<br>
<br>
/**<br>
* 获取验证码的session值<br>
*<br>
* @return string<br>
*/<br>
function GetCkVdValue()<br>
{<br>
$sessSavePath = DEDEDATA."/sessions/";<br>
if(is_writeable($sessSavePath) && is_readable($sessSavePath)){ session_save_path($sessSavePath); }<br>
if(!empty($GLOBALS['cfg_domain_cookie'])) session_set_cookie_params(0,'/',$GLOBALS['cfg_domain_cookie']);<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>
$sessSavePath = DEDEDATA."/sessions/";<br>
if(is_writeable($sessSavePath) && is_readable($sessSavePath)){ session_save_path($sessSavePath); } <div class="clear">
</div>
登录后复制