【问题标题】:Usage of values stored in $_GET / $_SESSION in Javascript在 Javascript 中使用存储在 $_GET / $_SESSION 中的值
【发布时间】:2010-04-22 05:13:59
【问题描述】:

我对 Javascript 和 PHP 还很陌生,所以如果我要问一些非常愚蠢的问题,请多多包涵。

好的,假设我需要使用存储在 PHP $_GET 或 $_SESSION 中的值,是否建议这样做

var something = PHP echo $_SESSION or $_GET

【问题讨论】:

  • 不建议这样做。这只是唯一可能的方法。我强烈建议先学习javascript,否则同时学习两种语言会很痛苦。

标签: php javascript session


【解决方案1】:

您需要确保数据对 JavaScript 解析是安全的。 var something = <?php echo $SESSION['foo']; ?> 如果它是一个数字,它会起作用。如果是字符串,则需要添加引号。如果字符串包含特殊字符,则需要对其进行转义等。

通过json_encode 运行数据是确保 JavaScript 安全的好方法。

由于 $_GET 是用户输入的数据,你不能不检查就知道它是一个数字,所以如果你不保证安全,那么你就有一个巨大的 XSS 漏洞。即使你这样做了,那么你之后在 JavaScript 中对数据所做的事情可能会将你暴露给 XSS。

【讨论】:

  • 感谢您提供有关处理 $_GET 数据的信息。但是,我仍然不明白 json_encode 做了什么使数据 javascript 安全。
  • @Felix:可悲的是,我只知道它是一个包含名称:值对的数据结构,但绝对不知道它的常用用途
  • 你为什么不提一下 XSS 的 SESSION 呢?
  • @luhiz — 它是一种数据格式,是 JavaScript 的子集,因此您可以将其直接转储到 JS 中。
  • @Col - $_SESSION 包含您放入其中的任何内容,而不是用户放入其中的内容。 (这意味着如果你早先从 GET 中获取并放入 SESSION 那么你会遇到同样的问题)
【解决方案2】:

将此作为代码格式化的答案,但是...

@luhiz:想想你将数据插入到包含 javascript“元字符”的 javascript 块中会发生什么。假设您将一个人的全名作为查询参数传递,如下所示:

http://example.com/index.php?name=John+O'toole

在 PHP 中,您将拥有:

$_GET['name'] = "John O'toole";

当你把它放到 javascript 块中时,你会得到:

var name = John O'toole;

现在你遇到了一些问题:

  1. 您已将原始用户可破解数据插入到您的网页中
  2. JavaScript 语法错误,因为您的字符串没有用引号括起来
  3. 另一个语法错误,因为名称包含一个单引号,它开始一个字符串,然后不以另一个引号终止。

讨论:

  1. 这是一种经典的 XSS(跨站点脚本)攻击。您将用户提供的数据放入 html 页面,没有任何安全性。最简单的攻击示例是使用http://example.com/index.php?name=alert("you've been hacked!");。试试看会发生什么。

2&3:通过使用 json_encode,PHP 会自动将您正在编码的任何内容转换为语法安全的 Javascript。这并不意味着它是“安全”的代码——它仍然可以包含恶意数据。但是在客户端浏览器加载页面时不会导致语法错误。所以通过这样做:

 var name = <?php echo json_encode($_GET['name']);

你会得到类似的东西:

 var name = "John O'toole";

javascript 解释器会毫无怨言地接受。

【讨论】:

  • 非常感谢您!现在我对整个问题有了更好的理解
猜你喜欢
  • 2012-02-16
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2021-04-21
  • 2011-07-14
  • 2010-09-13
相关资源
最近更新 更多