当前浏览:首页 / WordPress函数 / esc_attr()

esc_attr( string $text )

转义HTML属性

attr

e 翻译more...

  • __() 检索$text的翻译
  • _e() 显示翻译文本
  • _ex() 使用gettext上下文显示翻译后的字符串
  • _n_noop() 在POT文件中注册多个字符串,但不翻译它们
  • _n() 基于提供的数字翻译和检索单数或复数形式
  • _nx_noop() 在POT文件中使用gettext上下文注册多个字符串,但不翻译它们
  • _nx() 使用gettext上下文,根据提供的数字检索单/复数形式进行翻译
  • _x() 使用gettext上下文检索已翻译的字符串
  • esc_attr__() 检索$text的翻译并将其转义,以便在属性中安全使用
  • esc_attr_e() 显示为在属性中安全使用而转义的翻译文本

esc 转义more...

  • esc_attr__() 检索$text的翻译并将其转义,以便在属性中安全使用
  • esc_attr_e() 显示为在属性中安全使用而转义的翻译文本
  • esc_attr_x() 使用gettext上下文翻译字符串,并将其转义以在属性中安全使用。
  • esc_attr() 转义HTML属性
  • esc_html__() 检索$text的翻译并将其转义,以便在HTML输出中安全使用。
  • esc_html_e() 显示为在HTML输出中安全使用而转义的翻译文本。
  • esc_html_x() 使用gettext上下文翻译字符串,并将其转义,以便在HTML输出中安全使用
  • esc_html() 转义HTML块
  • esc_js() 转义单引号、"、 、&,并修复行尾。
  • esc_textarea() 转义textarea值

参数

$text

(string) (必填)


返回

(string)


说明

编码<, >, &, ” 和 ‘ (小于、大于、与号、双引号和单引号)字符。不会对实体进行双重编码。

转义HTML属性(尤其是表单值)时始终使用,例如altvaluetitle等。要转义翻译的值,请改用esc_attr__();要转义、翻译和回显,请使用esc_attr_e()



源码

查看源码 官方文档


更新日志

版本描述
2.8.0开始引入

使用示例

  • 示例1

    当转义接受URI的属性的值(如hrefsrc)时,重要的是通过esc_url()传递值。如果只使用esc_attr(),代码可能仍然容易受到XSS攻击。(还要注意,当使用esc_url()时,您不需要同时使用esc_attr()。)

    <!-- 正确的: -->
    <img src="<?php echo esc_url( $src ); ?>" />
    
    <!-- 这样也行, 但 esc_attr() 是不必要的: -->
    <img src="<?php echo esc_attr( esc_url( $src ) ); ?>" />
     
    <!-- 不正确: -->
    <img src="<?php echo esc_attr( $src ); ?>" />
    
  • 示例2

    转义$_POST数据输出的示例

    <?php $fname = ( isset( $_POST['fname'] ) ) ? $_POST['fname'] : ''; ?>
    <input type="text" name="fname" value="<?php echo esc_attr( $fname ); ?>">
    
  • 示例3

    我不确定如果您要回显允许包含HTML实体的表单输入的值,因为它们丢失了,那么是否应该使用esc_attr()。例如,您可以从包含HTML实体的字符串开始(例如&),然后发现它们消失了(变成&)。

    用一个例子最容易解释:

    1.数据库中的值为Want to do a "br" tag? Do this: &lt;br&gt;';

    2.在页面表单input值内输出该值,代码如下

    <input type="text" value="<?php echo esc_attr($value);?>">

    这将生成类似HTML的

    <input value="Want to do a &quot;br&quot; tag? Do this: &lt;br>">

    3. 当浏览器显示时,它将解码HTML实体,向用户显示Want to do a "br" tag? Do this: <br>
    4. 当该表单提交回服务器时,浏览器将发送用户看到的值,即Want to do a "br" tag? Do this: <br>
    5. 如果你的数据库代码将用户的input按接收时的情况保存,它将保存为 Want to do a "br" tag? Do this: <br>

    注意到我们失去了HTML实体吗?我们一开始用 Want to do a "br" tag? Do this: &lt;br&gt;'; 但最后却变成 Want to do a "br" tag? Do this: <br>

    为了解决这个问题,esc_attr()应该对HTML实体进行双重编码;即产生这样的HTML:

    <input value="Want to do a &quot;br&quot; tag? Do this: &amp;lt;br&amp;gt;">

    注意到 <br> 标签已经被双重编码了。这意味着值 Want to do a "br" tag? Do this: &lt;br&gt; 将被显示给用户,从而得到提交,并在接下来保存。

    那么,对于允许有HTML实体的input,你应该使用什么函数?esc_textarea()

    下面是一个代码片段,显示了其中的区别。

    <?php
    $string_with_html_entities = 'Want to do a "br" tag? Do this: &lt;br>';
    ?>
    esc_attr: <input value="<?php echo esc_attr($string_with_html_entities);?>">

    这产生了以下HTML

    esc_attr: <input value="Want to do a &quot;br&quot; tag? Do this: &lt;br>">
    esc_textarea: <input value="Want to do a &quot;br&quot; tag? Do this: &amp;lt;br&amp;gt;">

    试试吧,你会发现第二种情况实际上是你想要的,如果你想在值中允许HTML实体。

  • 示例4

    使用esc_attr()转义属性时,务必在属性值周围使用引号。否则,您的代码仍然容易受到XSS攻击。

    <!-- This is correct: -->
    <input type="text" name="fname" value="<?php echo esc_attr( $fname ); ?>">
    
    <!-- This is *not* correct: -->
    <input type=text name=fname value=<?php echo esc_attr( $fname ); ?>>
    
  • 示例5

    注意,esc_attr将尝试避免双重编码。取此代码:

    echo esc_attr( 'A &amp; B' );

    这将打印A &amp; B而不是A &amp;amp; B