【问题标题】:Captcha is working fine on localhost , but not online验证码在 localhost 上工作正常,但不能在线
【发布时间】:2015-11-22 04:02:49
【问题描述】:

我在我的 wordpress 主题中的 ajax 表单上使用 simple-php-captcha(https://github.com/claviska/simple-php-captcha) 脚本, 它在本地主机上工作正常但是当我将它上传到在线主机上时,验证码不匹配,一切正常,验证码图像加载,会话被创建但图像中显示的验证码与提交表单时。

functions.php

require_once( get_template_directory() . '/libs/captcha/simple-php-captcha.php' );
require_once( get_template_directory() . '/inc/ajax/testimonial.php' );

header.php

session_start();
$_SESSION['captcha'] = simple_php_captcha(); 

html表单

<form action="<?php echo admin_url("admin-ajax.php"); ?>" class="dw-ajax-form dw-form" method="post" id="send_testimonial">
    <input type="text" name="name" placeholder="name">
    <input type="text" name="job" placeholder="company / job">
    <input type="text" name="email" placeholder="Email address">
    <textarea type="textarea" name="comment" placeholder="your opinion about us"></textarea>

    <div class="block captcha-image">
        <img src="<?php echo $_SESSION['captcha']["image_src"]; ?>" alt="<?php echo $_SESSION['captcha']["code"]; ?>">
    </div>

    <input type="text" name="captcha" placeholder="enter the code above" autocomplete="off">

    <input type="hidden" name="action" value="send_testimonial">
    <?php wp_nonce_field( 'send_testimonial', 'send_testimonial_nonce' ); ?>

    <input type="submit" value="send"> <span class="msg" style="margin-right:15px;"></span>
</form>

ajax 函数(/inc/ajax/testimonial.php)

<?php
/**
 * Testimonial Form Ajax Callbacks
 *
 * @package Wordpress
 * @subpackage Learnfiles-shop Theme
 * @author Dornaweb.com
 */

add_action( 'wp_ajax_send_testimonial', 'dw_send_testimonial' );
add_action( 'wp_ajax_nopriv_send_testimonial', 'dw_send_testimonial' );
function dw_send_testimonial() {
    global $wpdb;
    $message = '';

    $name           = strip_tags( htmlspecialchars( $_POST["name"] ) );
    $job            = strip_tags( htmlspecialchars( $_POST["job"] ) );
    $email          = strip_tags( htmlspecialchars( $_POST["email"] ) );
    $comment        = strip_tags( htmlspecialchars( $_POST["comment"] ) );

    /* captcha */
    $captcha_input  = strtolower( strip_tags( htmlspecialchars( $_POST["captcha"] ) ) );
    $captcha_code = strtolower( $_SESSION['captcha']['code'] );

    /** Validation **/
    if( !$_SESSION['captcha'] || !is_array( $_SESSION['captcha'] ) )
        die( '<span class="error">Somethings wrong</span>' );

    /******************************* IT ALWAYS GIVES ME THIS ERROR WHEN ONLINE , BUT IT WORKS ON LOCALHOST( i also tried it with "!=" operator ) **************/
    if( $captcha_code !== $captcha_input )
        die( '<span class="error">The entered code doesnt match</span>' );
    /**********************************************************************************************************************************************************/

    if (  !isset( $_POST['send_testimonial_nonce'] ) || ! wp_verify_nonce( $_POST['send_testimonial_nonce'], 'send_testimonial' ) )
        die('<span class="error">Somethings wrong</span>');

    if( empty( $comment ) )
        die('<span class="error">Please enter your comment</span>');

    if( empty( $name ) )
        die('<span class="error">please enter your name</span>');

    if( !empty( $email ) && !filter_var($email, FILTER_VALIDATE_EMAIL) )
        die('<span class="error">the entered email doesnt look like an email address</span>');

    if( empty( $name ) && empty( $comment ) )
        die('<span class="error">please fill the form</span>');

    /* send testimonial */
    $testimonial = array(
        'post_title'  => $name,
        'post_status' => 'pending',
        'post_type'   => 'testimonials',
        'post_author' => 1
    );

    $post_id = wp_insert_post( $testimonial );

    update_field( 'job', $job, $post_id );
    update_field( 'email', $email, $post_id );
    update_field( 'comment', $comment, $post_id );

    // form is valid
    if( empty( $message ) )
        $message = '<span class="success">Your comment submitted! thank you.</span>';

    echo $message;
    wp_die();
}

编辑: 我在这里进行了测试(抱歉页面是波斯语):http://test.dornaweb.ir/,页面中间有一个表格,当你点击它时,它会显示var_dump()$_SESSION['captcha'],就像你一样可以看到,图片中显示的代码与var_dump数据中的代码不同,就像表单提交时$_SESSION领先一步或类似的东西,奇怪的是当我使用完全相同的主题时在本地主机上没有任何问题!

【问题讨论】:

  • 可以看到php-simple-captcha,源码:github.com/claviska/simple-php-captcha/blob/master/…
  • 可能有点远,但值得一试。您缺少的浏览器是否对您的脚本进行了额外的调用?也许是一些 ajax 调用,也许是其他一些启动整个 WP 代码的调用?每当再次运行验证码时,都会在会话中设置一个新代码。您可以检查服务器上的 access.log 文件。如果有两个请求紧随其后,则可能表明请求与验证码混淆...
  • 我在 header.php 中只调用一次之前检查了它...我在这里进行了测试:test.dornaweb.ir(抱歉页面是波斯语),只需提交下面的表格页面,它返回了$_SESSION['captcha']var_dump,可以看到图片中的代码与var_dump( $_SESSION['captcha'] )中的代码不同
  • 好像$_SESSION在表单提交时领先一步
  • 是的,我的波斯语技能不是很好...当我向浏览器 (FF) 询问图片信息时,我得到了一张新图片(新代码)。提交后,会话中的数组表示相同的代码。也许有一些代码请求一个新图像,但没有在页面中显示它?您是否能够在服务器的 access.log 中看到一些奇怪的行为?抱歉,就我所见……

标签: php ajax wordpress captcha


【解决方案1】:

看起来有一些重复的请求(也从提供的 access.log 判断)。这可能是由于服务器上的文件丢失/无法访问(在 localhost 上存在/可访问,因此不会导致问题)。如果请求这样做,一些重写代码(在 WP 中或在 .htaccess 中的 mod_rewrite)会重写“失败”请求并将其发送到主脚本。然后,在主脚本中,会话数据被新的验证码覆盖...

这些问题有时很难发现。开始于:

  • 寻找本地主机和服务器之间的差异

  • 通过跟踪生成的 html 代码中的每个链接并检查它们是否给出预期的响应来查找请求

也许您还可以将一些调试消息写入 error.log 或其他一些日志记录工具。这也可能有助于找到这一点。

抱歉,如果这对您没有任何帮助...

【讨论】:

  • 感谢您的回答,但我还想不通
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2017-11-04
  • 2013-10-01
  • 2020-07-16
相关资源
最近更新 更多