0

我有一个 HTML 表单,在提交后应该将表单字段呈现到 echo 语句中的 PHP 文件中(其中还包含 HTML 元素)

我遇到的问题是,虽然结果是按预期产生的,但在特定情况下,当表单条目中有“或”时,它们在 results.php 页面中没有转义

我的文件:

表单.html

<form action="./results.php" method="post" id="sgemail">  
  <table align="center" border="1" width="60%" style="border-color: #D2DFF5;">
    <tr>
      <td width="50%" style="padding-left: 8px; text-align: left;">
        <div class="form-group">
          <strong>Article 1 Title<br /></strong>
            <input type="text" class="form-control" id="ifn1title" placeholder="" name="ifn1title"><br />
          <strong>Article 1 URL<br /></strong>
            <input type="text" class="form-control" id="ifn1url" placeholder="" name="ifn1url">
        </div>
      </td>
      <td width="50%" style="padding-left: 8px; text-align: left;">
        <div class="form-group">
          <strong>Article 1 Description<br /></strong>
            <textarea rows="5" class="form-control" cols="10" name="ifn1desc" form="sgemail"></textarea>
        </div>
      </td>
    </tr>
  </table>
  <table align="center" width="60%">
    <tr>
      <td align="center" width="33%" style="padding-left: 8px; text-align: left;">
        <input class="btn btn-primary" type="submit" value="Generate Results HTML Code">
      </td>
    </tr>
  </table>
</form>

结果.php

<?php
  if (isset($_POST['ifn1title']))
  if (isset($_POST['ifn1url']))
  if (isset($_POST['ifn1desc']))
    {
      $form_ifn1t = $_POST['ifn1title'];
      $form_ifn1u = $_POST['ifn1url'];
      $form_ifn1d = $_POST['ifn1desc'];

echo "
<table style=\"background-color:#D6E3F0;\" bgcolor=\"#D6E3F0\" align=\"center\" width=\"100%\">
  <tr align=\"center\">
    <td align=\"center\"><br />

<textarea id=\"selectori\" rows=\"50\" cols=\"120\" onclick=\"this.focus();this.select()\" readonly=\"readonly\">

    <ul>
      <li><a href=\"$form_ifn1u\"><strong>$form_ifn1t</strong></a><br />$form_ifn1d</li>
    </ul>

</textarea>
    </td>
  </tr>
</table>";
}
?>

当我提交表格时,

相应位置的结果为

<ul>
  <li><a href="http://www.example.com"><strong>\"Article\"</strong></a><br />\"Test Description\"</li>
</ul>

我该如何解决它,以便结果如下所示?

<ul>
  <li><a href="http://www.example.com"><strong>Article</strong></a><br />Test Description</li>
</ul>

谢谢

编辑:

我在我的 php 文件上添加了以下内容,这解决了我的问题

{
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true);
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true);
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true);
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true);
}

可以防止代码注入吗?谢谢

4

2 回答 2

0

我在 PHP 5.3.29 如何关闭这个单个文件的魔术引号

你不想那样做。你希望他们彻底消失,一劳永逸。

请参阅此处了解它们是什么,它们存在的原因,它们为什么不好以及如何禁用它们。

长话短说,你真的应该升级你的 PHP 版本。

如果你不能这样做,你可能应该更换主机或丢弃任何阻止你这样做的东西。

第三个最佳选择是禁用魔术引号:

php_flag magic_quotes_gpc Off

最糟糕的选择是,如果您真的无法执行上述任何操作,那么对于 , 中的stripslashes每个条目$_GET,并且如果您使用它们。 因为您不能在运行时禁用魔术引号。从这里 1:1 复制:$_POST$_COOKIE$_REQUEST

<?php
if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

在你的情况下,那只是

$form_ifn1t = stripslashes($_POST['ifn1title']);
$form_ifn1u = stripslashes($_POST['ifn1url']);
$form_ifn1d = stripslashes($_POST['ifn1desc']);

升级您的 PHP 版本!

于 2015-05-18T14:43:30.730 回答
-2

回显 html 和 php 的最佳方式是:

<?php echo "<div class='my-class'>some HTML here, but i want my ".$php_variable." also in this text</div>";?>

顺便说一句,当您使用“”回显时,在 PHP 代码中使用“总是很麻烦。所以我总是使用单个 ',所以我不必排除“。

PS:直接回显 $_POST 变量不是最安全的方法。为确保您在一定程度上免受代码注入的影响,请确保使用如下基本内容:

$sendVar = stripslashes(htmlentities($_POST['var']));

这也应该解决包含斜杠的帖子的任何问题

于 2015-05-18T14:23:56.693 回答