【问题标题】:How to convert JSON to SQLI query - php如何将 JSON 转换为 SQL 查询 - php
【发布时间】:2015-09-18 05:18:25
【问题描述】:

我对编码很陌生,我已经遇到了需要将 JSON 转换为 SQLi 查询但我无法完成我需要的情况。

我正在尝试找到一种从 url 获取参数的方法,并基于它们使用通用函数从我的数据库中插入、更新、删除或选择。

JSON INSERT:
{"Username":"MyEmail@email.com","Password":"329670c3265b6ccd392e622733e9772f"}

JSON UPDATE:
{"Username":"MyEmail@email.com","Password":"newpacd392worda12123sdw112asddww"}

以上 JSON 是从检查 URL 查询字符串并将其转换为 JSON 的函数中检索的

 function php_raw_query() {
        $raw = filter_input(INPUT_SERVER, 'QUERY_STRING', FILTER_SANITIZE_STRING);
        $arr = array();
        $pairs = explode('&', $raw);
        foreach ($pairs as $i) {
            if (!empty($i)) {
                list($name, $value) = explode('=', $i, 2);
                if(isset($arr[$name])){
                    if (is_array($arr[$name])){
                        $arr[$name][] = $value;
                    } 
                    else {
                        $arr[$name] = array($arr[$name], $value);
                    }
                } 
                else {
                    $arr[$name] = $value;
                }
            }
        }       
        return $arr;
    }
    $json = json_encode(php_raw_query());

完成此操作后,我需要根据传递的数据构建变量查询,例如,如果我有 USER 和 PASS,我可以登录、注册、请求更改或删除密码。

考虑到这一点,用户可以执行:

SELECT * FROM 'users' WHERE 'Username'='MyEmail@email.com' AND 'Password'='329670c3265b6ccd392e622733e9772f';

请注意,列名(用户名)和值(MyEmail@email.com)都分别取自 JSON 键、值,并且仅当 JSON 数组具有超过 1 个元素时才包含 AND 语句。

这可以实现吗?

【问题讨论】:

  • 您如何知道何时插入和何时更新?您是通过 url 还是其他方式获得的?
  • 我首先调用一个 AJAX,它使用 GET 方法指向上面的 PHP 文件,该文件将为其提供 SQL 查询以执行更新、插入等也可以在 url 中。所以 JSON 可以像 {"Action":"UPDATE","Username":"MyEmail@email.com","Password":"329670c3265b6ccd392e622733e9772f"} 我只需要知道如何阅读它并构建查询。

标签: php json mysqli


【解决方案1】:

首先,您使用 json_decode 解码您的 json 代码并将其存储在一个变量中,然后像在 sql 查询中一样使用它。

【讨论】:

    【解决方案2】:

    @Lukasz,我刚刚使用了你的一段代码并且工作正常。我已经对 raw_query 函数应用了最小的更改,但似乎工作正常。

    此外,我不了解 SQL 注入。您介意再详细说明一下吗?

    谢谢。

    网址:_module.php?Username=MyEmail@email.com&Password=329670c3265b6ccd392e622733e9772f

    `

    ob_start();
    
    function php_raw_query() {
        $raw = filter_input(INPUT_SERVER, 'QUERY_STRING', FILTER_SANITIZE_STRING);
        $arr = array();
        $pairs = explode('&', $raw);
        foreach ($pairs as $i) {
            if (!empty($i)) {
                list($name, $value) = explode('=', $i, 2);
                if (isset($arr[$name])) {
                    if (is_array($arr[$name])) {
                        $arr[$name][] = $value;
                    } else {
                        $arr[$name] = array($arr[$name], $value);
                    }
                } else {
                    $arr[$name] = $value;
                }
            }
        }
        return json_encode($arr);
    }
    
    $object = json_decode(php_raw_query());
    
    function generate($object) {
        $query = 'SELECT * FROM table WHERE ';
        $paramsArray = [];
        foreach ($object as $key => $value) {
            $paramsArray[] = "'$key' = '$value'";
        }
        return $query . implode(' AND ', $paramsArray) . ";";
    }
    
    echo generate($object);
    
    ob_end_flush(); 
    

    `

    AJAX:

    `

    $(document).on('submit', 'form', function (e) {    
    var information = $(this).serialize();
    
    e.preventDefault();
    
    $.ajax({
        url: "_module.php",
        data: information,
        type: "GET",
        dataType: "json",
        success: function (data) {
            $("#post-wrapper").html(data);            
        },
        error: function () {
            console.log('Cannot retrieve data.');
        }
    });
    

    }); `

    输出 div 显示:SELECT * FROM table WHERE 'username' = 'MyEmail%40email.com' AND 'password' = '329670c3265b6ccd392e622733e9772f';

    【讨论】:

    • 在我的代码中将第一行更改为 $object = json_decode('{"Username":"hej\'; DELETE FROM table; SELECT * FROM table WHERE email=MyEmail@email.com ","密码":"329670c3265b6ccd392e622733e9772f"}');
    【解决方案3】:

    应该对你有帮助

    $object = json_decode('{"Username":"MyEmail@email.com","Password":"329670c3265b6ccd392e622733e9772f"}');
    
    function generate($object) {    
        $query = 'SELECT * FROM table WHERE ';
    
        $paramsArray = [];
            foreach ($object as $key => $value) {
                $paramsArray[] = "'$key' = '$value'";
            }
    
        return $query . implode(' AND ', $paramsArray) . ";";
    }
    
    echo generate($object);
    

    但是以这种方式准备查询是不安全的。看https://pl.wikipedia.org/wiki/SQL_injection

    【讨论】:

      猜你喜欢
      • 2016-03-28
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      相关资源
      最近更新 更多