【问题标题】:Confused regarding form protection (HTML, PHP)对表单保护感到困惑(HTML、PHP)
【发布时间】:2011-07-31 04:53:02
【问题描述】:

这对某人来说太容易了。我刚刚花了 6 个小时阅读,我现在觉得自己很愚蠢,但是嘿......我正在学习,所以我想 - 我会问你们!我在这里看到了一些关于其他事情的优秀例子,所以我想......为什么不问。我真正想要的只是有点简单,我敢肯定......我有一个表格,有人填写数据,我通过 JS 检查它的有效性,我检查 PHP 的有效性,我保护 SQL。这一切都很好。不能正常工作的是......如果 PHP 失败并且页面重新加载......我在 HTML 中有以下内容,我相信你们中的一些人很熟悉......

<textarea name="comments" maxlength="1024" rows="6" cols="45" wrap="VIRTUAL" id="field_comments" onblur="CheckField(name, 1, 0)"><?php echo $_POST['comments']; ?></textarea>

PHP 会通过 echo 输出之前在表单中输入的任何内容...实际上很简单。它工作得很好,因为我的 JS 和 PHP 用来剥离任何不是 a-zA-Z0-9 等的东西。我的朋友说我应该允许输入几乎任何东西并逃脱它。好的,没问题。我转义了它,但是当我输入单引号或双引号(测试将奇怪的东西放入字段中)并重新绘制它时 - 它保留了转义的东西。例如..我输入

“戴夫”,我回来了

\'戴夫\'

如果我再次点击提交......我得到......

\\'Dave\\' 等等...

我可以在不编写自己的自定义函数的情况下将其恢复为表单字段中的“Dave”吗?还是我必须这样做?

如果您想查看我制作的示例,我有一个示例测试页面,显示我正在修改的内容。

http://newmainpcs.perrycs.com/testForm.php

任何帮助都会很棒!我尝试对它们进行重新编码...我的主要网站是 UTF-8 - 该示例并没有真正显示我的主要网站,但我编写了这个小 testForm.php 来尝试解决这个问题!哈哈。我可以用 HTML 或 PHP 来做。 PHP 可能会更容易,因为这就是实际 REAL 验证的核心,因为可以关闭 JS。如果你愿意,我可以给你一些代码片段。但是,我相信你会明白我想说的话。

感谢您的帮助!

大卫·佩里 佩里CS 佩里计算机服务 (曾经是一个了不起的汇编语言程序员……这就是你 17 年以上不编程时会发生的事情)。哈哈。坚持简单的事情。

【问题讨论】:

  • 最好使用&lt;?php echo isset($_POST['comments']) ? $_POST['comments'] : ''; ?&gt;,否则当该字段不存在时您会收到警告。
  • 取决于错误报告设置的级别
  • @Sam,我的意见和良好做法是使用 E_ALL 作为您的错误报告级别,并将所有错误(甚至通知!)视为致命错误。
  • 嘿,我设置了 E_ALL。是的,我在开始时注意到 html 部分中出现疯狂的未定义错误,因为它没有采用触及它们的路径。所以我写了一个快速的小函数,它只是“接触”所有表单字段值并将它们设置为“”,因为有人在表单上的主要原因是填写表单!哈哈。我确实喜欢您将 isset 直接插入回声中的示例...我会记下在较小的表单上这样做的方式!这将为我节省一个功能!谢谢!我喜欢三元运算符:)

标签: php forms html-entities html-encode


【解决方案1】:

您要么激活了magic_quotes,要么使用addslashes 逃避了太多。请改用数据库层的引用功能,即mysqli_escape_string

PHP 5.4 终于摆脱了魔术引号 - 你也应该这样做:)


我认为你的问题是你做了太多的事情来保证你的应用程序安全。

你基本上只需要:

  1. 输入:将字符串插入数据库,用数据库层的转义函数引用
  2. 输出:htmlspecialchars($row_from_database)

这样,您就可以安全地抵御 SQL 注入 (#1) 和 XSS (#2)。

魔术引号尝试为不关心转义输入的人进行#1 中的转义,但这只是半心半意(魔术引号!= db 层引用)- 它可以被利用,即使它比它更难没有魔术引号。

删除它们

正如http://www.php.net/manual/en/security.magicquotes.what.php 所说,

这与 addlashes() 的作用相同。

首先,使用get_magic_quotes_gpc() 检查是否处于活动状态。 true 表示您的输入已经被转义。 然后在您正在使用的输入变量上运行stripslashes()

【讨论】:

  • 最好是完全禁用magic_quotes,因为这个(错误)功能已被弃用,并且造成的麻烦比它解决的要多。
  • 哇,回复快!我可以使用 mysqli_escape_string 将内容插入数据库没有问题 - 效果很好!让我感到困惑的是,当表单由于某种原因“失败”并且我必须重新绘制表单时,重新显示他们输入的内容。除非我使用引号,否则效果很好。然后我可以在输入字段中看到带引号的斜线,而我真的只想查看他们输入的确切内容。基本上,我有一个提交给 PHP 的表单字段 - PHP 回显到他们输入的表单。我希望它看起来与他们输入的内容、引号和所有内容完全相同...我的示例网站显示了问题。
  • 不是真的... mysqli_escape_string 不做 htmlentities 做的事情。
  • 我同意你的看法。它是为了安全地将东西插入数据库......对于这个例子......只是假装......我想要做的就是......获取一个表单字段,发送到php,然后让php完全按照它回显它被输入。行情和所有。 :) 我会检查我的 ISP 是否有魔术引号。 (谢谢)
  • 看起来其中一个正在打开... magic_quotes_gpc 打开 打开 magic_quotes_runtime 关闭 关闭 magic_quotes_sybase 关闭 关闭 有什么办法可以关闭它?我认为我的 ISP 不会仅为我的网站关闭它...
【解决方案2】:

当您将文本输出到 HTML 流的中间时,您必须小心地根据该文本在该 HTML 流中的确切输出位置对该文本进行编码。

对于在 HTML 属性中输出的文本,您需要一个编码函数(例如,将 " 替换为 \" 等)。对于作为 HTML 元素的文本内容输出的文本,您需要另一个编码函数(例如,将 &amp;lt; 替换为 &amp;lt; 等)。

【讨论】:

  • 我还注意到我正在输出到 value="" 字段。也许那些报价搞砸了......我会做一些测试。谢谢。
【解决方案3】:

要保护 SQL 中的输入,请使用 SQL 转义函数,如 mysql_real_escape_string。

如果您想保护输入免受 XSS 攻击(在 HTML 中重新显示时),请使用 htmlentities()。

另外,检查您是否使用 phpinfo() 在您的服务器上启用了 gpc_magic_quotes。如果是这样,请在您的 php.ini 文件中禁用它。

【讨论】:

  • 我会检查的。我现在在cpanel。我觉得将 phpinfo() 添加到我的一个文件中会更快.. 哈哈...
【解决方案4】:

一些基本代码:

session_start();
if (!validated) {
    $_SESSION['error'] = $_POST['message'];
} else {
    $s = mysql_real_escape_string($_POST['message']);
    mysql_query($s);
}

然后在你的 HTML 中:

<textarea>
    <?php 
        if (!empty($_SESSION['error'])) {
        echo htmlspecialchars($_SESSION['error']);
        unset($_SESSION['error']);
    ?> 
</textarea>

【讨论】:

  • 谢谢。我会检查一下,看看我做错了什么......我还意识到以前我回复错误的人认为“添加评论”会在底部,现在我注意到它在每个人回复。我以后会更加小心的。
猜你喜欢
  • 2019-05-09
  • 2023-04-05
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多