2

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

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

这是我的输入<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>防止 SQL 注入那样保存在数据库中吗?
  2. htmlentities防止 XSS 攻击的好选择吗?
  3. 我应该打开magic_quotes吗?
4

4 回答 4

2

不应该像<img src=\"image.png\"></img>防止 SQL 注入那样保存在数据库中吗?

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

htmlentities 是防止 XSS 攻击的好选择吗?

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

我应该打开magic_quotes吗?

不,您应该使用准备好的语句。

于 2011-08-25T20:29:30.350 回答
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 \\\\\"

更新问题的答案:

正确保存数据是这样的:

输入 -> php -> mysql_real_escape_string -> db -> php -> htmlspecialchars -> 浏览器

于 2011-08-25T19:56:30.620 回答
0
  1. 看来您的魔术引号已启用。核实。
  2. 有很多关于此的文章,但为了快速入门,不允许使用 javascript 和外部图像。
于 2011-08-25T19:56:45.677 回答
0

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

于 2011-08-25T19:58:20.740 回答