清理、验证和转义WordPress(插件)

时间:2021-03-20 作者:Jonas

我目前正在开发我的第一个WordPress插件。几天前,我把它提交给WordPress审查。不幸的是,插件还没有发布,因为我还需要解决一些安全问题。更具体地说,它是关于数据必须经过清理、转义和验证的事实。

不幸的是,我在开发过程中完全忘记了这一点。现在,我已经通过文档熟悉了上述原则,我想我现在已经理解了它们,但是我仍然不确定如何在某些地方实际应用这些原则。

1. Highlight the active menu item

为了突出显示活动菜单项,我编写了一个小助手函数:

protected function get_current_site() {
    $page = $_GET[\'page\'];
    return $page;
}
该函数用于标题:

<li <?php if($this->get_current_site() == \'myplugin-settings\') { echo \'class="active"\'; } ?>><a href="?page=myplugin-settings">Settings</a></li>
我如何在这里应用这三个原则(消毒、转义和验证)?

2. Toggle status via AJAX

为了更改插件的状态,我通过AJAX使用了一个小函数。此处$\\u POST[“active”]包含0或1:

$this->loader->add_action(\'wp_ajax_toggle_myplugin\', $this, \'toggle_myplugin\');

public function toggle_myplugin() {
    $active = $_POST["active"];
    $status = update_option(\'myplugin_status\', $active);
    echo $status;
    wp_die();
}
我如何在这里应用这三个原则(消毒、转义和验证)?

3. Dynamic rendering of a template

我使用GET变量在插件的特定页面上输出不同的模板:

public function render_template() {
    if(isset($_GET[\'action\'])) {
        $action = $_GET[\'action\'];
        switch($action) {
            case("edit"):
                include MYPLUGIN_ROOT_PATH . \'includes/admin/templates/template1.php\';
                break;
            case("add"):
                include MYPLUGIN_ROOT_PATH  . \'includes/admin/templates/template2.php\';
                break;
            default:
                include MYPLUGIN_ROOT_PATH  . \'includes/admin/templates/template3.php\';
        }
    }
}
如何检查action 变量

4. Check value from an hidden input-field

我使用隐藏输入字段传递隐藏值(在我的示例中是ID):

<input type="hidden" name="id" value="<?php echo $id; ?>">

public function actions() {
    if($_SERVER[\'REQUEST_METHOD\'] == \'POST\') {
        $action = $_POST["action"];
        switch($action) {
            case "edit":
                $id = $_POST["id"];
                $name = $_POST["name"];
                [...]
                break;
            case "add":
                $name = $_POST["name"];
                [...]
                break;
    }
}
提前非常感谢您。请客气一点,因为这是我的第一个插件。

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

现在,我已经通过文档熟悉了上述原则,我想我现在已经理解了它们

我不知道您阅读了哪些文档,但您应该检查Plugin Security section 在插件开发人员手册中。

我在您的代码中注意到了三个主要问题:

在尝试使用之前$_GET$_POST 变量,您应该检查它是否已设置。

例如get_current_site() 函数,而不是$page = $_GET[\'page\'];, 您应该执行以下操作:

$page = isset( $_GET[\'page\'] ) ? wp_unslash( $_GET[\'page\'] ) : \'\';
toggle_myplugin() 功能,您应该sanitize 选项值(更新选项之前),使用以下函数sanitize_text_field():

$active = isset( $_POST[\'active\'] ) ? sanitize_text_field( $_POST[\'active\'] ) : \'\';
escape 使用以下函数的输入值esc_attr(). 因此echo $id;, 您将使用echo esc_attr( $id );:

<input type="hidden" name="id" value="<?php echo esc_attr( $id ); ?>">
因此,我希望这会有所帮助,如果您需要任何澄清,请随时询问,并且按照插件手册的建议,考虑checking user capabilities 和使用nonces (检查用户意图)在插件中的适当位置。