为什么要使用esc_url?


12

这件事使我的编码变得困难。Wordpress Codex通过模糊地谈论安全性来说明使用esc_url的原因。但这真的值得麻烦吗?

例如,使用

<?php echo esc_url( home_url( '/' ) ); ?>

代替

<?php echo home_url() ?>

PS:我不是在谈论主题开发,而是在谈论特定站点。

Answers:


12

如果您查看有关“ 数据验证”的文档,则该函数将说明以下内容:

清理URL(在文本节点,属性节点或其他任何地方)时,请始终使用esc_url。拒绝没有提供的白名单协议之一的URL,消除无效字符,并除去危险字符。

在那里,您将获得–实际的安全优势。有效协议,没有模糊字符。

关于必要性的答案肯定是肯定的。转义输出是最基本的安全措施。


2
出于所有应有的尊重,例如,我看不到家庭链接如何构成安全风险。也许这些准则是针对主题创建的,而不适用于“私有”代码?毕竟,如果存在安全风险,最好以html硬编码家庭住址和其他链接,而根本不使用php?
IXN

9
始终如一地应用安全实践,比辩论每种情况是否值得都具有更大的生产力。:)
Rarst

7
另一方面,食典委建议的资源建立了规则3:信任WordPress。如果在适当的上下文中使用wp核心函数(如),这似乎建议不要过度消毒。根据该建议,我希望自己进行消毒。home_url()home_url
Franco

3

好吧,应该清除所有用户输入的内容...如果您输入的网址不是用户输入的内容(例如,您完全信任的人进行的网站设置,硬编码的值),则可以使自己摆脱esc-url的困扰。

但是,如果我可以将该网址注入您的网站,则在某些情况下,我可以轻松注入js代码,重定向代码...甚至服务器端代码。

这可能会导致会话劫持,用户帐户被盗以及其他不良选择。

编辑:

在您的示例中,esc_url( home_url( '/' ) );
它以半硬编码值运行!因此esc_url可以消除。
话虽如此,我仍然不明白为什么要在有威胁和无威胁之间进行区分,通常建议对每个值都保留esc_url()。


3
实际上, “由您信任的人进行站点设置” 仍然是用户输入。:)
Rarst 2015年

@Rarst是的,我和你在一起,但是他对esc_url感到非常“恶心”,我的想法更加宽容。
Tomer W

2

如果您要在HTML输出中使用该URL,esc_url()则必须牢记另一件事 <a href="SANITIZE_THIS_URL">your_text</a>,例如,要为链接使用href属性,对于图像元素使用src属性,则应使用esc_url()

esc_url_raw()用于您想要一个干净的URL但又不想对HTML实体进行编码的其他情况。因此,任何非HTML用法(数据库,重定向)都将使用此方法。

esc_url_raw()函数的功能与几乎相同esc_url(),但不会解码实体,这意味着它将不会用&#038替换&等。正如Mark所指出的,esc_url_raw()在esc_url_raw()的更多信息中,可以安全地用于数据库查询,重定向和HTTP函数(如“ wp_remote_get()” )中。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.