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

Php 清理Wordpress元盒字段(POST数组)-正确的方法,php,wordpress,sanitization,Php,Wordpress,Sanitization,我正在开发一个带有Metaboxes的wordpress插件。由于对metabox字段进行了清理,插件被拒绝 我的保存字段功能 wordpress审查小组的评论 数据必须经过消毒、转义和验证 当您在插件中包含POST/GET/REQUEST/FILE调用时,它是 对它们进行消毒、验证和逃避很重要。这里的目标是 防止用户意外地通过发送垃圾数据 系统,以及保护他们免受潜在的安全问题 清理:用户输入或自动输入的数据必须 尽快进行消毒。这减少了XSS的可能性 发布的数据被破坏的漏洞和MITM攻击 验证:

我正在开发一个带有Metaboxes的wordpress插件。由于对metabox字段进行了清理,插件被拒绝

我的保存字段功能

wordpress审查小组的评论

数据必须经过消毒、转义和验证 当您在插件中包含POST/GET/REQUEST/FILE调用时,它是 对它们进行消毒、验证和逃避很重要。这里的目标是 防止用户意外地通过发送垃圾数据 系统,以及保护他们免受潜在的安全问题

清理:用户输入或自动输入的数据必须 尽快进行消毒。这减少了XSS的可能性 发布的数据被破坏的漏洞和MITM攻击

验证:无论发生什么情况,都应验证所有数据。即使你 消毒,记住你不希望有人在 唯一有效的值是数字

转义:输出的数据在传输时必须正确转义 回音已经消失了,所以它不能劫持管理员屏幕。有许多电子稳定控制系统_* 可以用来确保不会向人们展示错误的功能 数据

为了帮助你做到这一点,WordPress附带了一些消毒措施 和转义函数。您可以在此处阅读这些内容:

记住:您必须为上下文使用最合适的函数。 如果您正在清理电子邮件,如果您正在输出,请使用清理电子邮件 HTML,使用esc_HTML,等等

这里有一个简单的咒语:

早清理、早逃逸、晚验证

清理一切,检查一切,逃避一切,永远不要信任 用户必须始终具有输入的正常数据。毕竟,用户来自中国 各行各业

插件中的示例:

style modals/admin/metaboxes.php:202:$userInput=$\u POST[ $meta_字段['id'];如果设置为$userInput{开关 $meta_字段['type']{case'email':$userInput=sanitize_email $\u POST[$meta\u字段['id']];break;大小写'text':$userInput= 清理_text_field$_POST[$meta_field['id']];中断;} 更新_post_meta$post_id,$meta_字段['id'],$userInput

因为以后要保存$userInput,所以必须对其进行清理

我能做什么

我不知道Wordpress想从我这里得到什么,我什么时候应该清理这些字段…如果我搜索示例,我发现这样可以清理$\u POST数组

你知道吗

编辑:这行吗?
好的,在if语句之前有一个赋值$userInput=$\u POST[$meta\u field['id']];然后有一个switch语句。现在,比方说,由于某些原因,php执行流无法访问switch语句

接下来,php执行流将到达以下位置:

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

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

So..最好只在带有$userInput变量的switch语句中添加一个默认语句,并删除if语句之前的声明?好的,您可以在if语句中声明一个新变量,$sanitizedUserInput=例如,然后更改switch语句中的其他语句,并最终将其传递到update_post_meta$post_id,$meta_字段['id'],$sanitizedUserInput。谢谢!我已经编辑了我的主要帖子。新的示例可以工作吗?嗯,这应该可以工作。但是您可能需要清理meta_key$meta_字段['id']在另一种情况下。是的!在我看来这是万无一失的。
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' );
        }
    }
}
update_post_meta( $post_id, $meta_field['id'], $userInput );