【问题标题】:Stripslashes on PHP formPHP 表单上的 Stripslashes
【发布时间】:2015-05-18 14:17:48
【问题描述】:

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

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

我的文件:

form.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>

results.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);
}

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

【问题讨论】:

  • 看起来您需要关闭魔术引号,但如果您遇到这个问题,您确实需要升级您的 PHP 版本,因为魔术引号大约在三年前被删除了。
  • 我在 PHP 5.3.29 如何关闭这个单个文件的魔术引号

标签: php html forms stripslashes


【解决方案1】:

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

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

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

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

如果您不能这样做,您可能应该更换托管服务商或丢弃任何阻碍您这样做的东西。

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

php_flag magic_quotes_gpc Off

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

<?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 版本!

【讨论】:

    【解决方案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']));
    

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

    【讨论】:

    • 它不起作用,因为它再次返回了相同的输出。编辑:我在我的 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); } 问题就解决了。如何专门防止代码注入
    • 欢呼你让它工作。反对代码注入的最简单方法如上所述。为了更深入地讨论这个问题,我建议你在这里看看:stackoverflow.com/questions/1205889/… 或这里关于 mysql stackoverflow.com/questions/60174/…
    • 我添加的这段代码是否也是为了防止代码注入?我已经按照 Siguza 在 $form_ifn1t = stripslashes($_POST['ifn1title']); 中的建议进行了更改;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多