指定要解释为纯文本的页面的某些部分

时间:2011-05-31 05:30:23

标签: php mysql html

我是网络开发的初学者,我正在开发一个网站,允许用户发布各种讨论,其他人评论和回复。我面临的问题是,用户几乎可以发布任何内容,包括代码片段以及可能包含单引号,双引号甚至某些html内容的任何其他内容。

当这些帖子被发布时,它正在干预MySQL插入查询,因为引号正在结束字符串,因此查询失败。即使我使用php显示字符串,浏览器也会将字符串解释为html,我希望将其解释为文本。我是否必须手动解析输入字符串并转义所有特殊字符?还是有另一种方式?

5 个答案:

答案 0 :(得分:5)

你需要阅读一些事情

SQL Injection - 什么是SQL注入以及如何防止它

PHP PDO - 使用PHP PDO可降低注射风险

htmlentities

基本前提是,清理所有正在输入的输入并对所有输出内容进行编码。不要相信任何用户输入。

如果可能,请列入白名单而不是列入黑名单。

编辑:

我想在其中显示HTML或其他代码内容,用户需要使用<pre>标记标记这些区域。或者您可以使用类似markdown变体的内容进行格式化。

答案 1 :(得分:4)

使用PDO,预准备语句和绑定参数来插入/更新数据,例如

$db = new PDO('mysql:host=hostname;dbname=dbname', 'user', 'pass');
$stmt = $db->prepare('INSERT INTO table (col1, col2) VALUES (?, ?)');
$stmt->execute(array('val1', 'val2'));

编辑:请注意,这是一个非常简化的示例

显示数据时,请通过htmlspecialchars()进行过滤,例如

<?php echo htmlspecialchars($row['something'], ENT_COMPAT, 'UTF-8') ?>

更新

如您对其他答案的评论所述,如果您想在HTML中显示信息时保留缩进和空格,请将内容包装在<pre>标记中,例如

<pre><?php echo htmlspecialchars($data, ENT_COMPAT, 'UTF-8') ?></pre>

答案 2 :(得分:2)

查看PHP手册中的mysql_real_escape_stringhtmlentities函数。

您还可以阅读PHP手册中的Security章节。

答案 3 :(得分:1)

为了避免数据库中的查询中断(这意味着您没有转义它们,为sql注入留下大漏洞),在将值传递给查询字符串之前对值使用mysql_real_escape_string($string),将其括在引号中还

Ex. $value = mysql_real_escape_string($value);  // be sure to have an open connection before using this function.
$query = "select * from `table` where value = '".$value."'";

至于在html中显示,在将其输出到浏览器之前至少应该echo htmlentities($string)

类似echo htmlentities($ mystring,ENT_QUOTES)`;

编辑:

要保留空格,您可以使用nl2br函数(将线条制作转换为html equivalen <br />)或更深入$string = nl2br(str_replace(" ", " &nbsp;", $string));,但html代码看起来有点像丑,至少对我而言

参考:htmlentitiesmysql_real_escape_stringnl2br

答案 4 :(得分:0)

使用mysql_real_escape_string。最好在所有用户输入上使用它来防止SQL Injection攻击。