信科网络 · 11 年只做 WordPress | 建站 / 主题 / 插件 / 商城 / 迁移 / 托管 | 累计服务 3000+ 企业 | 源码全交付
服务热线:13280692153 邮箱:web@wordpressx.com
工作日 08:30-18:0013280692153 免费诊断
首页/WordPress 教程/wp_nonce_field()函数
BLOG

wp_nonce_field()函数

分类 发布 2022-08-19

在wordpress中,为了增加系统的验证安全性,内置了一些简单的验证,这些验证可以有效的防治注册、提交等操作,如果开发者在主题开发中,对数据库进行了操作,一定要使用到这些函数

语法结构

<?php wp_nonce_field($action, $name, $referer, $echo) ?> //为输入框检索或显示随机数隐藏字段

参数

$action(可选)操作名称
$name (可选)Nonce名称
$referer(可选)是否还应使用wp_referer_field()函数创建referer隐藏表单字段,默认值:true
$echo(可选)如果$referer参数设置为true,是显示还是返回nonce隐藏表单字段,还是referer隐藏表单字段。默认值:true

实例

<? php wp_nonce_field(); ?> //最简单的使用方法,省略所有参数,在表单中添加内容,安全性偏低
最好给$action和$name命名,可以较大提高WordPress安全性
<form method =“post”>
   <! - 这里的一些输入......  - >
   <?php wp_nonce_field('name_of_my_action','name_of_nonce_field'); ?>
</form>

Nonce 是 WordPress 安全的一个重要组成部分,但是 Nonce 经常会被误解以及误用。它们是授权一个 HTTP 请求到您的网站的一个关键部分,用来保证你的代码安全。

在这篇文章中,您将了解什么是 nonce,一个 WordPress nonce 是什么,它们是如何能够防御某些类型的攻击,还有他们无法防御的攻击类型,以及如何使用它们。

什么是Nonce 

Nonce 是加密散列,用来验证是否是正确的人或客户端所发送的请求。因为 nonce 是使用一个加密散列算法(例如 md5,sha1,sha2)和某种形式的秘密数据构造的,一般来说不太可能创建一个假的 nonce。

nonce 这个单词意思是:仅使用一次的数字。nonce 安全性的一个关键特性就是一次性使用。即使你拦截获得了一个有效的 nonce,一旦它被使用了,就无法再次使用。这个使得 nonce 对于重复攻击很有效。

就是说,WordPress nonce,并不是真正的 nonce,因为它可以在某段时间内一直有效,可以通过 nonce_life(详见Code Reference) 这个 filter 来定义它从创建开始的时效。这个意味着从技术上讲 WordPress nonce 可以使用不止一次,但仅限这个定义的时间段里。这个是需要谨记在心的区别。
跨站点请求伪造
我们经常认为我们的 WordPress 站点仅仅通过填写表单(如结账表单,文章编辑器,用户个人资料编辑器等等),然后点击提交来接受数据。但是那个仅仅是向一个站点发送 HTTP 请求的许多方法中的一个。

一旦一个表单的结构被摸清,然后就可以写一个脚本来模仿向这个表单发送请求。利用此漏洞来进行攻击的一种方式就是:在另外一个站点放上此表单的假版本,然后提交回原站点,来插入恶意数据。

这个就是一个跨站点请求伪造(CSRF)的攻击例子。它很大程度上可以通过使用 nonce 来避免。即使表单保持一模一样,然而 nonce 字段的值无法猜到。

每个发送给 WordPress 站点的请求,一个选项表单,一个针对 admin-ajax 的请求,Wordpress REST API,或者其他任何可以在站外发起的请求,都应该通过 nonce 来保护。
Nonce 只是整个系统的一部分
需要记住的是:仅验证一个 nonce,对于确定发送的请求是否经过授权是不够的。对于任何一个请求,权限的检验都是必要的。思考下面3个在 WordPress 插件中使用 admin-ajax 保存选项的例子:

<?php
add_action( 'wp_ajax_save_weibo', function(){
    if( isset( $_POST[ 'weibo' ] ) ){
        update_option( 'weibo', strip_tags( $_POST[ 'weibo' ] ) );
    }
});
 
add_action( 'wp_ajax_save_weibo', function(){
    if( current_user_can( 'mange_options' ) && isset( $_POST[ 'weibo' ] ) ){
        update_option( 'weibo', strip_tags( $_POST[ 'weibo' ] ) );
    }
});
 
add_action( 'wp_ajax_save_weibo', function(){
    if( current_user_can( 'mange_options' ) && isset( $_POST[ 'weibo-save-nonce' ],  $_POST[ 'weibo' ] ) && wp_verify_nonce( $_POST[ 'weibo-save-nonce' ], 'weibo-save-nonce' ) ){
        update_option( 'weibo', strip_tags( $_POST[ 'weibo' ] ) );
    }
});
?>

第一个例子允许任何拥有有效 cookie 的任何角色的用户来更新这个选项。如果你在 WordPress 站点使用这个代码,而我注册为一个订阅者,我可以登录到这个网站,获得我的 cookie,然后就可以使用浏览器控制台或者在我的 terminal 中使用 cURL 来修改这个选项。这是非常不安全的做法。

wp_nonce_field()函数

第二个例子会好一些,但是仍然不安全。这个代码中没有 nonce,但是它正确的检查了当前用户的权限。没有 nonce,正如我们前面讲的会受到跨站点请求伪造的攻击影响。这段代码就是钓鱼攻击网站的邀请函啊。

第三个例子增加了一个 nonce,这是正确的做法。如果我有个管理员 cookie 设置,同时我轻易被钓鱼网站欺骗了,这时候 nonce 将会起作用,让它通过不了,也就不会造成任何破坏。

Nonce 配合着身份验证一起工作,这样就无法跳过这一个或者另一个验证了。
使用 Nonce
WordPress 有着一系列的函数来和 nonce 配合工作。其中两个最重要的函数是 wp_create_nonce() 和 wp_verify_nonce。都可以为动作执行(action)传入可选参数。你应当始终为你的请求设置唯一的动作执行(action)。这意味着你的 nonce 不可以用来重复验证另外一种类型的请求。

对于 nonce 在表单中使用,有一个助手函数(helper function)叫 wp_nonce_field(),可以用来创建一个 nonce 隐藏字段。下面这个表单可以和上面例子配合:

<form id="weibo-form">
    <label for="weibo-name">
        <?php esc_html_e( 'Weibo', 'text-domain' ); ?>
    </label>
    <input type="text" id="weibo-name" value="<?php echo esc_attr( get_option( 'weibo', '')  ); ?>" />
    <?php
        wp_nonce_field( 'weibo-save-nonce' );
        submit_button( __( 'Save', 'text-domain' ) );
    ?>
</form>
<script>
    jQuery( document ).ready(function($){
        $( '#weibo-form' ).on( 'click', function(e){
            $.post( ajaxurl, {
                'weibo-save-nonce' : $( '#_wpnonce' ).val(),
                weibo: $( '#weibo-name')
            })
        });
    });
</script>

这个将会用在只有管理员可以看到的菜单页面。因此 nonce 在被使用输出到屏幕显示的时候,只有管理员可以看到。在 admin-ajax 的回调函数中,nonce 验证和权限验证,结合 WordPress 对用户 cookie 的验证,一起来保证安全。

在这个例子中,我们使用了 AJAX 来提交表单,但是对于同步 HTTP 请求,这个过程是一样的。
现在就开始使用 Nonce
这就是关于 nonce 的一切了。为了提高 WordPress 网站的安全性,记住,无论如何都要使用 Nonce。

在我总结之前,还有另外两个观点需要说的是:

关于 Nonce 有一个重要的事情需要谨记在心的是,nonce 其中的一个组成部分就是当前用户的 ID,如果没有登录就是 0。这个意味着 nonce 在用户之间不可分享。这个可能会让人产生困惑,就是如果 nonce 在用户身份验证之前验证,那么正确的 nonce 将会无效。当一个 nonce 伴随着 WordPress REST API nonce 用来验证 cookie 身份验证被使用时,这就是一个会发生的问题。

另外一个重要的事情需要记住的是,nonce 会受到 PHP 计时攻击的影响。这就是为什么 WordPress 用户需要故意使用低效率的函数 hash_equals() 替代简单高效的字符串比较。你可能产生过通过生成一个期望的值然后用字符串比较来验证一个 nonce 的念头。然而,我建议你不要尝试和优化 nonce 验证的过程。

就这么多,仅仅简单地介绍了如何使用 nonce。我希望通过这篇文章你可以看到 nonce 是多么的简单,以及对于保证你的代码和站点安全是多么的重要。

INDUSTRIAL BELT

扎根中国制造产业带
懂工厂,才懂出海

从胶东半岛到珠三角,从长三角到中原腹地,每一片产业集群都有自己的出口节奏与买家画像。信科网络长期扎根产业一线,把工厂的产品语言翻译成海外采购商听得懂的搜索语言,让每一分投入都对着真实的询盘去。

tongnan

潼南外贸网站建设

潼南县位于重庆市西北部最前沿。是川渝握手区腹地东西南北交通自然便捷走向的交汇点及区域几何中心,是成渝经济区的腹地中心,是重庆西部凸入川中腹地最远、毗邻四川县市最多的对外开放最前沿…

yuanzhou

原州外贸网站建设

原州区,隶属于宁夏回族自治区固原市,地处宁夏南部,六盘山东北麓,黄土高原中西部,东邻彭阳县,南接泾源县,西连西吉县,北靠海原县、同心县,东北、西南分别与甘肃环县、隆德县毗壤,是固…

beibei

北碚外贸建站

北碚区位于重庆市区西北郊的缙云山下,嘉陵江畔,幅员面积753平方公里,人口63万,是重庆的风景旅游区和智力型清洁工业基地。本世纪20年代末,由爱国实业家卢作孚先生开拓,抗战时期为陪都重庆…

pengyang

彭阳外贸建站

彭阳县位于宁夏回族自治区,位于宁夏回族自治区南部边缘,六盘山东麓,介于东经106°32′-106°58’之间,北纬35°4l’-36°17’。西连宁夏固原市原州区,东、南、北环临甘肃…

wushan

巫山WordPress建站

巫山位于重庆市东北部,三峡库区腹心,素有“渝东门户”之称,地跨长江巫峡两岸。东邻湖北省巴东县,西接奉节县,南与湖北省建始县毗连,北与巫溪县及神农架林区接壤。县城位于大宁河与长江交汇…

tongliang

铜梁WordPress建站

重庆市铜梁县位于四川盆地东南部、重庆西北部,唐长安四年(公元704年)建县,因境内“小铜梁山”而得名,是国际主义战士邱少云的故乡和蜚声中外的铜梁龙的发祥地。全县幅员面积1334平方公里,辖…

jingxian

景县Shopify建站

景县位于河北省东南部,大运河西岸,全县辖9镇7乡,849个行政村,总面积1183平方公里。全县呈簸箕形,由西南向东北逐渐倾斜坦,最高点海拔25米,最低点14.1米。属暖温带半湿润大陆性气候,四季…

cangxian

沧县Shopify建站

沧县位于河北省东南部,冀中平原东部,北冀京津,东邻渤海,地理坐标在北纬38°5′至38°3′,东经116°27′至117°9′之间。县政府驻沧州市新华区,全县总面积1527平方公里,其中耕地面积129万亩,总…

rongcheng

容城外贸推广

河北省容城县,历史悠久,距今已有2000年的历史,全县总面积314平方公里,总人口25万人。地理位置得天独厚。位于河北省中部,京、津、保腹地,距首都北京和天津直辖市均为120公里,两个小时的…

jizhou

冀州外贸推广

冀州市隶属河北省衡水市,地处华北平原腹地,北距首都300公里,西距省会石家庄110公里,辖区总面积918平方公里,东与枣强县(衡水)为邻,南与南宫市、新河县(邢台)接壤,西与宁晋县(邢台)…

zhongxian

忠县Google SEO

忠县隶属于重庆市,位于重庆市中部,辖28个乡镇。忠县历史悠久,资源丰富,盛产柑橘。综合多种产业,近年来正快步发展中  

yanchi

盐池Google SEO

山西省运城市即古河东盐池,亦称解池。地处运城盆地之南,中条山北麓,自东北向西南延伸,长约30公里,宽3——5公里,面积130平方公里,是由鸭子池、盐池、硝池等几个部分组成,湖面海拔324.5米…

qianjiang

黔江GEO优化

重庆市黔江区位于重庆市的东南边缘,地处武陵山腹地,东临湖北省的咸丰县,西界彭水县,南连酉阳县,北接湖北利川市,是渝、鄂、湘、黔四省市的结合部,素有”渝鄂咽喉”之称。另外…

jiangbei

江北GEO优化

江北区,隶属于重庆市,是主城核心区之一。位于长江、嘉陵江交汇处北岸,东南西三面分别与巴南、南岸、渝中、沙坪坝四区隔江相望,北与渝北区接壤。至2015年底,江北区幅员面积为220.77平方千…

xixia

西夏谷歌SEM

西夏区是宁夏回族自治区银川市的一个市辖区,位于银川市西部,地理坐标东经105°49′~106°18′,北纬38°08′~38°52′。西夏区东起包兰铁路,西至贺兰山口轴线(宁蒙界),南临永宁县,北接贺兰县,…

shapotou

沙坡头谷歌SEM

沙坡头:国家AAAAA级旅游景区,国家级沙漠生态自然保护区,全球环保500佳单位,全民健身二十个著名景观,科技进步特别奖。沙坡头位于宁夏回族自治区中卫市城区西部腾格里沙漠的东南缘。东起二…

xiongxian

雄县Facebook广告

河北省保定市雄县位于东经116°06',北纬38°59'。平均海拔10米。处于冀中平原的京、津、保三角腹地,南倚“华北明珠”白洋淀,北靠“京南小香港”___白…

xiushan

秀山Facebook广告

秀山土家族苗族自治县,位于重庆市东南部,武陵山脉中段,四川盆地东南缘的外侧,为川东南重门户。与湖南省、湖北省、贵州省毗邻,326国道和319国道贯穿全县。距长沙604公里、武汉656里、贵阳5…

banan

巴南Yandex推广

巴南区的前身是千年历史名邑巴县。早在3000多年前的商代,巴人就在此繁衍生息,立国建都。秦代置巴郡,南朝齐代置垫江县,北周时改称巴县并沿袭至1995年。1995年经国务院批准撤县建区,成立巴…

taole

陶乐Yandex推广

陶乐镇是中华人民共和国宁夏回族自治区石嘴山市平罗县下辖的一个乡镇级行政单位。陶乐镇位于宁夏回族自治区石嘴山市。陶乐镇生态新农居是石嘴山市政府重点扶持的“社会主义新农村建设”项目。陶…

hengshui

衡水TikTok推广

衡水市位于河北省东南部,东与沧州市和山东省德州市毗邻,西与石家庄市接壤,南与邢台市相连,北与保定市交界;南北长125.5公里,东西宽98.13公里,全市辖8县2市1区,总面积5815.4平方公里。衡…

为什么一定要选懂产业带的出海服务商?建材丝网的欧洲建筑商看资质与交期,工业橡塑的中东工程商问耐温与工况,毛皮服饰的俄罗斯分销商算的是季节与毛利。买家不同,决策逻辑就不同;信科网络把这些差异拆进网站结构、关键词地图和投放策略里,用他们习惯的方式出现在他们搜索的地方。