出于某些原因,我正在尝试创建一个没有设置API的管理选项页面。如果我这样做了,我听说我需要使用nonce来保证安全性。我想知道正确的使用方法。
这是我通过以下页面尝试的内容:Using nonce external of WP Admin管理
<?php
/*
Plugin Name: Demo for Using Nonce
Description: Demo plugin demonstrating how to use nonce
Author: Teno
*/
// define constants
define("DEMONONCE", "demo_nonce");
define("DEMONONCEPAGESLUG", "demo_nonce_adminpage");
// create an option array
$arrOption = get_option(DEMONONCE);
update_option(DEMONONCE, array_merge(array(), is_array($arrOption) ? $arrOption : array()));
// admin menu
add_action(\'admin_menu\', \'demo_nonce_adminmenu\');
function demo_nonce_adminmenu() {
add_options_page(\'Demo Plugin Menu for Nonce without Settings API\', \'Demo Plugin Menu for Nonce without Settings API\', \'manage_options\', DEMONONCEPAGESLUG, \'demo_nonce_adminpage\');
}
// admin page
function demo_nonce_adminpage() {
$options = get_option(DEMONONCE);
print_r($_POST); // for debugging
echo \'<br />\';
if(isset($_POST[DEMONONCE][\'submitted\']) && !wp_verify_nonce($_POST[\'name_of_nonce_field\'], \'name_of_my_action\')){
return;
}
if(isset($_POST[DEMONONCE][\'submitted\']) && $_POST[DEMONONCE][\'submitted\'] == 1){
if (strlen(trim($_POST[DEMONONCE][\'option_a\'])) == 0) {
$options[\'invalid\'] = True;
echo \'<div class="error settings-error"><p>Options are not saved.</p></div>\';
} else {
$options = array_merge($options, $_POST[DEMONONCE]); // it seems the tab caption is erased here
update_option(DEMONONCE, $options);
echo \'<div class="updated"><p>Updates are saved.</p></div>\';
}
}
?>
<div class="wrap">
<?php // heading
screen_icon(); ?> <h2>Demo Plugin for Nonces without Settings API</h2>
<h3>Page 1</h3>
<form method="post" action=""> <?php // \'action=""\' means to send the form post data to this page itself. ?>
<?php wp_nonce_field(\'name_of_my_action\', \'name_of_nonce_field\'); ?>
<input type="hidden" name="<?php echo DEMONONCE; ?>[submitted]" value="1" />
<table class="form-table">
<tbody>
<tr valign="top">
<th scope="row">Option A</th>
<td>
<input name="<?php echo DEMONONCE; ?>[option_a]" size="40" type="text" value="<?php echo $options[\'invalid\'] ? $_POST[DEMONONCE][\'option_a\'] : $options[\'option_a\']; ?>" />
<?php echo ($options[\'invalid\'] && $options[\'invalid\'] ) ? \'<font color="red">* cannot be blank.</font>\' :\'\' ?>
</td>
</tr>
<tr valign="top">
<th scope="row">Option B</th>
<td>
<input name="<?php echo DEMONONCE; ?>[option_b]" size="40" type="text" value="<?php echo $options[\'invalid\'] ? $_POST[DEMONONCE][\'option_b\'] : $options[\'option_b\']; ?>" />
</td>
</tr>
</tbody>
</table>
<?php submit_button(); ?>
</form>
</div> <!-- end the admin page wrapper -->
<?php
}
?>
我放置
if(isset($_POST[DEMONONCE][\'submitted\']) && !wp_verify_nonce($_POST[\'name_of_nonce_field\'], \'name_of_my_action\')){
return;
}
在显示表单和放置
<?php wp_nonce_field(\'name_of_my_action\', \'name_of_nonce_field\'); ?>
在表单标记中。
我还是不确定这一切是否都好。“name\\u of\\u nonce\\u field”和“name\\u of\\u my\\u action”应该输入什么字符串?他们会是我叫什么名字?
除了nonces之外,我还应该做些什么来创建更安全的管理页面?
最合适的回答,由SO网友:Jake 整理而成
这是插件的一个非常基本的nonce设置:
在表单中创建nonce输入:
wp_nonce_field( basename(__FILE__), $nonce_key );
然后在提交后检查您的nonce:
if ( empty($_POST[$nonce_key]) || ! wp_verify_nonce( $_POST[$nonce_key], basename(__FILE__) ) ) return;
基本名称(
FILE) 只需使用当前文件名(例如:plugin\\u options.php)来创建nonce字符串。您需要提供一个字符串,nonce函数将使用该字符串创建任务特有的数字。用于创建nonce编号的字符串必须与您使用的字符串相同,请检查它。
您也可以创建一个自定义字符串,例如:“demononce9384374”,只要您可以使用它创建nonce,然后稍后检查它。它可以在插件中保持不变,永远不需要更改。nonce使用其他变量更改nonce字符串,如用户id和时间。
在我的例子中,“basename”(FILE)“是我的字符串,将保持不变,除非我设置并签入两个不同的文件,否则会导致问题。
所以你的例子应该很有用。
我觉得你很有掩护。在“add\\u options\\u page”功能中概述正确的功能(manage\\u options)并正确检查nonce应该很好。
Edit: Escaping
我突然想到我留下了一个关于安全的话题:逃跑
将信息输出到用户提交的页面时,即使是在后端。
这两个函数是我最常用的:esc\\u attr()&;esc\\u html()
您还可以使用esc\\u attr\\uuuuu()或esc\\u attr\\u e()添加翻译(&;esc\\u html\\uUuUu()或esc\\u html\\u e()
例如:
value="<?php echo $options[\'invalid\'] ? esc_attr($_POST[DEMONONCE][\'option_a\']) : esc_attr($options[\'option_a\']); ?>"
更多信息:
http://markjaquith.wordpress.com/2009/06/12/escaping-api-updates-for-wordpress-2-8/