4

我目前在我的一个项目中使用以下行:

htmlspecialchars($value,ENT_QUOTES,'UTF-8');

因此它对 &, ', ", <,> 进行编码。我的问题是(至于我正在考虑的一些内部编码原因)不编码 & 是否存在任何安全风险?因此,如果使用以下行会产生安全性风险/泄漏:

$value=str_replace('&amp;','&',$value);

对于 <,>,'," 我非常清楚为什么应该对它们进行编码,因为它们可以用于 html 注入。但是我没有看到任何原因(到目前为止我也没有找到任何特殊原因)。

编辑:

由于多次提到数据库访问。我在那里使用带有参数的学说,......所以数据库应该(相对)从SQL注入中保存。

上述转换只是为了防止 html 注入,但目前由于大多数数据位于由 extJS 创建的字段中,......“&”转换阻碍了那里的方式,因为在文本字段&amp;中显示而不是&.

可悲的是,由于架构错误,我只能在一个且只有一个位置执行整个 htmlspecialchars 和 str_replace 部分(如果我这样做的话)。我无法区分。因此,我对&.

4

3 回答 3

4

每当您接受用户输入然后继续将其作为表达式进行评估、将其输出回网页或将其直接注入 SQL 语句时,都会存在安全风险。htmlspecialchars编码一些(不是全部)可用于恶意目的的字符,例如 SQL 注入攻击中使用的单引号和双引号。htmlspecialchars不应用于输入安全性。您应该使用复杂的专用方法来删除、编码或转义潜在的不安全字符。有各种特殊字符和过滤规避技术没有htmlspecialchars考虑到(例如,IE6 和 US-ASCII)。就个人而言,如果它们不是适当的输入,我更喜欢删除任何特殊字符(JavaScript 删除非字母数字输入:)input = input.replace(/\W/g, '');

在客户端使用 JavaScript 清理/转义用户输入,避免将用户输入评估为表达式,并为 SQL 操作使用准备好的语句(例如,PDO)总是很重要的。

如果我们能看到更多您的应用程序,我们就能更好地判断您是否有安全问题。

于 2012-12-28T09:16:24.193 回答
2

不编码是否存在任何安全风险&

任何仍在运行基于 Netscape 4 的浏览器的人都存在安全风险,其中&{...}属性是运行 JS 的后门方法。希望您今天没有任何 Netscape 用户,但谁知道未来一些古怪的浏览器可能会如何解析格式错误的 HTML...

存在功能风险,因为转义&对于 HTML 标记绝对是正确的事情,而不转义可能会破坏您的输出。例如。标记= cut&copy&paste,输出= cut©&paste

目前,由于大多数数据位于由 extJS 创建的字段中,...“&”转换妨碍了那里的方式,因为在文本字段中显示 & 而不是 &。

那是一个不同的错误——你应该找到并修复它,而不是试图解决这个问题。您如何创建字段,并将数据放入创建它们的代码中?

如果您将值注入 JavaScript 变量,那么您需要对它们进行 JS 转义,而不是对它们进行 HTML 转义;这两种情况需要不同的处理。一个潜在的解决方法是隐藏文档 HTML 内容中的数据(通常在data-属性中)并在 JS 中从那里读取。

于 2012-12-28T23:23:41.890 回答
1

htmlspecialchars与安全性无关,但与 HTML 规范有关,表明这些字符是特殊的。为了安全起见,还有其他类型的转义 - 具体而言,重要的一种是在将事物插入数据库之前发生的转义,但这不是htmlspecialchars用于的。

每当您想输出 HTML 文本时,您都可以使用htmlspecialchars,例如

<div id="here" class='here'> or here </div>

这样做的原因是,如果第一个here包含文字引号,您的 HTML 中会出现语法错误;与第二个here和双引号或第三个here和小于号相同。我认为大于符号没有那么危险,但是为了平衡而被替换(如果我错了,请有人纠正我)。Ampersand 被替换,以便如果有人想要显示&quot;,而不是转义它会显示"。正确htmlspecialchars处理后,您将获得&amp;quot;HTML,它将呈现为所需的&quot;.

正如 Blender 所说,它使文本看起来像你想要的那样。与安全无关。

编辑:或者更确切地说,它可以与 HTML 安全性有关(我刚刚想到)。假设有人将第一个替换为here..."><script src="http://malicio.us/code"/><p id="如果它被正确转义,则不会发生任何事情,它只是属性内的那段奇怪的文本。但如果不是……至少,这与 SQL 安全性无关。

于 2012-12-28T09:16:46.527 回答