安全地抓取json数据

时间:2015-10-18 01:00:21

标签: json

所以我使用这个API,它允许我从数据库中获取数据,以便使用json和javascript在我的网站上显示。我想弄清楚如何保护我的API密钥。他们说你可以使用java或C#进行调用,然后使用javascript显示json数据?所以基本上我的想法是我使用单独的脚本语言(c#或java我认为PHP也可以工作?)来进行调用,然后获取结果并将其显示在客户端,这样API密钥就隐藏在服务器端代码中。 / p>

我不知道我应该怎么做。有谁知道如何在理论上做到这一点?

1 个答案:

答案 0 :(得分:0)

一些事情:

  1. Java和C#不是脚本语言。它们是高级编程语言。
  2. 解决您在pastebin上发布的代码,您无法对其他网站进行AJAX调用。这会创建一个跨大多数浏览器不允许的跨源请求。阻止跨域请求的目的是防止恶意代码“干扰良性网站的运行”(正如IETF发布的RFC 6454所述)。
  3. 除此之外,你所要求的是完全可能的。最简单的方法是查询一些带有要调用的API链接的PHP脚本call_api.php。所以(从你的粘贴代码中复制),假设你要调用:https://na.api.pvp.net/api/lol/na/v1.4/summoner/by-name/<Some ID>?api_key=<Your API Key>。您可以将api/lol/na/v1.4/summoner/by-name/<Some ID>之类的内容作为参数发送给call_api.php,而不是查询此链接。

    call_api.php可以设置如下:

    <?php
    $_API_KEY = "Your secret API key.";
    
    $requestSuffix = $_REQUEST['suffix']; // This is whatever the API request is
                                          // E.g., "api/lol/na/v1.4/summoner/..."
    
    $requestURL = "https://na.api.pvp.net" . ($requestSuffix[0] != '/' ? '/' : '' ) . $requestSuffix;
    
    // Now we need to add the secret API to the end of the request URL:
    if(strpos($requestSuffix, '?') === False){
        // We just need to tack on "?api_key..."
        $requestURL .= "?api_key=$_API_KEY";
    }else{
        // The requested suffix already has a '?' and thus it potentially has
        // some parameters already
        if(substr($requestURL, -1) == '?'){
            // There's just a blank '?' on the end without any parameters yet.
            $requestURL .= "api_key=$_API_KEY";
        }else{
            // The request suffix likely already contains some parameters
            // So we'll just add the api key as another parameter
            $requestURL .= "&api_key=$_API_KEY";
        }
    }
    
    // Now with our request URL constructed, we're ready to make the request
    $ch = curl_init($requestURL);
    
    // Set the cURL options:
    curl_setopt($ch, CURLOPT_HEADER, false); // don't show header in output
    curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); // prevent cached connections
    curl_setopt($ch, CURLOPT_FORBID_REUSE, true); // Don't pool connection for reuse
    
    // Execute the request:
    // (by default the response will be directly printed to the output stream or buffer)
    curl_exec($ch);
    
    // Make sure the connection is closed to free up resources
    curl_close($ch);
    ?>
    

    所以你只需将它放在你网站的服务器上然后就可以使用AJAX调用这个脚本,为它提供suffix参数(你希望用作{{1}查询的路径和可能的参数})。