php - 清理 PHP/SQL $_POST、$_GET 等...?

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

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

  1. 我有一个表格,我们需要允许人们使用逗号、波浪号等发表评论和声明...但仍能免受攻击。

  2. 我有人输入这样的日期:10/13/11 mm/dd/yy(英文),这个可以清理吗?

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

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

谢谢...因为在我看来,当在其他地方问这个问题时,它往往会惹恼...我正在学习我需要知道的东西,但我认为我已经达到了我可以知道的稳定状态它的用途示例...

提前致谢。

最佳答案

这是一个非常重要的问题,它实际上以编码的形式有一个简单的答案。您面临的问题是您同时使用多种语言。首先是 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到字符串 before 将其放入数据库。这样,当您稍后从数据库中检索字符串时,您可以毫无问题地将它粘贴到 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>'

关于php - 清理 PHP/SQL $_POST、$_GET 等...?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8404501/

相关文章:

php - MySQL 错误代码 1054 ......需要帮助的新手

php - 使用 SQL 输出 1 by 1

python - 将html实体替换为Python 2.6中对应的utf-8字符

jquery html() 默认解码 html 实体?

php - 查询数据库时出错

php - Javascript、PHP json不会解析?

ruby - 如何在 Ruby 中插入或更新之前转义字符串

php - 为什么要费心使用 mysql_real_escape_string() 因为 $_POST 会自动在引号前添加斜杠?

php - 如何将 mysql_real_escape_string 设为零

html - 为什么是 HTML 十进制和 HTML 十六进制?