我正在为我的模块构建一个表单,最后一步是通过验证码检查以确保安全性。我已经下载了最新版本的securimage。验证码显示正确,可以生成新的验证码。但是,在发布表单后,检查是否正确输入验证码的建议技术永远不会返回true。
的index.php:
<form method="post" action="tmpl/form/contact.php" name="contactform" id="contactform">
<img id="captcha" src="securimage/securimage_show.php" alt="CAPTCHA Image" />
<a style="text-decoration: none; font-size: 10px; margin-top: -10px; " href="#" onclick="document.getElementById('captcha').src = '/securimage/securimage_show.php?' + Math.random(); return false">Refresh</a>
/**input here **/ name="captcha_code"
contact.php:
define( '_JEXEC', 1 )`;
define( 'JPATH_BASE', realpath(dirname(__FILE__))."/../../../..");
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe = JFactory::getApplication('site');
$mainframe->initialise();
$user = JFactory::getUser();
$session = JFactory::getSession();
jimport( 'joomla.application.module.helper' );
$db = JFactory::getDBO();
$db->setQuery("SELECT params FROM #__modules WHERE module = 'module'");
$module = $db->loadObject();
$moduleParams = new JRegistry();
$moduleParams->loadString($module->params);
include_once $_SERVER['DOCUMENT_ROOT'] . 'securimage/securimage.php';
$securimage = new Securimage();
if ($securimage->check($_POST['captcha_code']) == false) {
echo '<div class="error_message">' . $errorcaptchainvalid . '</div>';
exit;
}
在搜索问题后,我从http://www.phpcaptcha.org/faq/发现了这种可能性:
如果变量名称相同,则可能是由于问题所致 用于跟踪用户及其内容的PHP会话 代码是。会话可能未启动或更多 可能是securimage_show.php中使用的会话名称不同 从执行代码的脚本中使用的会话名称 验证。其他软件平台(论坛,内容)很常见 管理系统,表单处理器等)使用其他会话名称 比PHP默认。如果是这种情况,您必须确定是什么 会话名称由软件使用,并使用相同的会话名称 securimage_show.php和securimage_play.php。
非默认会话名称可以传递给Securimage,以便它可以共享 与另一个软件平台的会话,代码如下: $ img-&gt; session_name ='your_session_name';
这可以解释为什么我的验证码没有运气。我已经尝试编辑上面的文件,但我不知道如何在Joomla中设置会话!或者如何解决这个问题。问题可能是会话变量吗?
securimage_show.php:
require_once dirname(__FILE__) . '/securimage.php';
$img = new Securimage();
if (!empty($_GET['namespace'])) $img->setNamespace($_GET['namespace']);
$img->show();
securimage_play.php
require_once dirname(__FILE__) . '/securimage.php';
$options = array(
'use_database' => true,
'database_name' => '',
'database_user' => '',
'database_driver' => Securimage::SI_DRIVER_MYSQL
);
$img = new Securimage();
if (!empty($_GET['namespace'])) $img->setNamespace($_GET['namespace']);
$img->outputAudioFile();
答案 0 :(得分:0)
你的中途 - 问题是Joomla处理会话的方式。
表示,不要将表单放在文章中,而是尝试通过iframe嵌入表单。