我是网络开发的初学者,我正在开发一个网站,允许用户发布各种讨论,其他人评论和回复。我面临的问题是,用户几乎可以发布任何内容,包括代码片段以及可能包含单引号,双引号甚至某些html内容的任何其他内容。
当这些帖子被发布时,它正在干预MySQL插入查询,因为引号正在结束字符串,因此查询失败。即使我使用php显示字符串,浏览器也会将字符串解释为html,我希望将其解释为文本。我是否必须手动解析输入字符串并转义所有特殊字符?还是有另一种方式?
答案 0 :(得分:5)
你需要阅读一些事情
SQL Injection - 什么是SQL注入以及如何防止它
PHP PDO - 使用PHP PDO可降低注射风险
基本前提是,清理所有正在输入的输入并对所有输出内容进行编码。不要相信任何用户输入。
如果可能,请列入白名单而不是列入黑名单。
编辑:
我想在其中显示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_string和htmlentities函数。
您还可以阅读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(" ", " ", $string));
,但html代码看起来有点像丑,至少对我而言
答案 4 :(得分:0)
使用mysql_real_escape_string。最好在所有用户输入上使用它来防止SQL Injection攻击。