在没有设置API的情况下正确使用随机数字段

时间:2012-08-22 作者:Teno

出于某些原因,我正在尝试创建一个没有设置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之外,我还应该做些什么来创建更安全的管理页面?

1 个回复
最合适的回答,由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/

结束

相关推荐

如果我删除wp_options表中的所有临时记录,会破坏我的站点吗?

我的网站目前在wp\\U选项表中有超过500k的瞬态记录。这会导致表频繁崩溃,我的站点也是如此。我以为暂时的记录过一段时间就会全部过期。我还不确定哪些插件应该负责,哪些插件出了问题。然而,我不希望我的网站像这样频繁崩溃。中的记录数wp_options 几周前,该表已大幅增加至20万以上,现在已增加至50万以上。我应该只删除%transient_timeout% 记录-目前有20多万条?任何帮助都将不胜感激。Updates on 16th July 2012实际上,我冒了风险(我先备份了我的网站),删除了所