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
$\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)) . "'";
}