自定义表单中的随机数未进行验证

时间:2020-07-16 作者:breadwild

我有一个调用html表单的短代码:

function add_signup_form () {
    require_once ( "apps/registration_form.php");
    return signup_form();
}
add_shortcode( \'add_signup_form\', \'add_signup_form\' );
表单在WordPress页面上加载得很好。但是,当提交表单时,nonce没有进行验证。

function signup_form() {     
    $form = \'<form action="\'.plugins_url().\'/sunday-signup/apps/save_registration.php" method="post" id="setting">
                 \' . wp_nonce_field( "register","registration_nonce" ). \'  
    ...
    <input type="submit" name="submit_registration" value="Save Reservation" class="button">
    </form>\';
    
    return $form;
}
正在处理中。php我能够print_r($_POST) 并查看nonce和其他字段的值,但我的条件不满足:

if ( isset($_POST[\'submit_registration\']) ) {

    if ( wp_verify_nonce( $_POST[\'registration_nonce\'], \'register\' ) ) {
我已经做过很多次了,但从来没有使用过短代码。这就是问题所在吗?

Update:

事实证明,它与名词无关,但WordPress的所有功能都是;未定义"E;一旦我在脚本的顶部添加了以下内容,一切都正常了。

require_once $_POST[\'root_dir\'].\'/wp-load.php\';

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

不确定这是否回答了问题,但你应该打电话wp_nonce_field() 使用第四个参数($echo) 设置为false:

// You are concatenating or not directly echoing the output, so:
. wp_nonce_field( \'register\', \'registration_nonce\', true, false ) .
我说;“不确定”;因为你说发布的数据($_POST) 没有包括nonce字段,因此请检查表单源(HTML),并确保nonce字段没有被使用两次或更多次,例如:。

<!-- \'register\' action: wp_nonce_field( \'register\', \'registration_nonce\', true, false ) -->
<input ... name="registration_nonce" value="nonce" />
...
<!-- A different action: wp_nonce_field( \'foo-bar\', \'registration_nonce\', true, false ) -->
<input ... name="registration_nonce" value="nonce2" />
所以在这种情况下,假设有效的操作是register, 然后wp_verify_nonce( $_POST[\'registration_nonce\'], \'register\' ) 将失败,因为上面的第二个nonce字段(对于foo-bar 操作)覆盖第一个(针对register 操作)。

更新,以便确认确实发生了重复的nonce字段问题,但现在在修复该问题后,您将得到错误500 在表单处理页面上,我假设这是您的自定义sunday-signup/apps/save_registration.php 文件

如果是这样,那么您实际上不应该提交到静态PHP文件。相反,使用WordPress中的一个早期(或页面加载时)挂钩,如template_redirect 处理表单提交。

// Example using the template_redirect hook:
add_action( \'template_redirect\', function () {
    if ( isset( $_POST[\'submit_registration\'], $_POST[\'registration_nonce\'] ) ) {
        if ( wp_verify_nonce( $_POST[\'registration_nonce\'], \'register\' ) ) {
            // your code here
            // ...

            // then redirect back, maybe..
            wp_redirect( wp_get_referer() );
            exit;
        } else {
            echo \'test error\';
            exit;
        }
    }
} );
上面的示例应该可行,但处理表单提交的实际代码完全取决于您自己。你一定要打电话wp_verify_nonce() 以及其他WordPress功能。

相关推荐

在第三方API响应后发送Gravit Forms通知

我有一个重力表单,在提交时将数据发送给第三方API。它与以下代码连接并通过API保存数据。然而,我现在正试图弄清楚,只有当API响应返回为失败或状态代码201以外的任何内容时,才如何发送管理员通知电子邮件。add_action( \'gform_after_submission_1\', \'post_to_third_party\', 10, 2 ); function post_to_third_party( $entry, $form ) { $post_url =