关于使用magic_quotes关闭SQL和使用htmlentities的XSS防止SQL的问题

时间:2011-08-25 19:47:20

标签: php html-entities htmlspecialchars strip-tags

在我的服务器上,我关闭了magic_quotes。 当用户从表单中将内容保存为我的数据库中的文章时,我使用

$text = mysql_real_escape_string($_POST['text']);以防止SQL Injecion。

这是我的输入<img src="image.png"></img>,这是它保存在数据库<img src="image.png"></img>

中的内容

当我echo htmlentities($row['text']);我在屏幕上显示<img src="image.png"></img>时,在观看源上我得到&lt;img src=&quot;image.png&quot;&gt;&lt;/img&gt;

我的问题是

  1. 不应该像<img src=\"image.png\"></img>一样保存在DB中以防止SQL注入?
  2. htmlentities是防止XSS攻击的好候选人吗?
  3. 我应该打开magic_quotes吗?

4 个答案:

答案 0 :(得分:2)

  

不应该像<img src=\"image.png\"></img>一样保存在DB中以防止SQL注入?

不,SQL注入被广泛误解,主要是因为它们实际上与SQL无关,因为它们只是字符串操作。您不需要更改插入数据库的数据,只需将发送到数据库服务器的字符串更改为查询(除非您做出明智的选择并使用预处理语句而不是转义查询字符串)。数据一旦存储,就应该处于原始状态。

  

htmlentities是否是防止XSS攻击的良好候选人?

是的,但是htmlentities()适合将数据作为输出发送到浏览器,而不是将其存储到数据库中(因为来自数据库的数据可能用于除网页之外的其他内容)。

  

我应该开启magic_quotes吗?

不,你应该使用准备好的陈述。

答案 1 :(得分:0)

使用mysql_real_escape_string并将引号恢复正常:

$text = str_replace('\"', '"', $row['text']); // Alternative one
$text = preg_replace("/X/", '"', $row['text']); // Alternative two. X needs to be \\", \\\" or \\\\", perhaps \\\\\"

更新问题的答案:

正确保存数据如下:

输入 - &gt; php - &gt; mysql_real_escape_string - &gt; db - &gt; php - &gt; htmlspecialchars - &gt;浏览器

答案 2 :(得分:0)

  1. 似乎启用了您的魔术引号。检查一下。
  2. 有很多关于此的文章,但为了快速启动,不允许使用javascript和外部图像。

答案 3 :(得分:0)

从数据库中获取转义数据表明它已被双重转义 - 您的PHP是否已启用magic_quotes_gpc?如果你想要清理HTML并只允许你指定的某些结构,那么我建议你使用HTMLPurifier,它会得到你想要的严格或宽松。