数据验证:始终转义延迟/转义HTML代码

时间:2015-05-07 作者:Philipp

我在市场上传了一个主题,但遭到了软拒绝,因为我应该“总是迟到”

我不知道如何解决这个问题,除了我自己。我有多个if语句,其中HTML保存在一个变量中。我在那里转义了用户值,后来输出了变量,但没有再次转义,因为它包含静态HTML代码。

<?php
if(get_post_meta( get_the_ID(), "portfolio-lightbox", true ) == \'1\') {
    $portfoliolink = \'<a href="\'. esc_url(wp_get_attachment_url( get_post_thumbnail_id() )) .\'" class="prettyPhoto" rel="prettyPhoto[portfolio]" title="\'.esc_attr(get_the_title()).\'">\';
} else {
    $portfoliolink = \'<a href="\'. esc_url(get_permalink()) .\'" title="\'.esc_attr(get_the_title()).\'">\';
}

echo $portfoliolink;
他们不喜欢echo $portfoliolink; 因为它没有逃脱。有多个像这样的if语句,其中包含带有HTML代码的变量。

由于性能原因,我不喜欢使用wp\\u kses。和esc_html() 会弄乱html代码。

也许我只是错过了一些显而易见的东西。你们能帮忙吗?

1 个回复
SO网友:MikeSchinkel

我和你一样沮丧。这并不是因为我认为他们(本质上)是错的,而是因为后期转义会给开发人员带来非常糟糕的体验和难以阅读的代码。

目前,大多数专业级WordPress开发人员都同意,延迟逃逸是输出安全的黄金标准:

  • 10up on Late Escaping

  • WordPress Codex on Output Sanitization

  • WordPress VIP on Always Escaping Late

    wp_kses_post() 并将其存储在template-tags.php 并在代码检查模板标记时将其指向该文件。

    下面是一个函数的外观,需要所有正确的输出转义:

    function the_portfolio_link( $post_id ) {
       return \'<a href="\' . esc_url( get_post_permalink( $post_id ) ) . "\'>" . 
          esc_html( get_the_title( $post_id ) ) . \'</a>\';
    }
    
    另一种方法可能是编写所有要重复使用的HTML作为部分模板。下面是一个名为the_partial() 加载可以包含在主题中的部分模板functions.php 文件:

    function the_partial( $template_file, $_partial_file, $args = array() ) {
        $_partial_file = dirname( $template_file ) . "/partials/{$_partial_file}.php";
        extract( $args, EXTR_SKIP );
        unset( $args );
        require ( $_partial_file );
    
    }
    
    然后,您可以从主题模板文件中调用部分模板:

    <?php the_partial( __FILE__, \'portfolio-link\', array( \'post_id\' => $post->ID ) ); ?>
    
    也就是说,我一直讨厌迟到逃跑,因为它给程序员而不是电脑带来了负担;后者不应该让我们更有效率吗?:-)如果非常反D.R.Y.的话,还要晚点逃跑。

    因为迟到逃逸让我非常困扰,我研究了一个更好的解决方案,并且已经在客户端应用程序中使用了几年了。解决方案是将对象用于post类型、分类术语、具有模块的用户角色和视图对象,其中视图对象根据命名约定自动转义模块方法。我最近发布了一个开源库WPLib 将此更好的解决方案打包供其他人使用。

    我们仍在beta版中等待1.0版本的发布,但该库已成功用于多个客户端站点;很想了解你对这个概念的看法。

    这里是a guide we have written for code-reviewing a WPLib-based sites 以及a guide for understanding a WPLib-based apps; 这应该可以让您有足够的希望理解它,而不需要您从头开始摸索库。

    顺便说一句,我给出的模板建议基本上是在WPLib中进行的,这是一种最佳实践,因为我们永远不希望特定于站点的HTML被嵌入到函数或类方法中,而在这些函数或类方法中,主题者必须知道PHP才能找到并理解它。

    希望这有帮助?

结束

相关推荐

Comment form validation

如何设置注释字段的验证规则?我更改了评论者姓名/电子邮件/主页onmouseover和onblur的值(我使用它而不是标签-因此如果字段为空,它会显示“您的电子邮件”、“您的主页”等)。问题是,在提交时,它会在主页字段中提交此文本(因为它没有验证,而不像电子邮件字段,如果您输入了除[email protected]).如何验证主页字段?