check_ajax_referer() 到底如何工作?

2024-02-01

聪明的 WordPress 人们说 http://www.prelovac.com/vladimir/improving-security-in-wordpress-plugins-using-nonces插件开发人员应该在从页面发送回 WordPress 博客 (admin-ajax.php) 的每个 AJAX 请求中使用随机数。

这是通过 (1) 在服务器端生成一个随机数来完成的,通过

$nonce = wp_create_nonce  ('my-nonce');

...(2) 使该随机数可用于发送 AJAX 请求的 Javascript 代码。例如你可以这样做:

function myplg_emit_scriptblock() {
    $nonce = wp_create_nonce('myplg-nonce');
    echo "<script type='text/javascript'>\n" .
        " var WpPlgSettings = {\n" .
        "   ajaxurl : '" . admin_url( 'admin-ajax.php' ) . "',\n" .
        "   nonce : '" . $nonce . "'\n" .
        " };\n" .
        "</script>\n";
}
add_action('wp_print_scripts','myplg_emit_scriptblock');

...然后 (3) javascript ajax 逻辑引用该全局变量。

    var url = WpPlgSettings.ajaxurl +
        "?action=my-wp-plg-action&" +
        "nonce=" + WpPlgSettings .nonce +
        "docid=" + id;

    $.ajax({type: "GET",
            url: url,
            headers : { "Accept" : 'application/json' },
            dataType: "json",
            cache: false,
            error: function (xhr, textStatus, errorThrown) {
                ...
            },
            success: function (data, textStatus, xhr) {
                ...
            }
           });

...最后 (4) 在服务器端逻辑中检查接收到的随机数。

add_action( 'wp_ajax_nopriv_skydrv-hotlink', 'myplg_handle_ajax_request' );
add_action( 'wp_ajax_skydrv-hotlink', 'myplg_handle_ajax_request' );
function myplg_handle_ajax_request() {
    check_ajax_referer( 'myplg-nonce', 'nonce' );  // <<=-----
    if (isset($_GET['docid'])) {
        $docid = $_GET['docid'];
        $response = myplg_generate_the_response($docid);
        header( "Content-Type: application/json" );
        echo json_encode( $response ) ;
    }
    else {
        $response = array("error" => "you must specify a docid parameter.");
        echo json_encode( $response ) ;
    }

    exit;
}

但支票到底如何运作呢?


修改一些AJAX程序 https://stackoverflow.com/a/13614297/1287812,我也提出了同样的问题。这是一个简单的检查问题功能码 http://queryposts.com/function/check_ajax_referer/:

function check_ajax_referer( $action = -1, $query_arg = false, $die = true ) {
    if ( $query_arg )
        $nonce = $_REQUEST[$query_arg];
    else
        $nonce = isset($_REQUEST['_ajax_nonce']) ? $_REQUEST['_ajax_nonce'] : $_REQUEST['_wpnonce'];

    $result = wp_verify_nonce( $nonce, $action );

    if ( $die && false == $result ) {
        if ( defined( 'DOING_AJAX' ) && DOING_AJAX )
            wp_die( -1 );
        else
            die( '-1' );
    }

    do_action('check_ajax_referer', $action, $result);

    return $result;
}

If wp_verify_nonce is false并且你还没有发送false in the $die参数,然后就会执行wp_die( -1 );.


在您的示例代码中,check_ajax_referer()将中断执行并返回-1到 AJAX 调用。如果你想自己处理错误,请添加参数$die做你的事情$do_check:

$do_check = check_ajax_referer( 'myplg-nonce', 'nonce', false ); 

Note that the proper way to handle AJAX in WordPress is: register http://codex.wordpress.org/Function_Reference/wp_register_script, enqueue http://codex.wordpress.org/Function_Reference/wp_enqueue_script and localize http://codex.wordpress.org/Function_Reference/wp_localize_script the JavaScript files using wp_enqueue_scripts http://codex.wordpress.org/Plugin_API/Action_Reference/wp_enqueue_scripts instead of wp_print_scripts.
See Use wp_enqueue_scripts() not wp_print_styles() http://make.wordpress.org/core/2011/12/12/use-wp_enqueue_scripts-not-wp_print_styles-to-enqueue-scripts-and-styles-for-the-frontend/.

Check this update in December 2020 from a core contributor h/t: Rafael Atías https://stackoverflow.com/questions/10874571/how-does-check-ajax-referer-really-work/18358174?noredirect=1#comment127986378_18358174:

显然我们现在应该使用wp_add_inline_script代替wp_localize_script公开脚本需要使用的全局对象。 https://developer.wordpress.org/reference/functions/wp_add_inline_script/#comment-4632

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

check_ajax_referer() 到底如何工作? 的相关文章

  • 测试 WP_Query 对象是否为空

    如何测试 WP Query 对象是否未返回任何匹配项 我希望能够做这样的事情 这是一个模板 EDIT 更好的例子 我只想在查询找到任何内容时才显示 h2
  • 如何在 gridview 内添加级联下拉菜单以进行编辑?

    我有一个相当标准的 ASP NET GridView 它显示具有父子关系的 2 列 尽管数据库中存在 A 列和 B 列之间的关系 但 GridView 并未实现它 我想做以下事情 当用户选择编辑该行时 将显示 2 个下拉菜单 DropDow
  • jQuery 查找和替换导致浏览器挂起!数据量太大?

    在 kalley 的大量帮助下 我们发现如果我注释掉以下两行 LAG 就会消失 var tableContents table find tbody var html tbody tbody html data 但是我如何保留上述内容但取消
  • 如何跨页面播放背景音乐

    我已经读过这个问题 我知道它只能用框架来完成 我真的不想要全站点 AJAX 如何在多个 HTML 页面上播放背景音频 https stackoverflow com questions 4210370 how to play a backg
  • 如何在Google可视化条形图中自定义工具提示(文本和格式)?

    我在用谷歌可视化条形图 http code google com apis visualization documentation gallery barchart html我想自定义或更改工具提示文本和格式单击栏时出现的 我已经阅读了文档
  • Wordpress 上的 Javascript 注入预防

    我的 WordPress 博客得到以下内容恶意的注入脚本 eval function p a c k e d e function c return c
  • 内部分页:避免不工作

    我的 Wordpress 网站有一个打印样式表 我希望图像打印在单个页面上而不是跨页面拆分 在某些情况下 甚至几行文本也会被分割到不同的页面上 我已经包括了img page break avoid 在我的打印样式表中 但没有运气 我找到了一
  • JQuery - 使用 JSON 的属性创建输入

    我正在尝试使用 JSON 设置的 id 和 value 属性创建一个输入 我有一个获取 JSON 的 ajax 调用 返回的数据很好 对于 JSON 中的每个对象 我想创建一个带有 ID 和 JSON 值的按钮 阿贾克斯调用 ajax ty
  • 为什么我收到此错误:“未捕获类型错误:无法读取未定义的属性“标题””?

    我正在尝试写一个ajax网络应用程序 我有一个函数应该请求一个json对象 然后使用它来重新 填充网站 这里是JavaScript有问题 第 8 16 行 window onload LoadData Home var doc functi
  • 如何从ajax调用php函数?

    我熟悉如何让ajax转到php页面并执行一系列操作然后返回json数据 但是 是否可以调用驻留在给定页面中的特定函数 基本上我想要的是减少项目中的文件数量 所以我可以把很多常用的函数放在一个页面中 然后只调用我现在想要的任何函数 对于 AJ
  • Rails 渲染 JSON - 会话丢失?

    我正在尝试对控制器进行一些 Ajax 调用 该控制器以 JSON 进行响应 if session user render json gt Some Data else render json gt You are not logged in
  • f:ajax 不工作

    我很难得到f ajax从事某项工作h panelGroup 这就是我正在做的 JSF 代码
  • 如何在ListBox中加载大量数据? ASP.NET MVC 应用程序

    我正在使用 ASP NET MVC 应用程序 要求用户能够从可能包含超过 30 000 个条目的列表框中选择一个项目 是否有一种使用 Ajax 调用来填充此 ListBox 内容的动态方法 效果良好 我是否最好只填充服务器上的 ListBo
  • @Font-face 不适用于 IOS

    我正在开发一个 WordPress 网站 并且在每个页面上都有一个 H1 标签作为该页面的标题 我正在使用 font face 的特殊字体 它在每个浏览器的 Windows 上都运行良好 但是当我切换到 Mac 时 它不会显示 h1 标签
  • 如何在phonegap应用程序中使用存储在localStorage中的json feed?

    这就是我正在做的 向我的网络服务器发出请求 响应采用 json 格式 使用 jquery 模板在我的应用程序中呈现回调数据 非常简单 就像魅力一样 问题是 我想在本地存储一些数据 这样我的应用程序就不必每次都从服务器获取它 3g 很慢 每笔
  • 如何在 jquery 中使 ajax 数据键动态化?

    我试图使内联编辑成为动态的 因此它只依赖于我的标记中的一些数据属性 所以现在的代码如下 inline edit editable function value settings var editableField this ajax typ
  • 为什么 JSON 结果可以是布尔值而不是对象或数组?

    From JSON 网站 http json org JSON 建立在两种结构之上 名称 值对的集合 在各种语言中 这被实现为对象 记录 结构 字典 哈希表 键控列表或关联数组 值的有序列表 在大多数语言中 这被实现为数组 向量 列表或序列
  • Spring-roo REST JSON 控制器损坏日期字段

    我有一个以两种方式使用的数据实体 我在页面加载时用其中的一些数据填充表格 当您单击该列的一行时 我通过 AJAX 获取该项目的详细信息并将其显示在表单字段中 我在服务器端使用 Spring Roo 生成的 REST 端点 在客户端使用 Ba
  • WooCommerce 使用 AJAX 设置购物车数量?

    我已经为此绞尽脑汁好几天了 需要一些指导 我正在为 WooCommerce 网站完全从头开始制作自定义主题 现在我正在尝试让购物车功能正常工作 我一直试图使用按钮 来更新购物车中产品的数量 对我来说问题似乎是WC 我在functions p
  • 使用 Timber 插件时,wordpress 简单的短代码不会呈现

    我最近接管了一个使用 Timber 我不熟悉 的 WordPress 网站的开发 我正在尝试使用新的插件和随附的短代码 但这当然不起作用 我已经研究这个问题几个小时了 似乎没有一个简单的答案 为了使用像这样的简单短代码 sp faq类别 7

随机推荐

  • 当参数有时可以为NULL时如何参数化SQL查询?

    With pyodbc我可以像这样参数化查询 value testval query SELECT FROM TestTable WHERE Column cursor execute query value 但问题是 如果value为 N
  • 当 Perl 中发生警报时,我应该如何清理挂起的孙进程?

    我有一个并行自动化脚本 需要调用许多其他脚本 其中一些脚本挂起 因为它们 错误地 等待标准输入或等待各种其他不会发生的事情 这没什么大不了的 因为我抓住那些alarm http perldoc perl org functions alar
  • VisualSVN 预提交规则

    将此挂钩与 VisualSVN Server 结合使用 作为 pre commit bat 添加到 Repository hooks 文件夹中 我的问题是如何添加注释必须始终以数值开头的规则 我希望评论的第一部分始终是错误跟踪器的问题号 例
  • 从 PDF 中搜索文本的脚本

    Problem 在 Mac OS X 平台上 我想用 Python 或 Tcl 编写一个脚本来搜索 PDF 文件中的文本并提取相关部分 我很感激任何帮助 背景 我正在编写脚本来查看 PDF 中的内容 以确定它是否是账单 来自哪家公司以及持续
  • 如何更改 IPython Notebook 中显示方程的对齐方式?

    我希望我的 MathJax 在 IPython Notebook 中显示的方程在左侧对齐而不是居中对齐 这是由核心配置选项控制的显示对齐在 MathJax 中 如所述here http docs mathjax org en latest
  • 使用 thymeleaf 请求参数

    在 Spring Boot Web 应用程序中 User想要重置密码 所以他输入Reset password页 现在我想让他输入他的电子邮件地址 pushReset我想重定向到myapp resetPassword email HIS EM
  • UILabel 与 -[sizeWithFont:constrainedToSize:lineBreakMode] 正在切断单词

    UILabel里面的一个UITableViewCell 在手机点击时 高度会扩大 第二个UILabel与不同数量的数据一起出现 问题是 如果换行 sizeWithFont constrainedToSize lineBreakMode 不能
  • 简单形式的 Wiki 或类似 Markdown 的语法?

    有没有类似的简单语言Markdown http en wikipedia org wiki Markdown或其中之一维基标记 http en wikipedia org wiki Wiki markup被转换成 HTML 表单元素 例如
  • 比较 R 中的字符向量以查找唯一值和/或缺失值

    我有两个字符向量 x 和 y x lt c a b c d e f g y lt c a c d e g x 内的值不会重复 即它们都是唯一的 向量 y 也是如此 我的问题是 如何让 R 比较两个向量 然后告诉我 y 相对于 x 缺少哪些元
  • 如何在 Vaadin ComboBox 中添加搜索图标?

    我有一个ComboBox允许选择给定的项目 以及接受选择的图标 功能都很好 我正在寻找将搜索图标放入组合框中的效果 像瓦丁图标 https vaadin com icons 这是怎么做到的 I tried comboBox setIcon
  • 为什么返回未初始化的值被视为未定义行为?

    在读的时候this http en cppreference com w c language behavior UB and optimization我看到一个UB不太明白 希望你能解释一下 size t f int x size t a
  • 如何计算第 n 个排列(或告诉给定排列的字典顺序)? [复制]

    这个问题在这里已经有答案了 这个问题有两个部分 但由于我正在尝试与 Prolog 实现进行比较 解决一个问题可能会立即导致另一个问题的解决方案 给定整数列表的排列 1 2 N 我如何知道字典顺序中该排列的索引是什么 给定一个数字k 我该如何
  • 有什么方法可以避免 vue-test-utils 中的shallowMount内存泄漏吗?

    我们有一个适用于 Node Mocha 和 jsdom 包的 vue 自定义单元测试设置 可模拟浏览器环境 无 webpack karma 我们已经编写了大约 3k 规范 具有数百个组件的大型应用程序 现在当 mocha 运行时 它变得越来
  • 如何读取不完整的表单字段 ncurses C++

    我有一个使用 ncurses C 读取表单字段的代码 但是当表单字段未完全键入时我无法显示值 include
  • 计算列帮助 - TSQL

    CREATE TABLE dbo tblLocations latitude float NOT NULL longitude float NOT NULL location varchar 500 NOT NULL timestamp d
  • Devise登录时如何传递参数

    Devise登录过程中如何传递参数 我有一组用户 每个用户都有自己的个人资料页面 我希望他们能够查看自己的个人资料页面 但不能查看其他用户的个人资料页面 除非他们是管理员 在这种情况下他们可以访问应用程序中的所有内容 我创建了一个 User
  • ZedGraph MajorGrid 和 MinorGrid LineStyle

    我只是想知道是否有人知道如何更改 ZedGraph 的主要和次要网格的线条样式 例如我有 graphPane XAxis MinorGrid IsVisible true 我想要这样的东西 graphPane XAxis MinorGrid
  • 如何在字符串中查找专有名词?

    我正在尝试识别用户提交的 3 4 句话段落中的专有名词 我同意该功能存在一些缺陷 因为我有一个审核团队来验证几乎所有内容 下面是传入段落的示例 尼克 斯威舍 Nick Swisher 击出詹姆斯 希尔兹 James Shields 击出全垒
  • IE 用户代理正则表达式(包括 IE11 和紧凑视图)

    我需要您帮助为用户代理字符串创建 IE 特定的正则表达式 我的目标是获取正确的 IE 版本 包括 IE11 并检查浏览器是否正在运行 Compat View 例如 我在正常模式下对 IE9 的期望结果是 IE 9 0以及 兼容视图 中的 I
  • check_ajax_referer() 到底如何工作?

    聪明的 WordPress 人们说 http www prelovac com vladimir improving security in wordpress plugins using nonces插件开发人员应该在从页面发送回 Wor