【问题标题】:Previous Detect JSON Solutions Not Working上一页 检测 JSON 解决方案不起作用
【发布时间】:2017-11-28 05:27:01
【问题描述】:

我正在尝试创建一个可以普遍清理进入我的服务器的 AJAX 请求输入的函数。到目前为止,我已经创建了这个:

function sanitize($variable) {
    switch(gettype($variable)) {
        case "string":
            ////
            $variable = trim($variable);
            $variable = stripslashes($variable);
            $variable = htmlspecialchars($variable);
            break;
        case "array":
            foreach($variable as $key => $property) {
                $variable[$key] = sanitize($property);
            }
            break;
        case "object":
            foreach($variable as $key => $property) {
                $variable->$key = sanitize($property);
            }
            break;
    }
    return $variable;
}

这非常有效,甚至可以完全清理可以传递的嵌套数组、对象和字符串。但是,我想在已注释掉的行上添加 JSON 解析支持,所以我上网寻求解决方案。我在注释行的位置尝试了这三个建议的解决方案中的每一个:

$unstrung = json_decode($variable);
if(is_object($unstrung)) sanitize($unstrung);

$unstrung = json_decode($variable);
if(json_last_error() == JSON_ERROR_NONE) sanitize($unstrung);

if(!is_array(json_decode($variable, true))) sanitize(json_decode($variable));

但是,在特定情况下,这些中的每一个最终都会对字符串中的引号进行字符编码。例如,如果我发送同样编码的数据JSON.stringify(["data"]),并且我的服务器使用此函数对其进行清理并立即将其吐回,我会收到诸如"["data"]" 之类的响应。为什么我会得到这个?

【问题讨论】:

  • 你为什么要这样做?最终目标是什么?
  • 我希望我的清理功能能够识别 JSON、解析它并清理结果。尝试将这种支持添加到我的函数中破坏了某些字符串的处理方式,如我的帖子末尾所述。
  • .. 所以,你想清理不安全的 html 中的键和值吗?
  • 是的。特别重要,因为我还将它连接到数据库。
  • 直到最近,我才发现自己发送的不是离散字符串的更大信息包,使 JSON、数组和对象成为承载信息的必要手段。

标签: php json parsing


【解决方案1】:

这是你的罪犯:$variable = htmlspecialchars($variable);

htmlspecialchars() 会像这样咀嚼你的双引号,除非你特别用ENT_NOQUOTES 标记它。

如果您最担心使用此字符串对数据库的安全影响,请确保在查询用户数据时使用带有占位符的预准备语句。

我们很难建议提供更早的(在您的查询过程之前)清理过程,因为我们对您的项目了解不够(这也会使您的问题相当广泛)。

希望这些信息足以为您推进项目提供一些动力。

【讨论】:

    猜你喜欢
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多