如何在WordPress中同时转义多个属性?

时间:2017-10-26 作者:mlimon

我正在开发一个WordPress主题,并试图用一个变量同时转义存储区中的一组属性。

<?php 
$attributes = array();
$classes = array(
    \'header-section\'
);
if ( true == $noticebar ) {
    $classes[] = \'topnotice-exist\';
}
if ( true == $option[\'switch-top-bar\'] ) {
    $classes[] = \'topbar-exist\';
}
if ( true == $option[\'switch-menu-sticky\'] ) {
    if ( \'2\' == $option[\'fixed-menu-style\'] ) {
        $classes[] = \'fixed-after-pixel\';
    } elseif (\'3\' == $option[\'fixed-menu-style\']) {
        $classes[] = \'only-after-scroll-up\';
    } else {
        $classes[] = \'only-after-scroll\';
    }
}

$classes = implode( \' \', $classes );

if ( $classes ) {
  $attributes[] = \'class="\' . trim( $classes ) . \'"\';
}

if ( $option[\'transition\'] ) {
    $attributes[] = \'data-transition="\' . esc_attr( $option[\'transition\'] ) . \'"\';
}
$attributes[] = \'id="header"\';
$attributes = implode( \' \', $attributes );
?>

<div <?php echo $attributes; ?>> <!-- here is my question -->
    <!-- html/php -->
</div>
所以我的问题是我怎么才能逃脱$attribute 这里,我不能用esc_attr() 也没有esc_html() . 目前我正在使用wp_kses_post() 为了逃避这个$attribute 变量,但我不确定这是不是一个好主意。

我有个好主意sprintf()printf() 所以不要把他们带到这里,我只是想知道,我怎么能echo $attribute 根据WordPress的转义角色使用合适的方式?

1 个回复
SO网友:Jacob Peattie

转义属性的原因是确保值中没有任何字符会破坏元素的HTML。例如,如果您没有逃脱:

$attr = \'foo"> <script>alert("Bad!");</script>\'; 
那么这个:

<div class="<?php echo $attr; ?>"></div>
将输出:

<div class="foo"> <script>alert("Bad!");</script>"</div>
这样脚本就可以运行了。

所以wp_kses_post() 这是完全错误的,因为它不会阻止这一点,因为它不会为属性转义字符。这是什么esc_attr() 是,但不能将其用于当前代码,因为数组包含属性名和="". 意味着已经太晚了$attribute 因为在不破坏属性的情况下,无法转义值。

但问题是:除了一个属性外,所有属性都是由您编码的!逃逸任何类都没有意义,因为它们不是来自潜在的不安全用户输入。唯一需要转义的值是$option[\'transition\'], 因为它来自一个保存的选项。但你已经这么做了。

但是要回答标题中的问题,如果有人来搜索,批量转义属性的方法是将值放入数组并使用array_map() 要运行esc_attr() 在所有的人身上。

看这个例子,想象$attribute 最初填充了不安全的输入:

$attribute = array(
        \'attr1\',
        \'attr2\',
        \'attr3\',
        \'attr4\',
        \'attr5\',
);

$attribute = array_map( \'esc_attr\', $attribute );

结束

相关推荐

security issue in wordpress?

我已在中安装wordpresswww.mysite.com/user 现在假设有人熟悉wordpress,他/她可以通过www.mysite.com/user/memberswww.mysite.com/user/groups 甚至他都能看到www.mysite.com/user 没有登录到我的网站。有什么方法可以防止这种情况发生吗。类似于如果他没有登录或任何类型的重定向到特定url,访问就会被拒绝。或者你没有权限访问/members/ 在此服务器上。因此,我面临着很多问题。我使用frisco作为budd