在我的服务器上,我关闭了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>
时,在观看源上我得到<img src="image.png"></img>
。
我的问题是
<img src=\"image.png\"></img>
一样保存在DB中以防止SQL注入?htmlentities
是防止XSS攻击的好候选人吗?答案 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)
答案 3 :(得分:0)
从数据库中获取转义数据表明它已被双重转义 - 您的PHP是否已启用magic_quotes_gpc
?如果你想要清理HTML并只允许你指定的某些结构,那么我建议你使用HTMLPurifier,它会得到你想要的严格或宽松。