wordpress中有关即时验证的几个_nonce函数

原文地址:http://www.utubon.com/post/877.html

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

一、wp_create_nonce

wp_create_nonce的用法很简单,即一般用在链接中

它将有一个参数,这个参数相当于一个唯一标识ID,通过这个ID,你可以再后文的程序中进行检查。它的返回值即nonce,一个随机字符串。

wp_create_nonce(?$action?);

它的使用例如:

<?php?$nonce=?wp_create_nonce??('my-nonce');??> <a?href='myplugin.php?_wpnonce=<?php?echo?$nonce??>'>?...

<?php
$nonce=$_REQUEST['_wpnonce'];
if?(!?wp_verify_nonce($nonce,?'my-nonce')?)?die('Security?check');
?>

它是一个创建即时的随机字符串的函数,在wordpress系统中,增加了对这个字符串的检查,及wp_verify_nonce,当然如果使用的默认值,也可以用check_admin_referer来验证。这将在后文中讲到。

wp_nonce_url()能直接转换一个链接地址为带_wpnonce参数的地址,例如wp_nonce_url('admin.php')就变成了admin.php?_wpnonce=98fa9dgf

二、wp_nonce_field

和wp_create_nonce一样,也是一个创建nonce的函数,但不同的是,它创建的是一个完整的<input>并且已经打印出来,所以我们只需要将它放在<form>中间即可,下面有例子。

它有四个参数,第一个参数和上文中提到的唯一标识ID的一个意思,第二个参数的创建出来的input的name属性值,默认为_wpnonce,第三个参数用来设置该input是否为一个要用以确认是否进行检索,默认为true,第四个参数是用来设置是否打印出来,如果打印出来,则生成一个input,默认是true,即打印出来。如果将$echo和$referer都设为true,需要检索wp_referer_field()。如果将$referer设为true且回应随机字段,那么它也会回应referer字段。一般情况下,我们不用后面两个参数。

<?php?wp_nonce_field(?$action,?$name,?$referer,?$echo?)??>

它的使用例子如下:

<form method="post">
<!-- some inputs here ... -->
<?php wp_nonce_field('name_of_my_action','name_of_nonce_field');??>
</form>
<?php
if ( empty($_POST) ||?!wp_verify_nonce($_POST['name_of_nonce_field'],'name_of_my_action') )
{
print 'Sorry, your nonce did not verify.';
exit;
}
else
{
// process form data
}

当然,你也可以用check_admin_referer来验证。

三、wp_referer_field

为表格检索或显示引用页隐藏字段。

引用页链接即来自服务器超级全局变量的当前请求URI。如果希望手动检索,请使用输入名称'_wp_http_referer'。

<?php?wp_referer_field(?$echo?)??>

它有一个参数,用来确认是否打印出来。这个函数我们基本不用,所以官方没有例子。

四、wp_verify_nonce

这是一个检查nonce的函数,检查返回true or false。正如上文中的例子一样,它完成对特地唯一标识ID的检查,如果不是本次请求产生的nonce,则返回false,例如别人提交了一个nonce过来,它返回false。

<?php?wp_verify_nonce(?$nonce,?$action?);??>

它有两个参数,第一个是接收到的nonce,如果我们用wp_create_nonce创建一个_wpnonce,那么我们接收它,一般以$_GET['_wpnonce']或$_POST['_wpnonce']的形式获得,当然wp_nonce_field创建的也是同样的道理。第二个参数则是那个对应的唯一标识ID,例如上文中的my-nonce。实例如:

$nonce=$_REQUEST['_wpnonce'];
if?(!?wp_verify_nonce($nonce,?'my-nonce')?)?die('Security?check');

它只是返回ture or false,并不阻断程序的运行,如果要阻断,需要自己的添加wp_die()函数来阻断。

五、check_admin_referer

它有两个参数,第一个对应那个唯一标识ID,第二个对应发送过来的nonce,也就是说这两个参数和wp_verify_nonce的正好相反。

它和wp_verify_nonce有着本质的不同,它不仅要进行nonce的检查,而且要判断问题和错误原因,如果错误是存在的,还要阻断程序执行,给出被阻断的原因。例如我们提交一个空的评论框的时候,我们会看到一个提示界面,这个界面是由wp_die()产生的,如果我们的nonce检查发生错误,check_admin_referer也会产生同样的效果。

例子如下:

<form method="post">
<!-- some inputs here ... -->
<?php wp_nonce_field( 'name_of_my_action','name_of_nonce_field' );??>
</form>
<?php
// if this fails, check_admin_referer() will automatically print a "failed" page and die.
if (?!empty($_POST) && check_admin_referer( 'name_of_my_action', 'name_of_nonce_field' ) ) {
// process form data, e.g. update fields
}
// Display the form

这样我们就可以防止一些恶意的操作。

六、什么时候要用nonce检查,使用哪一个函数

1、当你的操作需要进行数据库的操作,涉及到权限问题时,最好先进行检查,虽然这个验证并不是非常可靠的,但是已经可以防止从站外进行数据提交了。你可以想想,当一个用户直接在地址栏里面打上一些命令,就可以对你的数据库进行操作,这是多么可怕的一件事,但是你在地址中增加一个_wpnonce或其他什么参数,这个参数的值是一个nonce,而程序的执行必须先进行这个nonce检查,那么不就安全多了么。别人虽然可以再地址栏里面打出这个参数,甚至有可能猜对这个参数的值,但是如果wordpress发现这个值不是通过系统本身产生的,仍然会无法通过检查。

2、当你想为某个链接地址创建一个nonce的时候,可以选择用wp_creat_nonce或wp_nonce_url,你可以轻松的创建一个带有nonce的链接,用户点击链接时可以自然产生这个nonce。而一般这种通过$_GET[]方式创建的nonce,都用wp_verify_nonce来检查,它们或许是一套的。

3、一般选择用wp_nonce_field来创建一个隐藏的input,通过$_POST[]的方式进行获取,然后用check_admin_referer进行检查,因为check_admin_referer并不能直接检查nonce值,即$_POST[]的内容,所以也不能检查wp_creat_nonce产生的地址连接,当然,你可以巧妙的变化,自己写一个<input type="hidden" name="_wpnonce" value="<?php echo wp_creat_nonce('my-nonce'); ?>">,然后用post的方式提交,用check_admin_referer('my-nonce','_wpnonce')进行检查。

其实你只需要了解各个函数之间产生的效果即可,只要在检查的时候,能让nonce生效即可,了解这些之后,即可以为你的程序增加更多的权限判断,以免造成一些安全隐患。

此处评论已关闭