HTML文档重定向我。为什么呢?

时间:2016-01-26 15:08:34

标签: javascript php html

请注意,这个问题是关于计算机安全和跨站点请求伪造的主题,除了了解这些主题之外,我没有任何意图。

假设用户在dasak.csc.kth.se/zoobar上有当前会话,我将打算使用此代码:

  1. 将1个zoobar从用户帐户转移到另一个用户“sahand”。
  2. 我希望通过以下方式在我的文档中完成:

    1. 填写与dasak.csc.kth.se/zoobar/transfer.php上找到的表格相同的表格的值。 (我已将此表格复制到我的文件中)
    2. 提交值以便进行转移。
    3. 这是HTML文档:

      <form method="POST" name="transferform"
        action="http://dasak.csc.kth.se/zoobar/transfer.php">
      <p>Send <input name=zoobars type=text value="1" size=5> </p>
      <p>to <input name=recipient type=text value="sahand" size=10></p>
      <input type=submit name=submission value="Send">
      </form>
      <script>
      document.transferform.submit()
      </script>
      

      当我打开此文档时会发生的情况是我被重定向到http://dasak.csc.kth.se/zoobar/transfer.php,并且表单中填入了我在HTML文档中提供的值。据我所知,由于用户的动作标量不变,因此未进行任何转移。

      那么,我问的是,如何才能获得此文档以实现所需的功能?

      编辑:transfer.php的PHP代码:

      <?php 
        require_once("includes/common.php"); 
        nav_start_outer("Transfer");
        nav_start_inner();
        if($_POST['submission']) {
          $recipient = $_POST['recipient'];
          $zoobars = (int) $_POST['zoobars'];
          $sql = "SELECT Zoobars FROM Person WHERE Username='" .
                 addslashes($user->username) . "'";
          $rs = $db->executeQuery($sql);
          $sender_balance = $rs->getValueByNr(0,0) - $zoobars;
      
          $sql = "SELECT Username, Zoobars FROM Person WHERE Username='" .
             addslashes($recipient) . "'";
          $rs = $db->executeQuery($sql);
          $recipient_exists = $rs->getValueByNr(0,0);
          if($zoobars > 0 && $sender_balance >= 0 && $recipient_exists) {
            $sql = "UPDATE Person SET Zoobars = $sender_balance " .
                   "WHERE Username='" . addslashes($user->username) . "'";
            $db->executeQuery($sql);
            $sql = "SELECT Zoobars FROM Person WHERE Username='".
                   addslashes($recipient) . "'";
            $rs = $db->executeQuery($sql);
            $recipient_balance = $rs->getValueByNr(0,0) + $zoobars;
            $sql = "UPDATE Person SET Zoobars = $recipient_balance " .
                   "WHERE Username='" . addslashes($recipient) . "'";
            $db->executeQuery($sql);
            $result = "Sent $zoobars zoobars";
          }
          else $result = "Transfer to $recipient failed.";
        }
      ?>
      

2 个答案:

答案 0 :(得分:0)

if($_POST['submission']) {

表单测试是否有一个名为&#34; submission&#34;在您发送到页面的数据中。

<input type=submit name=submission value="Send">

使用该名称的唯一控件是提交按钮。

如果您使用它提交表单,那么它将是一个成功的控件并包含在表单数据中。

 document.transferform.submit()

您没有使用提交按钮提交表单。

因此,它不是一个成功的控制,并且不包含在数据中。

所以你必须:

  • 通过将提交的控件在提交的数据中包含名称/值
  • 在PHP
  • 中更改测试
  • 手动提交表单而不是JS

答案 1 :(得分:0)

像Quentin所说的那样,PHP代码将寻找名称“提交”,显然只有在使用按钮提交时才会提供。所以我用一个新命令document.getElementsByName("submission")[0].click()完成了这个。这样做了。所以最终的HTML文档如下所示:

<form method="POST" name="transferform"
  action="http://dasak.csc.kth.se/zoobar/transfer.php">
<p>Send <input name="zoobars" type=text value="1" size=5> </p>
<p>to <input name="recipient" type=text value="sahand" size=10></p>
<input type=submit name="submission" value="Send">
</form>
<script>
document.getElementsByName("submission")[0].click()
</script>