【问题标题】:Variable is not defined even though it is?变量没有定义,即使它是?
【发布时间】:2016-09-21 18:19:34
【问题描述】:

您好,我正在尝试在按下按钮时调用 php 函数,但标题中不断出现错误。

我这样调用函数:

echo("<th><input type='button' name = 'Attack_Btn' onclick = 'FightPlayer(".$row['username'].")' value ='Attack'></th>");

只要说出它从 $row['user... 得到的用户名是 James 就会显示错误

index.php:1 Uncaught ReferenceError:casualjames 未定义

这是它接下来调用的代码

    function FightPlayer(enemyName){
    var xhttpe;
    if (window.XMLHttpRequest) {
        xhttpe = new XMLHttpRequest();
        } else {
        xhttpe = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhttpe.onreadystatechange = function() {
        if (this.readyState == 4 && this.status == 200) {
            BattlePlayers();
        }
    };
    xhttpe.open("GET", "FightPlayer.php?enemyname="+enemyName, true);
    xhttpe.send();
}

然后它调用我的 php 脚本,传入变量 enemyname 以供它使用

    <?php
    session_start();
    include 'Training.php';
    $link = mysqli_connect("","","","");

    if (isset($_SESSION['username'])) {
        $enemyname = $_REQUEST["enemyname"];
        echo $enemyname;
        $energyRemove = 1;
        $ExperienceGain = 1;
        $sql = "SELECT * FROM userstats WHERE username = '$enemyname'";
        $result = mysqli_query($link,$sql);
        $row = mysqli_fetch_assoc($result);
        $Defence = $row["Defence"];
        $winChance = CalculateWinChance($link,$Defence);
        $sql = "SELECT Energy FROM userstats WHERE username = '".$_SESSION['username']."'";
        $result = mysqli_query($link,$sql);
        $row = mysqli_fetch_assoc($result);
        $rand = rand ( 1 , 100 );
        if($row["Energy"] < 1 ){
                echo "<script type='text/javascript'>alert('Not enough energy to fight. please restore in character page');</script>";
        }else{
            if($rand < $winChance){
                $_SESSION['Battlemessage'] = "you won against ".$enemyname;
                $sql = "UPDATE userstats SET `Energy` = `Energy` - '$energyRemove' WHERE username = '".$_SESSION['username']."'";
                mysqli_query($link,$sql);
                $sql = "UPDATE userstats SET `Experience` = `Experience` + '$ExperienceGain' WHERE username = '".$_SESSION['username']."'";
                mysqli_query($link,$sql);
                $sql = "UPDATE userstats SET `Satoshi` = `Satoshi` + 2 WHERE username = '".$_SESSION['username']."'";
                mysqli_query($link,$sql);
            }else{
                $_SESSION['Battlemessage'] = "you lost against ".$enemyname;
                $sql = "UPDATE userstats SET `Energy` = `Energy` - '$energyRemove' WHERE username = '".$_SESSION['username']."'";
                mysqli_query($link,$sql);
                $sql = "UPDATE userstats SET `Satoshi` = `Satoshi` + 1 WHERE username = '".$enemyname."'";
                mysqli_query($link,$sql);
            }
            echo "";
        }
        calculateLevel($link);
    }
?>

我不确定错误实际发生在哪里我已经通过在线代码检查器将我的脚本放在了那里,并且一切都恢复正常。我哪里错了?

【问题讨论】:

  • 附带说明 - 这段代码都是为“存储的 XSS 攻击”设置的,您将未经清理的输入注入数据库,然后将其 ($enemyname) 输出到其他没有转义的用户。
  • @ArtisticPhoenix 哦,我的印象是您只需要为输入字段执行此操作?
  • 最好总是这样做,尤其是当您在会话中保存内容时,您可能会不小心允许输入参数,而您在编写此代码时认为该参数是安全的。最好在您输出到浏览器(不应该包含 html )的任何内容上使用 htmlentities ,这可能会解释嵌入式 javascript。这个想法是在它失败的时候保护它。所以查询,就在插入、更新、选择等之前,并在输出之前输出。然后你就不会担心以后如果你改变一些代码会影响它。
  • 存储型 XSS 攻击(通常)是在数据库中保存一些恶意 JS,然后将其输出给其他用户。这允许会话劫持和各种肮脏。仅仅因为会话中出现某些内容并不意味着它可以安全进入。您可以允许一些包含 JS 的文本,DB 不会太在意这一点,它只是文本。
  • @ArtisticPhoenix 很有趣,感谢您提供的信息。当我第一次启动我的网站时,我的一些朋友会提醒那里的用户名很有趣:P 如果你感兴趣,这是我制作 bitcoinrpg.com 的网站。它主要用于一个学习过程,我从头开始制作所有东西,所以我可以证明我学到了所有东西。

标签: javascript php ajax http


【解决方案1】:

你传递给你的javascript函数的字符串需要被引用,否则它认为它是一个变量:

echo("<th><input type='button' name = 'Attack_Btn' onclick = 'FightPlayer(\"".$row['username']."\")' value ='Attack'></th>");

【讨论】:

    【解决方案2】:

    您的错误很可能与 onclick 有关...您需要在此处对函数参数中的引号进行转义:

    echo("<th><input type='button' name = 'Attack_Btn' onclick = 'FightPlayer(\"".$row['username']."\")' value ='Attack'></th>");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-04
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2023-04-11
      相关资源
      最近更新 更多