1

I have a minor problem. When I use this code:

<!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>

The web browser says:

Notice: Undefined index: subbut in /Applications/MAMP/htdocs/decwargen.php on line 17

when I first go to the page, then

Notice: Undefined index: crtd in /Applications/MAMP/htdocs/decwargen.php on line 24

when I enter data. Can anyone please help?

4

4 回答 4

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']))
        {
于 2013-10-26T14:47:02.233 回答
1

作为一个额外的安全提示,切勿在未消毒的情况下打印某些内容。

- 编辑 -

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

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

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

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

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

我冒昧地打印了宣战下方的表格,以便您可以根据需要宣战更多战争。

代码如下所示...

<!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 年提出的。不过,我将Notice: Undefined index: subbut ...使用更现代的 PHP 功能来解决问题。

我会换...

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

和 ...

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

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

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

在此处输入图像描述

HTML 注入

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

我不会提交名称为 John Doe,而是提交John Doe</form><form action="http://example.com" target="_blank"><input value="You got hacked">

结果在下图中可见...

在此处输入图像描述

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

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

有人可能会说原始示例不是打印表单。当然。但这并没有改变我想要表达的意思。

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

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

于 2018-12-20T14:50:51.810 回答
0

你有一个报价错误。尝试改变

type='text name='crtd'

type='text' name='crtd'
于 2013-10-26T14:50:37.997 回答
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>
于 2013-10-26T14:48:47.917 回答