我正在使用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' );
}
}
}
嗯,您需要在$userInput = $_POST[ $meta_field['id'] ];
语句之前在此处分配if
。然后,您有一个switch
语句。现在,说,由于某种原因,php执行流无法访问switch
语句。
接下来,php执行流程到达此处:
update_post_meta( $post_id, $meta_field['id'], $userInput );
这意味着$userInput
变量不会被清除。这可能是原因。希望对您有帮助。