清理Wordpress Metabox字段(POST数组-正确的方法)

问题描述 投票:0回答:1

我正在使用Metaboxes开发wordpress插件。该插件由于对metabox字段进行消毒而被拒绝。

我的save_fields功能

public function save_fields( $post_id ) {
    if ( ! isset( $_POST['modalsettings_nonce'] ) )
        return $post_id;
    $nonce = $_POST['modalsettings_nonce'];
    if ( !wp_verify_nonce( $nonce, 'modalsettings_data' ) )
        return $post_id;
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;
    foreach ( $this->meta_fields as $meta_field ) {
        $userInput = $_POST[ $meta_field['id'] ];
        if ( isset( $userInput ) ) {
            switch ( $meta_field['type'] ) {
                case 'email':
                    $userInput = sanitize_email( $_POST[ $meta_field['id'] ] );
                    break;
                case 'text':
                    $userInput = sanitize_text_field( $_POST[ $meta_field['id'] ] );
                    break;
            }
            update_post_meta( $post_id, $meta_field['id'], $userInput );
        } else if ( $meta_field['type'] === 'checkbox' ) {
            update_post_meta( $post_id, $meta_field['id'], '0' );
        }
    }
}

wordpress审核小组的评论

必须清除,转义和验证数据

[当您在插件中包含POST / GET / REQUEST / FILE调用时,对它们进行消毒,验证和逃生很重要。这里的目标是防止用户意外地通过系统,并保护他们免受潜在的安全问题。

SANITIZE :(由用户或自动输入的)数据必须尽快消毒。这减少了XSS的可能性释放发布数据的漏洞和MITM攻击。

VALIDATE:无论如何,所有数据都应经过验证。即使你进行消毒,请记住,您不希望有人在唯一有效的值是数字。

ESCAPE:输出的数据必须正确转义回显,因此它不能劫持管理员屏幕。 esc _ *()很多可以用来确保您不会向别人显示错误的功能数据。

为了帮助您解决此问题,WordPress附带了许多清理方法和转义功能。您可以在这里阅读有关内容:

https://developer.wordpress.org/plugins/security/securing-input/https://developer.wordpress.org/plugins/security/securing-output/

记住:您必须对上下文使用最合适的功能。如果要对电子邮件进行清理,请在输出时使用sanitize_email()HTML,使用esc_html(),依此类推。

这里一个简单的口头禅是:

清除早期逃逸延迟始终验证

清理所有内容,检查所有内容,逃避所有内容,从不信任用户必须始终输入理智的数据。毕竟,用户来自各行各业。

来自您插件的示例:

stylistic-modals / admin / metaboxes.php:202:$ userInput = $ _POST [$ meta_field ['id']]; if(isset($ userInput)){切换($ meta_field ['type']){case'email':$ userInput = sanitize_email($ _POST [$ meta_field ['id']]);打破;案例'文本':$ userInput =sanitize_text_field($ _POST [$ meta_field ['id']]);打破; }update_post_meta($ post_id,$ meta_field ['id'],$ userInput);

由于稍后保存$ userInput,因此必须对其进行清理。

我该怎么办?

我没有更多的想法,Wordpress想要我什么,何时应该清理字段...同样,如果我搜索示例,我也发现了这种清理$ _POST数组的方法。...

你有什么想法吗?

编辑:可以使用吗?

public function save_fields( $post_id ) {
    if ( ! isset( $_POST['modalsettings_nonce'] ) )
        return $post_id;
    $nonce = $_POST['modalsettings_nonce'];
    if ( !wp_verify_nonce( $nonce, 'modalsettings_data' ) )
        return $post_id;
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;
    foreach ( $this->meta_fields as $meta_field ) {
        if ( isset( $_POST[ $meta_field['id'] ] ) ) {
            $sanitizedUserInput = "";
            $sanitizedMetaFieldID = "";
            switch ( $meta_field['type'] ) {
                case 'email':
                    $sanitizedUserInput = sanitize_email( $_POST[ $meta_field['id'] ] );
                    $sanitizedMetaFieldID = sanitize_email( $meta_field['id']);
                    break;
                case 'text':
                    $sanitizedUserInput = sanitize_text_field( $_POST[ $meta_field['id'] ] );
                    $sanitizedMetaFieldID = sanitize_text_field( $meta_field['id']);
                    break;
                default:
                    $sanitizedUserInput = sanitize_text_field( $_POST[ $meta_field['id'] ] );
                    $sanitizedMetaFieldID = sanitize_text_field( $meta_field['id']);
            }
            update_post_meta( $post_id, $sanitizedMetaFieldID, $sanitizedUserInput );
        } else if ( $meta_field['type'] === 'checkbox' ) {
            $sanitizedMetaFieldID = sanitize_text_field( $meta_field['id']);
            update_post_meta( $post_id, $sanitizedMetaFieldID, '0' );
        }
    }
}
php wordpress sanitization
1个回答
1
投票

嗯,您需要在$userInput = $_POST[ $meta_field['id'] ];语句之前在此处分配if。然后,您有一个switch语句。现在,说,由于某种原因,php执行流无法访问switch语句。

接下来,php执行流程到达此处:

update_post_meta( $post_id, $meta_field['id'], $userInput );

这意味着$userInput变量不会被清除。这可能是原因。希望对您有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.