Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 关于防止使用magic_引号的SQL和使用htmlentities的XSS的问题_Php_Html Entities_Htmlspecialchars_Strip Tags - Fatal编程技术网

Php 关于防止使用magic_引号的SQL和使用htmlentities的XSS的问题

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攻

在我的服务器上,我关闭了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攻击的良好候选
  • 我应该打开魔术师引号吗

  • 使用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()
    ,这样您就可以选择要允许哪些标记以及要排除哪些标记,这样您的输出就不会被未分析的标记弄乱。