2

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

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

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

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

我真的不能接受......必须有一个答案,其中类似于我在这里发布的文本格式可以被清理。我想知道它是否以及如何可能。

谢谢......因为在我看来,当在其他地方问这个问题时,它往往会惹恼......我正在学习我需要知道的东西,但我认为我已经达到了我所知道的高原,没有一个例子它的意思是……

提前致谢。

4

3 回答 3

10

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

要记住的是:字符串应始终采用正确的编码。

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

I really <3 dogs & cats ;')

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

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

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

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

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

在代码中:

表单.html:

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

它生成的 URL:

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>'
于 2011-12-06T18:14:43.873 回答
1

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

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

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

于 2011-12-06T18:09:13.143 回答
0

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

例如:

$date_sql = date("Ymd", strtotime($_POST["date"]));

于 2011-12-06T20:06:55.353 回答