消除PHP / SQL $ _POST,$ _GET等......?

时间:2011-12-06 18:00:28

标签: php mysql-real-escape-string html-entities htmlspecialchars

好的,这个主题是我理解的温床。我也明白这种情况取决于您使用的代码。我有三种情况需要解决。

  1. 我有一个表格,我们需要允许人们发表使用逗号,波浪号等的评论和陈述......但仍然可以安全地免受攻击。

  2. 我让人们进入这样的日期:10/13/11 mm / dd / yy英文,可以消毒吗?

  3. 如何正确理解如何正确使用htmlspecialchars()htmlentities()real_escape_string()?我已经阅读了php.net网站和这里的一些帖子,但在我看来这是一个情况,这一切都取决于阅读问题的人是什么正确的答案。

  4. 我真的不能接受......必须有一个答案,其中与我在这里发布的文字格式相似的文字格式可以进行清理。我想知道它是否以及如何成为可能。

    谢谢......因为在我看来,当在其他地方提出这个问题时,它往往会烦恼......我正在学习我需要知道的东西,但我认为我已经达到了一个我能够知道的高原而没有一个这是什么意思......

    提前致谢。

3 个答案:

答案 0 :(得分:10)

这是一个非常重要的问题,它实际上有一个编码形式的简单答案。你面临的问题是你同时使用了很多语言。首先是HTML,然后是PHP,几秒钟之后是SQL。所有这些语言都有自己的语法规则。

要记住的是:字符串应始终处于正确的编码状态。

让我们举个例子。您有一个HTML表单,用户在其中输入以下字符串:

I really <3 dogs & cats ;')

按下提交按钮后,此字符串将发送到您的PHP脚本。让我们假设这是通过GET完成的。它被附加到URL,后者有自己的语法(&amp;字符具有特殊意义)因此我们正在更改语言。这意味着必须将字符串转换为正确的URL编码。在这种情况下,浏览器会执行此操作,但PHP也具有urlencode功能。

在PHP脚本中,字符串存储在$_GET中,编码为PHP字符串。只要您编写PHP,这就完全没问题了。但现在让我们把字符串用在SQL查询中。我们更改语言和语法规则,因此必须通过mysql_real_escape_string函数将字符串编码为SQL。

另一方面,我们可能希望再次将字符串显示给用户。我们从数据库中检索字符串,并将其作为PHP字符串返回给我们。当我们想要将它嵌入HTML输出时,我们再次更改语言,因此我们必须通过htmlspecialchars函数将字符串编码为HTML。

在整个过程中,字符串始终处于正确的编码状态,这意味着用户可以提出的任何字符都将被相应处理。一切都应该顺利和安全。

要避免的事情(有时这甚至被无知者推荐)过早地编码你的字符串。例如,您可以在将放入数据库之前将htmlspecialchars应用于字符串。这样,当您稍后从数据库中检索字符串时,您可以将它粘贴在HTML中没问题。听起来不错?是的,真的很棒,直到你开始得到人们的支持票,想知道为什么他们的PDF收据充满了&amp; &gt;垃圾。

在代码中:

form.html:

<form action="post.php" method="get">
    <textarea name="comment">
        I really <3 dogs &amp; cats ;')
    </textarea>
    <input type="submit"/>
</form>

它生成的网址:

http://www.example.org/form.php?comment=I%20really%20%3C3%20dogs%20&amp;%20cats%20;')

post.php中:

// Connect to database, etc....

// Place the new comment in the database
$comment = $_GET['comment']; // Comment is encoded as PHP string

// Using $comment in a SQL query, need to encode the string to SQL first!
$query = "INSERT INTO posts SET comment='". mysql_real_escape_string($comment) ."'";
mysql_query($query);

// Get list of comments from the database
$query = "SELECT comment FROM posts";

print '<html><body><h2>Posts</h2>';
print '<table>';

while($post = mysql_fetch_assoc($query)) {
    // Going from PHP string to HTML, need to encode!
    print '<tr><td>'. htmlspecialchars($post['comment']) .'</td></tr>';
}

print '</table>';
print '</body></html>'

答案 1 :(得分:1)

关键是要了解您可以使用的每种消毒功能 ,以及何时应该使用它。例如,数据库转义函数旨在使数据安全插入数据库,并应该这样使用;但HTML转义函数旨在消除恶意HTML代码(如JavaScripts),并使输出数据安全,供用户查看。在合适的时间消毒正确的事物。*

  • 您可以采用两种不同的基本方法:您可以在收到HTML时对其进行清理,或者您可以完全按照收到的方式对其进行存储,并仅在需要将其输出给用户时进行清理。这些方法中的每一种都有其支持者,但第二种方法可能是最不容易出现问题的(第一种方法,如果在您的消毒程序中发现缺陷并且您发现数据库中存储的消毒内容不足,您会怎么做? ?)

可以使用日期解析功能清理日期。在PHP中,您可以查看strtotime()。您的目标通常是获取日期的字符串表示形式,并输出表示日期的对象或以规范方式表示相同日期的另一个字符串(即:以特定格式)。

答案 2 :(得分:0)

关于日期的清理,PHP有一些内置函数可能会有所帮助。 strtotime()函数将几乎任何可以想象的日期/时间格式转换为Unix时间戳,然后可以将其传递给date()函数以将其转换为您喜欢的任何格式。

例如:

$ date_sql = date(“Y-m-d”,strtotime($ _POST [“date”]));