我目前正在开发我的第一个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;
}
}
提前非常感谢您。请客气一点,因为这是我的第一个插件。
最合适的回答,由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 (检查用户意图)在插件中的适当位置。