【问题标题】:Sanitize JSON with php用 php 清理 JSON
【发布时间】:2016-09-28 17:25:34
【问题描述】:

我总是使用 filter_var($var, FILTER, FLAG);当我从 $_GET、$_POST 等获取数据时,但现在这些数据是 JSON 字符串,但我没有找到任何过滤器来清理 JSON。有谁知道如何实现这个过滤器?

PHP filter_var(): http://php.net/manual/en/function.filter-var.php

PHP 过滤器常量:http://php.net/manual/en/filter.filters.sanitize.php

【问题讨论】:

  • 你是如何得到 json 的??
  • json_decode 如果 json 字符串无效,则返回 null。然后你应该过滤 var 包含的属性,具体取决于它们是什么(号码、电子邮件等)

标签: php json filter-var


【解决方案1】:

首先将 JSON 解析为 PHP 数组,然后像处理常规请求内容一样过滤数组中的每个值,您可以将 JSON 键映射到示意图过滤器和标志/选项,例如

$filters = array(
    'email'=>FILTER_VALIDATE_EMAIL, 
    'url'=>FILTER_VALIDATE_URL, 
    'name'=>FILTER_SANITIZE_STRING,
    'address'=>FILTER_SANITIZE_STRING
);
$options = array(
    'email'=>array(
        'flags'=>FILTER_NULL_ON_FAILURE
    ), 
    'url'=>array(
        'flags'=>FILTER_NULL_ON_FAILURE
    ), 
    //... and so on
);
$inputs = json_decode($your_json_data);
$filtered = array();
foreach($inputs as $key=>$value) {
     $filtered[$key] = filter_var($value, $filters[$key], $options[$key]);
}

【讨论】:

  • 这可能值得在 php 的 GitHub 项目页面上提出拉取请求。可能经常需要验证 json 字符串。我通常用于此目的而不是 filter_var filter_input。但在你的意思是一样的。这两个函数都应该有一个FILTER_VALIDATE_JSON 常量。
【解决方案2】:

您为此使用filter_var_array

$inputs = filter_var_array( json_decode( $your_json_data, true ), [
   'email'   => [ 'filter' => FILTER_VALIDATE_EMAIL,
                  'flags'  => FILTER_NULL_ON_FAILURE ],
   'url'     => [ 'filter' => FILTER_VALIDATE_URL,
                  'flags'  => FILTER_NULL_ON_FAILURE ],
   'name'    => FILTER_VALIDATE_NAME,
   'address' => FILTER_SANITIZE_STRING
] );

【讨论】:

  • 如果发送的 json 中的 json vars 之一是数组,例如{"items": [2,5,15...]} - FILTER_... 使用什么来获取数组“items”?
  • @forsberg 如果 json 有一个数组作为值,那么您也可以使用循环对其运行过滤器。这是相同的过程……您必须不断将其分解成越来越小的部分。
猜你喜欢
  • 1970-01-01
  • 2012-11-07
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多