修改使用$_REQUEST的PHP代码,替换为更安全的实现方案
替换$_REQUEST的安全优化方案
原代码依赖$_REQUEST判断请求参数,存在数据来源不明确的安全风险,结合这个接口是**销售数据回传(POST场景)**的业务属性,直接用$_POST替换并增强校验,修改后的代码如下:
public static function sales_data_postback() { // 1. 先校验请求方法,只允许POST请求 if ( $_SERVER['REQUEST_METHOD'] !== 'POST' ) { wp_die( 'Invalid request method.' ); } // 2. 替换$_REQUEST为$_POST,明确数据来源是POST if ( ! isset( $_POST['sales_data'] ) || empty( $_POST['sales_data'] ) ) { return; } // 3. 解码JSON前先检查字段是否存在,解码后校验结果 if ( ! isset( $_POST['data'] ) || ! isset( $_POST['cart_contents'] ) ) { return; } $data = json_decode( stripslashes( $_POST['data'] ) ); $cart_contents = json_decode( stripslashes( $_POST['cart_contents'] ) ); // 校验JSON解码是否成功 if ( ! $data || ! $cart_contents ) { return; } // 保留原业务逻辑:移除购买日志ID,插入新记录 $data = (array) $data; unset( $data['id'] ); $purchase_log = wpsc_get_order( $data ); $purchase_log->save(); $purchase_log_id = $purchase_log->get( 'id' ); global $wpdb; // 处理购物车内容,增加产品查询的容错处理 foreach ( $cart_contents as $cart_item ) { // 先校验cart_item的slug是否存在 if ( empty( $cart_item->slug ) ) { continue; } $product_query = new WP_Query( array( 'post_type' => 'wpsc-product', 'pagename' => $cart_item->slug, 'posts_per_page' => 1 // 只取一条结果,提升效率 ) ); $products = $product_query->get_posts(); // 没找到对应产品就跳过当前条目,避免报错 if ( empty( $products ) ) { continue; } $product = $products[0]; $cart_item = ( array ) $cart_item; unset( $cart_item['id'] ); unset( $cart_item['slug'] ); $cart_item['prodid'] = $product->ID; $cart_item['name'] = $product->post_title; $cart_item['purchaseid'] = $purchase_log_id; $wpdb->insert( WPSC_TABLE_CART_CONTENTS, $cart_item ); } wp_die(); // 用WordPress的wp_die替代原生die,更符合WP生态规范 }
关键改动说明
- 明确请求类型:新增
REQUEST_METHOD校验,只允许POST请求访问,拦截GET等非法请求 - 替换$_REQUEST为$_POST:直接指定数据来源是POST提交的参数,避免GET参数触发业务逻辑,消除数据来源模糊的风险
- 增强数据校验:增加JSON字段存在性检查、解码结果校验,避免无效数据导致后续逻辑报错
- 容错处理:对产品查询结果做空值判断,没找到对应产品时跳过当前条目,防止数组越界错误
- 规范WP用法:用
wp_die()替代原生die(),更符合WordPress开发规范
内容的提问来源于stack exchange,提问作者php1
相关产品推荐
相关产品推荐

