php - curl查询后端,混淆数据

时间:2018-05-30 11:31:39

标签: php json

我不确定之前是否曾问过这个问题,但我找不到任何东西。

当我从前端CURL到后端时,我在base64中传递一个包含SQL查询的JSON对象:

base64(SELECT * FROM mytable) -> U0VMRUNUICogRlJPTSBteXRhYmxl

[{
  'sql' : 'U0VMRUNUICogRlJPTSBteXRhYmxl'
}]

后端接收它,然后通过sqlite3数据库运行该查询。它返回数据并将其放入JSON对象:

[{
  'column 1' : 'row 1 - data',
  'column 2' : 'row 1 - data',
  'column 3' : 'row 1 - data',
},{
  'column 1' : 'row 2 - data',
  'column 2' : 'row 2 - data',
  'column 3' : 'row 2 - data',
},{
  'column 1' : 'row 3 - data',
  'column 2' : 'row 3 - data',
  'column 3' : 'row 3 - data',
}]

然后使用python flask服务器将其返回,我认为使用请求库。

我的问题是返回的JSON对象看起来不像上面的那个,但返回更像:

[{
  'column 2' : 'row 1 - data',
  'column 3' : 'row 1 - data',
  'column 1' : 'row 1 - data',
},{
  'column 2' : 'row 2 - data',
  'column 3' : 'row 2 - data',
  'column 1' : 'row 2 - data',
},{
  'column 2' : 'row 3 - data',
  'column 3' : 'row 3 - data',
  'column 1' : 'row 3 - data',
}]

我不知道为什么。我甚至试图将SELECT语句指定为     选择“第1列”,“第2列”,“第3列”FROM mytable;

但仍然相同。

我可以自己订购,但不仅要查询一张表。

我的CURL代码:

$query = $_POST['query'];

function safeQ($squery){
    $denied = ["update","delete","insert","create","alter","drop"];
    $squery = strtolower($squery);
    foreach($denied as &$deny){
        if (strpos($squery, $deny) !== false) {
            return false;
        }
    }
    return true;
}

print(getQuery($query));

function getQuery($query){
    if (safeQ($query)){
        $data->sql = base64_encode($query);
        $jsonData = json_encode($data);

        $ch = curl_init('https://www.example.com/api/sql_query');
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json',
            'Content-Length: ' . strlen($jsonData))
        );
        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, false);

        $result = curl_exec($ch);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        return $result;
    }
}

1 个答案:

答案 0 :(得分:0)

回答你的问题为什么,这与我在评论中所说的是一样的;当python存储字典时,它不关心顺序。为什么订单结果如何呢?这需要更复杂的内存分配知识,我目前能够回答,但使用键/值结构的关键不在于条目的顺序。

[{
  'column 2' : 'row 1 - data',
  'column 3' : 'row 1 - data',
  'column 1' : 'row 1 - data',
},{
  'column 2' : 'row 2 - data',
  'column 3' : 'row 2 - data',
  'column 1' : 'row 2 - data',
},{
  'column 2' : 'row 3 - data',
  'column 3' : 'row 3 - data',
  'column 1' : 'row 3 - data',
}]

完全没问题。如果你开始看到这个;

[{
  'column 2' : 'row 1 - data',
  'column 3' : 'row 1 - data',
  'column 1' : 'row 1 - data',
},{
  'column 2' : 'row 3 - data',
  'column 3' : 'row 3 - data',
  'column 1' : 'row 3 - data',
},{
  'column 2' : 'row 2 - data',
  'column 3' : 'row 2 - data',
  'column 1' : 'row 2 - data',
}]

这是一个值得关注的案例,因为这次数组类型结构已经脱离原来的顺序。

您可以通过打开解释器来自己做出以下断言

>>> {'a':1,'b':2} == {'b':2,'a':1} 
True