这完全安全吗
也许是,也许不是。我会从另一个角度解决这个问题,暂时忽略安全性......
URL 编码有一个目的:百分比编码(它的实际名称是什么)一个 url。想象一下,“url 编码”将替换所有空格,<space width='1'>
而不是实际的%20
或它现在所做的任何事情。...?q=foo bar
在我们想象的例子中,url“ ”将变成“ ...?q=foo<space width='1'>bar
”,并且是一个正确的“url编码”url。这在 PDF 或 CSV 文件或您要创建的任何其他类型的输出中可能很有用,但在 HTML 中这会引起麻烦。在您的情况下,因为'
这将“结束”href
属性1'>
作为垃圾离开。
<a href='https://example.com/search?q=foo<space width='1'>'>
因为您的输出是针对 HTML 的,所以实际上,至少恕我直言,您应该这样做HTMLEncode(URLEncode(MyUrl))
(伪代码)。
记住这一点:转义总是在特定的上下文中完成。对于 SQL,您需要一些类似“mysql_real_escape”的东西来转义引号等,以避免 SQL 注入漏洞。在 HTML 中,您需要转义诸如"
and之类的字符<
,在 RTF 文件中,您甚至需要转义其他字符串/字符,例如(我实际上不知道)\
会变成\\
或类似的东西,在 CSV 文件中您需要转义,
或;
在字段值和 JSON 输出中,您需要一个包含 a 的字符串"
以转义为\"
. 每种类型的输出(格式)都需要自己的转义/编码。
您现在正在做的是“嵌套上下文”,您将“url 上下文”嵌套在“HTML 上下文”中。所以你必须相应地转义/编码。
正如 TrueBlue 所证明的那样,它并不安全。