在JavaScript变量中存储php $_GET变量?

3
我正在使用 $_GET 方法将两个信息传递给一个 PHP 页面(team1,team2)。我想在一些 JavaScript 中将它们用作变量。我该如何做?
谢谢。

3
想要指出的是,这里所有的例子都存在严重的安全漏洞。 - Evert
非常非常小心使用这里的大多数答案。它们中的大多数都非常不安全。也要阅读答案评论。 - Spudley
7个回答

8

由于$_GET只能访问查询字符串中的变量,如果您希望可以从JavaScript中执行相同操作:

<script>
var $_GET = populateGet();

function populateGet() {
  var obj = {}, params = location.search.slice(1).split('&');
  for(var i=0,len=params.length;i<len;i++) {
    var keyVal = params[i].split('=');
    obj[decodeURIComponent(keyVal[0])] = decodeURIComponent(keyVal[1]);
  }
  return obj;
}
</script>

1

原始回答:

在你的 .php 文件中。

<script type="text/javascript"> 
  var team1, team2; 
  team1 = <?php echo $_GET['team1']; ?>; 
  team1 = <?php echo $_GET['team1']; ?>; 
</script>

更安全的答案:

在发布这个答案时,我甚至没有考虑过 XSS。(看看评论!)来自 $_GET 数组的任何内容都应该被转义,否则用户几乎可以将任何 JS 插入到您的页面中。因此,请尝试使用以下代码:

<script type="text/javascript"> 
  var team1, team2; 
  team1 = <?php echo htmlencode(json_encode($_GET['team1'])); ?>; 
  team1 = <?php echo htmlencode(json_encode($_GET['team1'])); ?>; 
</script>

从这里开始http://www.bytetouch.com/blog/programming/protecting-php-scripts-from-cross-site-scripting-xss-attacks/
更多关于XSS的内容来自谷歌http://code.google.com/p/doctype/wiki/ArticleXSSInJavaScript
感谢评论者们。

6
坏选择,XSS漏洞 - soju
@Jono:@soju 完全正确! - Michiel Pater
1
json_encode($_GET['team1'])。当传递值到 JavaScript 文件时,始终使用 json_encode 以确保安全。 - Thai

1
确保你使用类似htmlentities的方法来转义值,以防止你的应用程序受到跨站脚本攻击的影响。最好在将变量输出到页面之前验证它们是否是预期的值。
<script type="text/javascript"> 
  var team1 = '<?php echo htmlentities($_GET['team1']); ?>'; 
  var team2 = '<?php echo htmlentities($_GET['team2']); ?>'; 
</script>

1
很高兴看到有人以某种方式逃避了值;这里有太多的答案只是真的很糟糕...但既然我们正在输出Javascript,我们应该将其作为Javascript进行转义,而不是HTML。使用json_encode()代替htmlentities() - Spudley
json_encode 用于将数组转换为 JSON。默认情况下,它不会转义除双引号之外的任何内容,这仍然允许更复杂的 XSS 攻击。最重要的是,除非经过适当验证或每个潜在不安全的值都已被转义,否则不要输出任何用户输入的数据。 - Randy H.
这些值是通过下拉列表收集的,所以这样就比较安全了,对吧? - Jono
@Jono 由于这些是GET值,即可直接在URL中访问,任何人都可以轻松更改它们并传递任何他们想要的内容,包括JavaScript代码,如果您不对其进行转义,则会在您的页面上执行。之所以这是一个巨大的安全风险,是因为有人可能向您的用户发送一个链接,其中包含一些隐藏的代码,然后使用该人的凭据在您的站点上窃取信息或执行其他操作。如果您需要更多信息,可以在维基百科上找到关于跨站脚本攻击的详细解释。 - Randy H.

0
<script type="text/javascript">
  var team1 = <?php echo $_GET['team1'] ?>;
  var team2 = <?php echo $_GET['team2'] ?>;
</script>

没有"language"属性。它已被弃用。 - Michiel Pater
我的错,当时很匆忙,已经修复了。谢谢。 - Jan Zyka
嗨,那我在这里不需要 PHP 标签吗? - Jono
由于有时候会禁用short_open_tags选项,因此您应避免使用短标签。 - soju
<? 是 <?php 的快捷方式,但在某些服务器上可能被禁用,但通常仍然有效。使用 <?php 可能是更好的选择,因为它始终有效。 - Jan Zyka

0

其他方法有点不太好,可能会出现一些问题。最好还是使用JavaScript:

<script>
function get_data(name){
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp(regexS);
  var results = regex.exec(window.location.href);
  if(results == null) return "";
  else return results[1];
}

var var1 = get_data('var1');
var var2 = get_data('var2');
</script>

但这仍然不是非常安全的。

另一种方法是打印 $_GET 数组。我不知道这是否有效。无论如何,如果有效,那么它就在这里:

<script>
    var _get = <?php print_r($_GET); ?>

    var team1 = _get['team1'];
    var team2 = _get['team2'];
</script>

你可能想要在一个函数上运行array_walk(或类似的东西),以清理每个字符串。


你应该使用 decodeURIComponent。 - soju
@soju 那会如何帮助从查询字符串中获取变量? - Tanner Ottinger
获取变量并不会有所帮助,只需确保获取正确的变量内容。 - soju

0

使用JavaScript实现的另一种方法:

var team1 = $_GET('team1');

function $_GET(q,s) {
        s = s ? s : window.location.search;
        var re = new RegExp('&'+q+'(?:=([^&]*))?(?=&|$)','i');
        return (s=s.replace(/^?/,'&').match(re)) ? (typeof s[1] == 'undefined' ? '' : decodeURIComponent(s[1])) : undefined;
} 

-1
确保你的$_GET变量可用且不为空,并使用以下内容:
<script type="text/javascript">
    var team1 = <?php echo $_GET['team1']; ?>;
    var team2 = <?php echo $_GET['team2']; ?>;
</script>

没有"language"属性。它已被弃用。 - Michiel Pater
哈,我甚至没有意识到我写错了,在示例中已经修复了。 - Aaron W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接