回显中的esc_attr/esc_html/esc_url

时间:2017-03-17 作者:emcolsson

您好,我正在尝试理解何时以及为什么我应该使用这些esc替代方案,到目前为止,我认为我理解需要确保输入不包含错误字符,并且不会导致错误/安全威胁。

我仍然想知道的是,我应该始终在HTML字段中使用esc\\u attr,还是在联系人表单的输入字段中使用esc\\u attr?对于我自己的所有url,例如image src path,我是否应该始终使用esc\\u url?

那么\\u title()呢?我应该在代码中使用这些转义中的一个转义到所有回音,还是只在可能有用户输入的地方使用?

2 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

对你应该一直逃跑

迟逃,常逃

转义与意图有关,如果要输出URL,请使用esc_url, 而且它肯定是一个URL(如果数据是恶意的,它将变得安全)

我仍然想知道的是,我应该始终在HTML字段中使用esc\\u attr,还是在联系人表单的输入字段中使用esc\\u attr?对于我自己的所有url,例如image src path,我是否应该始终使用esc\\u url?

如果是硬编码URL?例如。"http://example.com" ? No, 我们知道这很安全

如果是来自函数或其他来源的URL?例如。echo get_permalink()echo $url? Yes, you should escape 没有办法知道它是否安全

如果它是一个内部输出且不需要echo 陈述例如。the_permalink()? No 无法避免这种情况,函数需要在内部进行转义。输出缓冲区可以在紧急情况下使用,但这条路会导致疯狂

那么\\u title()呢?我应该在代码中使用这些转义中的一个转义到所有回音,还是只在可能有用户输入的地方使用?

无法逃避内部输出的函数。the_title 应该很好用,其他的也一样

有1个例外

bloginfo

出于安全原因,请不惜一切代价避免使用此功能。bloginfo 并不总是在内部转义,而且由于它在内部输出,因此无法添加转义。

解决方案使用get_bloginfo 并逃避结果,例如。

<a href="<?php echo esc_url( get_bloginfo( \'site\' ) ); ?>">
get_bloginfo 返回而不是输出值,允许我们使用转义函数。

关于过滤器的简要说明有时您希望通过过滤器传递内容,例如the_content, 但转义结果将去掉标记。

例如,这将删除当前的任何嵌入式视频:

echo wp_kses_post( apply_filters( \'the_content\', $stuff ) );
解决方案是:

echo apply_filters( \'the_content\', wp_kses_post( $stuff ) );
我们知道输入是安全的,因此输出必须是安全的。这假设在该过滤器上运行的任何代码也会相应地转义。对于这些情况,请使用WP核心过滤器执行此操作,但尽可能避免在您自己的过滤器和代码中需要此操作

SO网友:Mark Kaplun

如果需要转义的值是完全从代码生成的,就像通常在管理屏幕中一样,那么是的,总是转义。

当您需要输出核心API的结果时,事情会变得更加复杂,因为它们不一致,最好深入代码,看看API返回的值是否已经转义,the_title 可能是转义的,但如果使用API获取标记名,则需要转义它。

更困难的情况是,当您的输出只是某个更高层核心的输入时,比如您在过滤器或小部件中返回的值。小部件是令人讨厌的,因为在前端,除了小部件标题之外,您应该避开表单中的所有值。

根据经验,如果核心或核心主题中有类似的功能,请看看它们是如何处理转义的,并执行相同的操作。

相关推荐

Disable escaping html

我在用SyntaxHighlighter Evolved 突出显示代码示例。E、 g。[csharp] string s = \"text\"; List<int> numbers = new List<int>(); [/csharp] 当我第一次保存它时,没关系,但编辑wordpress时,文本会更改为[csharp] string s = &quot;text&quot;; List&lt;int&am