我认为这与字符串串联中使用的三元运算符有更多关系。
我将通过依赖一个经典的if语句来消除这个问题,但WordPress提供了一个有用的函数selected
, 给我们:
$terms = get_terms( \'department\' );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
echo \'<select class="widefat" name="departments">\';
foreach ( $terms as $term ) {
echo \'<option value="\'. $term->name .\'"\'.selected($_POST[\'departments\'], $term->name, false ).\'>\'. $term->name . \'</option>\';
}
echo \'</select>\';
}
然而,这里发生了一些更令人震惊的事情,与你的问题无关。如果我们有一个名为
"><script>alert(\'hello world\');</script><option>
? 由于一个未经转移的变量输出,我们有一个注入攻击的途径。因此,让我们使用一些转义来更新代码,以确保其安全:
$terms = get_terms( \'department\' );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
echo \'<select class="widefat" name="departments">\';
foreach ( $terms as $term ) {
echo \'<option value="\'. esc_attr( $term->name ) .\'"\'.selected($_POST[\'departments\'], $term->name, false).\'>\'. esc_html( $term->name ) . \'</option>\';
}
echo \'</select>\';
}
现在,可能意外插入的任何HTML或实体都已变得安全,代码也安全了。我们还可以简化代码,使其更易于阅读:
$terms = get_terms( \'department\' );
if ( ! empty( $terms ) && ! is_wp_error( $terms ) ) {
echo \'<select class="widefat" name="departments">\';
foreach ( $terms as $term ) {
?>
<option value="<?php echo esc_attr( $term->name ); ?>"
<?php selected($_POST[\'departments\'], $term->name);?>>
<?php echo esc_html( $term->name );?>
</option>
<?php
}
echo \'</select>\';
}