Php htmlentities具有';UTF-8';设置

Php htmlentities具有';UTF-8';设置,php,Php,我有一个表单,其中包括接受上传的图像并将其粘贴到数据库中。之前,我有一个过滤发布数据的功能,基本上是: function processInput($stuff) { $formdata = $stuff; $formdata = htmlentities($formdata, ENT_QUOTES); return "'" . mysql_real_escape_string(stripslashes($formdata)) . "'"; } 当我试图修复一些没有正确

我有一个表单,其中包括接受上传的图像并将其粘贴到数据库中。之前,我有一个过滤发布数据的功能,基本上是:

function processInput($stuff) {
    $formdata = $stuff;
    $formdata = htmlentities($formdata, ENT_QUOTES);
    return "'" . mysql_real_escape_string(stripslashes($formdata)) . "'";
}
当我试图修复一些没有正确转换的奇怪实体时,我将函数更改为(所做的更改是在htmlentities中添加了“UTF-8”位):

现在图像将不会上传

这是什么原因造成的?只需删除“UTF-8”位,就可以正确上传图像,但用户放入系统的一些MS Word实体显示为胡言乱语。发生了什么事

**编辑:由于我无法对这个beast上的代码做太多更改,所以我可以通过使用htmlspecialchars()而不是htmlentities()来粘贴绷带,这似乎至少可以在转换引号、尖括号等内容时保持图像数据不变。 bobince的建议非常好,但是在这种情况下,我现在不能花时间来修复这个项目中混乱的遗留代码。我处理的大多数东西都是面向对象和基于框架的,但现在我第一手了解了人们在PHP中谈论“意大利面代码”时的含义

此函数表示对字符串处理的基本误解,这是PHP程序员常见的误解

SQL转义、HTML转义和输入验证是三个独立的函数,用于脚本的不同阶段。试图一次完成所有任务是没有意义的;当在脚本的其他部分使用时,它只会导致任何一个进程的“特殊”字符被损坏。您可以尝试修补此功能,以修复应用程序某个部分的损坏,但您会破坏其他部分

为什么图像会被破坏?嗯,目前还不清楚图像数据从
$\u文件
临时上传文件到数据库的路径。但是,如果在任何时候涉及到这个函数,它都会完全破坏图像文件的二进制内容。删除反斜杠并转义HTML。。。没有一个图像能够存活下来

  • mysql\u real\u escape\u string
    用于转义一些文本以包含在mysql字符串文本中。它应该始终且仅在使用插入文本生成SQL字符串文字时使用,而不是全局应用于输入。因为输入中的某些内容不会立即或仅进入数据库。例如,如果
    echo
    HTML页面的一个输入值,当它包含
    这样的字符时,您会发现其中有一堆不需要的反斜杠。这就是为什么你的页面充满了失控的反斜杠

    (即使如此,参数化查询通常比手动字符串破解和
    mysql\u real\u escape\u string
    更可取。它们隐藏了字符串转义的细节,因此您不会被它们弄糊涂。)

  • htmlentities
    用于转义包含在HTML页面中的文本。它应该始终且仅在PHP的输出模板位中使用。在所有输入上全局运行它是不合适的,因为不是所有内容都会在HTML页面中结束,或者只在HTML页面中结束,而且很可能它会首先进入数据库,在那里您绝对不希望加载
    &垃圾使文本无法可靠地搜索或子字符串

    (即使如此,
    htmlspecialchars
    通常比
    htmlentities
    更可取,因为它只编码真正需要的字符。
    htmlentities
    将添加不必要的转义,除非你告诉它正确的编码方式,否则它也会完全弄乱所有非ASCII字符。
    htmlentities
    几乎永远不会(请使用。)

  • 至于
    stripslashes
    …好吧,有时候你需要把它应用到输入中,但是只有当愚蠢的
    magic\u quotes\u gpc
    选项打开时。你当然不应该一直应用它,只有当你检测到
    magic\u quotes\u gpc
    打开时。它早就被弃用了,谢天谢地,它已经消失了,所以它可能就这样了如果你检测到它被打开,它会弹出一条错误消息。然后你可以扔掉整个
    processInput
    东西

  • 总结如下:

    • 在开始时,执行全局输入处理。如果需要,您可以在此处执行特定于应用程序的验证,例如检查电话号码只是数字,或从文本或其他内容中删除控制字符,但此处不应发生转义

    • 在进行包含字符串文字的SQL查询时,在值进入字符串时对其使用SQL转义:
      $query=“SELECT*FROM t WHERE name=”。mysql\u real\u escape\u string($name)。“;
      。您可以定义一个名称较短的函数来执行转义以保存某些键入。或者,更易于理解的是,参数化

    • 当使用输入、数据库或其他地方的字符串进行HTML输出时,请使用HTML转义,例如:
      您好,!

      。同样,您可以定义一个具有短名称的函数来执行
      回显htmlspecialchars
      以在键入时保存

    此函数表示对字符串处理的基本误解,这是PHP程序员常见的误解

    SQL转义、HTML转义和输入验证是三个独立的函数,将在脚本的不同阶段使用。尝试一次完成它们是没有意义的;它只会导致任何一个进程的“特殊”字符在脚本的其他部分使用时被损坏。您可以尝试修补这些字符使用此函数尝试修复应用程序某个部分的损坏,但会破坏其他部分

    为什么图像会被损坏?嗯,目前还不清楚图像数据从
    $\u文件
    临时上传文件到数据库的路径。如果
    function processInput($stuff) {
            $formdata = $stuff;
            $formdata = htmlentities($formdata, ENT_QUOTES, 'UTF-8'); //added UTF-8
            return "'" . mysql_real_escape_string(stripslashes($formdata)) . "'";
        }
    
    function processInput($stuff) {
        $formdata = $stuff;
        $formdata = htmlentities($formdata, ENT_QUOTES);
        return "'" . mysql_real_escape_string(stripslashes($formdata)) . "'";
    }