如果您知道操作名称,wp_nonce_field是否易受攻击?

时间:2014-04-20 作者:yeahman

如果知道操作名称,wp\\u nonce\\u字段是否易受攻击?实际上,我在表单中添加了一个隐藏字段,名称=操作名称的名称,以便我的插件可以识别它。我想知道如果我将我的操作名称设置为“可见”,是否存在安全问题?

编辑:我实际上是在自动化我的表单提交工作流;因此,如果需要显示操作名称,我可以对其进行加密。例如,我打电话MyFormPlugin::generateAction( \'submitQuestion\' ); 在我的表单中生成nonce和隐藏的“form\\u action”操作字段。

class MyFormPlugin{

    public static function generateAction( $action, $referer = true ){
        $nonce_field = wp_nonce_field( self::secured_action( $action ), "mfp_nonce" , $referer , FALSE );
        return $nonce_field.\'<input type="hidden" name="form_action" value="\'.$action.\'"/>\';
    }

    public static function secured_action( $action ){
        return md5( $action.\'randomsalt\');
    }

    public function verify_nonce( $action ){
        $nonce = $_POST[ \'mfp_nonce\' ];
        return wp_verify_nonce( $nonce, self::secured_action( $action ) );
    }
}
这看起来安全吗?

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

简短回答:不。您可以使用普通字符串进行操作,md5\'ing它们不会改变任何东西。

nonce由三条主要信息组成:

时间:当前time() 除以43200即为nonce。这就是让nonce每12小时更改一次的原因(12小时内43200秒)。

您提供的操作字符串。下面将对此进行详细介绍。

用户ID。每个用户获得不同的nonce。

现在,这些元素被串联起来,然后nonce本身就是wp_hash() 这个组合字符串的。这个wp_hash() 函数会自动对哈希进行盐分,在这种情况下使用NONCE\\u键和NONCE\\u SALT常量,这应该在wp配置中定义。php文件,该文件应该是特定站点的唯一文件。

(请注意,如果您碰巧有默认值“在此处放置您的唯一短语”在该文件中,无论出于何种原因,WordPress都会在内部为键/盐生成随机的64个字符的值,并将其存储在数据库中。它不会将默认值用作实际盐。它也不允许对任何值使用重复的键或盐。不过,您应该在wp配置中定义密钥和盐。php文件,而不是依赖于此。您可以从以下位置获取该文件的随机行:https://api.wordpress.org/secret-key/1.1/salt/)

因此,为了复制nonce,您需要所有这些信息。可以推断出时间和用户ID。操作字符串可能已知。但是salt是一个秘密值,攻击者不应该知道它,这使得复制nonce是不可行的。

也就是说,“action”字符串应该尽可能地唯一于特定情况。每个操作都应该有所不同,比如delete\\u thing、update\\u thing和create\\u thing。如果它作用于某个特定的事物,那么它应该包含一些“ID”,比如针对该特定事物的“delete_thing_123”。

在操作字符串中包含复杂数据并不一定会增加任何真正的安全性,比如MD5哈希。nonce已经使用带有salt秘密值的HMAC消息摘要方法构建。但是,对于相同的操作,nonce将是相同的,因此该操作应该特定于该情况,以便使nonce在多个情况下不可预测。用于删除一个项目的nonce不会删除任何项目、类型的东西。

还要注意,生成nonce的操作值应该完全由内部生成。在任何情况下,都不应使用用户输入来确定生成nonce的操作。如果用户可以注入数据来确定操作字符串,那么他们可以提前获得nonce。nonce需要是唯一的静态字符串,可能连有ID。

TL;DR:使用带有ID的普通字符串(如果有ID有意义的话)。一切都很好。

结束

相关推荐

Using Nonce for my Form

基本上,我需要使用nonce来验证我的数据,但我不确定我做得是否正确。我要做的是删除非管理员用户的菜单选项。如果选中复选框并提交表单,则无法管理选项的任何人都将删除该菜单项。编辑:在此处发布了我的代码,而不是要点:<?php /* Plugin Name: Developer Mode Tools 02 Author: Tyler Gerig Version: 1.1 Description: Add developer mode options to you