对表单保护感到困惑(HTML,PHP)

时间:2011-07-31 04:53:03

标签: php forms html-entities html-encode

对某人来说这很容易。我只花了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',而无需编写自己的自定义函数来执行此操作?或者我必须这样做?

如果你想看看我做的例子,我有一个示例测试页面,显示我正在修改的内容。

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

任何帮助都会很棒!我尝试解码它们重新编码它们...我的主要网站是UTF-8 - 这个例子并没有真正显示我的主要网站,但我写了这个小的testForm.php来试图弄明白这一点!大声笑。我可以用HTML或PHP来做。 PHP可能会更容易,因为实际的REAL验证的核心是因为JS可以关闭。如果你愿意,我可以给你一些密码。但是,我相信你会得到我想说的话。

感谢您的帮助!

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

4 个答案:

答案 0 :(得分:2)

您已激活magic_quotes,或使用addslashes逃脱太多。请改用数据库图层的引用功能,即mysqli_escape_string

PHP 5.4终于摆脱了魔术引用 - 你也应该做的事情:)


我认为您的问题是您做了太多事情以确保您的应用程序安全。

你基本上只需要:

  1. 输入:将字符串插入数据库,引用数据库层的转义函数
  2. 输出:htmlspecialchars($row_from_database)
  3. 通过这种方式,您可以安全地使用SQL注入(#1)和XSS(#2)。

    对于那些不关心逃避输入的人来说,魔术引号尝试在#1中进行转义,但这只是半心半意(魔术引用!= db层引用) - 它可以被利用,即使它比没有魔法引号。

    删除它们

    http://www.php.net/manual/en/security.magicquotes.what.php所述,

      

    这与addslashes()相同。

    首先,检查get_magic_quotes_gpc()是否有效。为true表示您的输入已被转义。 然后对您正在使用的输入变量运行stripslashes()

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

如果要保护输入不受XSS(在HTML中重新显示),请使用htmlentities()。

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

答案 3 :(得分:0)

一些基本代码:

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>