我在代码中看到的第一个问题是,您假设$_POST[\'mh_action\']
是字符串,来自$_POST
你永远不能确定那是真的。
如果这是一个数组,你不能sanitize_text_field( $_POST[\'mh_action\'] )
不会触发错误。
第二个问题是do_action
不返回任何内容。这意味着你正在改变超全球化$_POST
直接,我强烈建议你避免。
其中一个原因是处理数据的代码需要访问$_POST
即使您使用操作进行了清理,只查看使用数据的代码,也不会不清楚。
此外,其他一些代码(可能是恶意的,也可能不是)可能总是remove_action( \'mh_foo\' )
您的“foo”字段永远不会被转义,因此访问$_POST[\'mh_foo\']
并对其进行处理,将处理潜在的不安全数据。
你应该做的是从$_POST
, 提取感兴趣的数据,验证它们(预期的字符串是字符串…)之后,您可以将validate数据作为参数传递给processing函数,在这里您可以首先清理它,然后使用它,例如存储、显示。。。
只是概念证明:
function mh_post_action() {
$action = isset($_POST[\'mh_action\']) ? $_POST[\'mh_action\'] : \'\';
if ( ! $action ) {
return;
}
$validated_action = mh_post_action_validate( $action );
if ( ! $validated_action ) {
// handle the error
return;
}
mh_post_action_process( $validated_action );
}
function mh_post_action_validate( $action ) {
// as example I\'m validating it is a string that starts with "mh_"
if ( is_string( $action ) && strpos( $action, \'mh_\' ) === 0 ) {
return $action;
}
return \'\';
}
function mh_post_action_process( $action ) {
$sanitized_action = sanitize_text_field( $action );
// process sanitized_action here
}
add_action( \'init\', \'mh_post_action\' );
现在如果我看
mh_post_action
我可以清楚地看到数据来自
$_POST
正在验证,我可以清楚地看到
mh_post_action_process()
在对数据进行任何操作之前,请先对其进行清理。
我认为,您可以轻松地将现有函数转换为遵循这样的方案,并且您将提高代码的可读性(这对您有好处)、可理解性(这对wp.org审查团队有好处)和安全性(这对每个人都有好处)。