Php 关于防止使用magic_引号的SQL和使用htmlentities的XSS的问题
在我的服务器上,我关闭了magic_引号。 当用户从表单将内容另存为我数据库中的文章时,我使用Php 关于防止使用magic_引号的SQL和使用htmlentities的XSS的问题,php,html-entities,htmlspecialchars,strip-tags,Php,Html Entities,Htmlspecialchars,Strip Tags,在我的服务器上,我关闭了magic_引号。 当用户从表单将内容另存为我数据库中的文章时,我使用 $text=mysql\u real\u escape\u字符串($\u POST['text'])以防止SQL错误 这是我的输入,它保存在数据库中 当我echo htmlentities($row['text'])我得到打印在屏幕上的,在查看源代码时我得到img src=“image.png”/img 我的问题是 不应该像那样保存在DB中以防止SQL注入吗 htmlentities是否是防止XSS攻
$text=mysql\u real\u escape\u字符串($\u POST['text'])代码>以防止SQL错误
这是我的输入,它保存在数据库中
当我echo htmlentities($row['text'])代码>我得到打印在屏幕上的
,在查看源代码时我得到img src=“image.png”/img
我的问题是
不应该像
那样保存在DB中以防止SQL注入吗
htmlentities
是否是防止XSS攻击的良好候选
我应该打开魔术师引号吗
使用mysql\u real\u escape\u字符串并将引号恢复为正常值:
$text = str_replace('\"', '"', $row['text']); // Alternative one
$text = preg_replace("/X/", '"', $row['text']); // Alternative two. X needs to be \\", \\\" or \\\\", perhaps \\\\\"
对最新问题的答复:
正确保存数据的方式如下所示:
input->php->mysql\u real\u escape\u string->db->php->htmlspecialchars->browser
似乎您的魔法报价已启用。检查一下
有很多关于这方面的文章,但是为了快速入门,不允许使用javascript和外部图像
从数据库中获取转义数据表明它是双重转义的-您的PHP是否启用了magic\u quotes\u gpc
?如果您想清理HTML,并且只允许通过指定的特定结构,那么我建议使用您想要的严格或宽松的结构
不应该像
那样保存在DB中以防止SQL注入吗
不,SQL注入被广泛误解,主要是因为它们实际上与SQL无关,因为它们只是字符串操作。您不需要更改插入数据库的数据,只需更改作为查询发送到数据库服务器的字符串(除非您做出明智的选择并使用准备好的语句而不是转义查询字符串)。数据一旦存储,应处于原始状态
htmlentities是防止XSS攻击的一个很好的候选者吗
是的,但是htmlentities()
适合将数据作为输出发送到浏览器,而不是存储到数据库中(因为数据库中的数据可能用于网页以外的其他用途)
我应该打开魔术师引号吗
不,您应该使用预先准备好的语句。带标签
很好,但您仍然可能会遇到麻烦。例如:
。出于这个原因,我建议使用Markdown或一些Wiki风格的语言。您好,您能检查一下我更新的答案吗?我刚刚关闭了magic_quotes。转义只能通过一层传输。如果对PHP->database执行一次转义,转义将被删除,数据将存储在数据库中,而不带转义。事实上,对于从数据库出来的数据,您仍然有转义,这意味着您有两次有效的转义(尽管PHP只是使用addslashes,这是不安全的)。htmlentities将html转换为纯文本,从而彻底破坏html。如果你想允许实际的html,你必须使用净化器为你过滤/净化它。谢谢你的回答。我的应用程序非常基本和简单,所以我选择暂时避免使用预先准备好的语句。我同意PDO、prepare和staments是必须使用的。我的问题是,为什么图像没有显示,但我在屏幕上看到了
?这取决于具体情况。如果您对mysql\u real\u escape\u string
感到满意,那就好了。在您的特定情况下,我不认为需要将整个图像标记保存在db中,因为您可以只保存图像路径并在输出中写入标记。但是,如果您仍然希望这样做,则如果希望将其解析为HTML标记,则在打印时不得使用htmlentities()
<当您不希望将某些文本解析为HTML标记时,可以使用code>htmlspecialchars()
或(更好的)htmlspecialchars()
。好的,
只是一个示例。比如说text
,因为用户可以用HTML发布内容。我读到htmlspecialchars()
不够安全。是这样吗?关于网页安全性,htmlentities()
和htmlspecialchars()
是相同的,前者只是转换更多的字符,但基本字符由两者转换。如果您需要处理用户数据(如注释),我建议改用strip_tags()
,这样您就可以选择要允许哪些标记以及要排除哪些标记,这样您的输出就不会被未分析的标记弄乱。