javascript - PHP 脚本检索 JSON 文件 - 如何将其传递给 JavaScript?

标签 javascript php

假设我有一个 PHP 脚本,可以为我检索 JSON 数据:

<?php
    header('Content-Type:application/json; charset=utf-8'); 
    $url = "http://ipinfo.io/" . $_SERVER['REMOTE_ADDR'] . "/json";
    echo file_get_contents($url);

如何在 JavaScript 中解析这些数据?

最佳答案

因此,查看数据样本,我们看到 URL:

http://ipinfo.io/104.111.103.12/json

演出:

{
  "ip": "104.111.103.12",
  "hostname": "a104-111-103-12.deploy.static.akamaitechnologies.com",
  "city": "Cambridge",
  "region": "Massachusetts",
  "country": "US",
  "loc": "42.3626,-71.0843",
  "org": "AS35994 Akamai Technologies, Inc.",
  "postal": "02142"
}

因此:

<?php
    $sIP = $_SERVER['REMOTE_ADDR'];
    if ($sIP == '127.0.0.1') { // like testing at home on your own workstation
      $sIP = '104.111.103.12'; // use a dummy one just for this demo
    }
    $sURL = "http://ipinfo.io/" .$sIP . "/json";
    $sJSON = file_get_contents($sURL);
    $view = (object) array();
    $view->JSON = $sJSON;
?><!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
</head>
<body>
<script type="text/javascript">

// global string of Data
var gsData = <?= $view->JSON ?>

$(document).ready(function(){
  var sRegion = gsData.region;
  $('#result').html(sRegion);
});

</script>
<div>Region from data is:</div>
<div id="result"></div>
</body>
</html>

...在我的家庭工作站网络服务器(当前 IP 127.0.0.1)上显示此结果:

Region from data is:
Massachusetts

但是,现在您要做的永远不是信任数据。假设黑客攻克了 ipinfo.io,并且 JSON 不再变成 JSON,而是恶意的。这意味着它可以从客户端浏览器端将恶意代码插入您的网站,例如破坏网站或使其重定向到一些充满恶意软件的非常糟糕的网站。

PHP 在将数据发送到客户端浏览器之前通过 Web 服务器将数据注入(inject)到 HTML 中,也可能存在潜在的漏洞(我不确定)。 Web 服务器中可能存在一个弱点(同样,不确定),其中可能会发生缓冲区溢出,然后它可以将代码注入(inject)到 Web 服务器中,例如导致它创建可以远程执行的文件。

因此,网络上有很多文章介绍如何在将数据发送到浏览器之前先对其进行完善和测试。这超出了您的问题范围,但要记住这一点非常重要。

以下是有关如何从 PHP 验证 JSON 的一些信息:

Validate json in php

关于javascript - PHP 脚本检索 JSON 文件 - 如何将其传递给 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34542175/

相关文章:

javascript - 为什么 javascript 只换行一次(第一次)?

javascript - 将单词与旁边的空格匹配

php - 正则表达式:字符串是否以大写字母开头(不仅在 A-Z 中)?

php - Laravel sortBy() 在输出中包含键,但 sortByDesc 没有?

php - 对多个字段应用相同的验证规则

javascript - 按左侧值和顶部值对包含 DOM 标签和属性的数组进行排序

javascript - 如何洗牌一个NodeList

php - 我们应该始终跟踪查询和数据库错误吗?

javascript - Prestashop 货币大小

javascript - 从文本框中删除时间选择器效果