无法捕获WooCommerce REST API请求,导致PHP错误

ny6fqffe  于 2023-01-24  发布在  PHP
关注(0)|答案(1)|浏览(168)
    • bounty将于明天到期**。回答此问题可获得+50的声望奖励。Robbie Lewis希望引起更多人关注此问题:寻找任何横向解决方案,这将有助于我们捕捉API请求进入一个Apache的Web服务器。

我有一个第三方应用程序,它通过REST API将产品数据插入WooCommerce。第三方应用程序不记录出站API请求。
第三方应用程序正在向WooCommerce发出请求,导致PHP错误。

[16-Jan-2023 14:52:23 UTC] PHP Fatal error:  Uncaught TypeError: preg_match(): Argument #2 ($subject) must be of type string, WP_REST_Request given in /home/CENSORED/public_html/wp-includes/formatting.php:1596
Stack trace:
#0 /home/CENSORED/public_html/wp-includes/formatting.php(1596): preg_match('/[\\x80-\\xff]/', Object(WP_REST_Request))
#1 /home/CENSORED/public_html/wp-includes/formatting.php(2207): remove_accents(Object(WP_REST_Request))
#2 /home/CENSORED/public_html/wp-includes/class-wp-hook.php(310): sanitize_title(Object(WP_REST_Request))
#3 /home/CENSORED/public_html/wp-includes/plugin.php(205): WP_Hook->apply_filters(Object(WP_REST_Request), Array)
#4 /home/CENSORED/public_html/wp-includes/taxonomy.php(1751): apply_filters('pre_term_slug', Object(WP_REST_Request), 'pa_colour')
#5 /home/CENSORED/public_html/wp-includes/taxonomy.php(1653): sanitize_term_field('slug', Object(WP_REST_Request), 0, 'pa_colour', 'db')
#6 /home/CENSORED/public_html/wp-includes/taxonomy.php(2385): sanitize_term(Array, 'pa_colour', 'db')
#7 /home/CENSORED/public_html/wp-content/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-terms-controller.php(407): wp_insert_term('DENIM BLUE', 'pa_colour', Array)
#8 /home/CENSORED/public_html/wp-includes/rest-api/class-wp-rest-server.php(1171): WC_REST_Terms_Controller->create_item(Object(WP_REST_Request))
#9 /home/CENSORED/public_html/wp-includes/rest-api/class-wp-rest-server.php(1018): WP_REST_Server->respond_to_request(Object(WP_REST_Request), '/wc/v2/products...', Array, NULL)
#10 /home/CENSORED/public_html/wp-includes/rest-api/class-wp-rest-server.php(442): WP_REST_Server->dispatch(Object(WP_REST_Request))
#11 /home/CENSORED/public_html/wp-includes/rest-api.php(410): WP_REST_Server->serve_request('/wc/v2/products...')
#12 /home/CENSORED/public_html/wp-includes/class-wp-hook.php(308): rest_api_loaded(Object(WP))
#13 /home/CENSORED/public_html/wp-includes/class-wp-hook.php(332): WP_Hook->apply_filters(NULL, Array)
#14 /home/CENSORED/public_html/wp-includes/plugin.php(565): WP_Hook->do_action(Array)
#15 /home/CENSORED/public_html/wp-includes/class-wp.php(399): do_action_ref_array('parse_request', Array)
#16 /home/CENSORED/public_html/wp-includes/class-wp.php(780): WP->parse_request('')
#17 /home/CENSORED/public_html/wp-includes/functions.php(1332): WP->main('')
#18 /home/CENSORED/public_html/wp-blog-header.php(16): wp()
#19 /home/CENSORED/public_html/index.php(17): require('/home/CENSORED...')
#20 {main}
thrown in /home/CENSORED/public_html/wp-includes/formatting.php on line 1596

我认为PHP错误是一个需要报告给WooCommerce和/或WordPress的错误。我无法捕获请求的内容,以便我可以提供错误报告重现的步骤。
我正在测试WordPress和WooCommerce的完全空白和最新安装,没有其他插件(除了下面提到的)。
我试过:

我如何捕获完整的请求,以便我可以确认这是一个WooCommerce或WordPress的错误,并报告给适当的github?

6uxekuva

6uxekuva1#

在这种特殊情况下,我建议使用“printf调试”或“print_r调试“。
编辑/home/CENSORED/public_html/index.php并在第17行之前插入:

syslog(LOG_ERROR, print_r($_GET, TRUE));
syslog(LOG_ERROR, print_r($_POST, TRUE));

根据插件触发的请求类型,内容应该出现在这些日志输出中的一个。
也可以转到/home/CENSORED/public_html/wp-includes/formatting.php并在第1596行之前插入:

syslog(LOG_ERROR, print_r($text, TRUE));

以获取格式错误的字符串变量。
执行此操作后,您应该能够通过以下方式在服务器的syslog中找到日志行:

tail -f /var/log/syslog

如果你不幸没有访问服务器上的wp源代码,你应该通过WiresharkTShark在运行插件的台式机上捕获请求。我不会责怪它矫枉过正。通过服务器IP过滤捕获,协议http和方法(http.request.method == GEThttp.request.method == POST),问题的核心应该很快就会揭晓(也许您必须将请求方案从https重置为http)。

相关问题