这是一个非常重要的问题,实际上以编码的形式有一个简单的答案。您面临的问题是您同时使用多种语言。首先使用 HTML,然后使用 PHP,几秒钟后使用 SQL。所有这些语言都有自己的语法规则。
要记住的是:字符串应该始终采用正确的编码。
让我们举个例子。您有一个 HTML 表单,用户在其中输入以下字符串:
I really <3 dogs & cats ;')
按下提交按钮后,该字符串将被发送到您的 PHP 脚本。假设这是通过 GET 完成的。它被附加到 URL,该 URL 有自己的语法(例如 & 字符具有特殊含义),因此我们正在更改语言。这意味着必须将字符串转换为正确的 URL 编码。在这种情况下,浏览器会执行此操作,但 PHP 也有一个urlencode
的功能。
在 PHP 脚本中,字符串存储在$_GET
,编码为 PHP 字符串。只要您编写 PHP 代码,就完全没问题。但现在让我们将该字符串用于 SQL 查询。我们改变了语言和语法规则,因此字符串必须通过以下方式编码为 SQL:mysql_real_escape_string
功能。
在另一端,我们可能想再次将字符串显示给用户。我们从数据库中检索该字符串,并将其作为 PHP 字符串返回给我们。当我们想要将其嵌入 HTML 中进行输出时,我们再次更改语言,因此我们必须通过以下方式将字符串编码为 HTML:htmlspecialchars
功能。
在整个过程中,字符串始终采用正确的编码,这意味着用户可以想到的任何字符都将得到相应的处理。一切都应该顺利且安全地进行。
要避免的一件事(有时无知的人甚至会建议这样做)是过早地对字符串进行编码。例如,您可以申请htmlspecialchars
到字符串before将其放入数据库中。这样,当您稍后从数据库检索字符串时,您可以将其粘贴到 HTML 中,没有问题。听起来不错?是的,真的很棒,直到您开始收到人们的支持票,他们想知道为什么他们的 PDF 收据充满了& >
junk.
In code:
表单.html:
<form action="post.php" method="get">
<textarea name="comment">
I really <3 dogs & cats ;')
</textarea>
<input type="submit"/>
</form>
它生成的 URL:
http://www.example.org/form.php?comment=I%20really%20%3C3%20dogs%20&%20cats%20;')
帖子.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>'