Drupal自定义模板安全问题

时间:2013-07-10 14:48:21

标签: security drupal drupal-7 drupal-theming

我主要是一个Wordpress的人,我正在努力学习Drupal 7的绳索。我的问题涉及模板最佳实践和安全问题。我正在处理非常复杂的设计(是的设计师对!!)所以我的标记需要干净而且恰到好处,我发现Drupal对模板文件和函数的大型层次结构非常困难。基本上,我发现一直在为我工作的工作流程是覆盖特定内容类型的输出,我需要在节点级别进行专门的标记。

例如:node - custom-content-type.tpl.php

就像我说我是一个wordpress的人,我习惯于能够运行数据库查询,抓住我想要的确切字段值,然后使用它们,但我想要。我一直在kpr或打印$ variables数组,研究它包含的内容,并直接获取值:

$link = $variables['field_link'][0]['url'];
$link_title = $variables['field_link'][0]['title'];
$target = $variables['field_link'][0]['attributes']['target'];
$text = $variables['field_main_text'][0]['safe_value'];

然后按照我的意愿回显并使用标记中的变量:

<article class="getstarted-wrapper">
    <a id="tocollege" target="<?php print_r($target); ?>" title="<?php print_r($link_title); ?>" href="<?php print_r($link); ?>"><img src="/sites/all/themes/amped/images/visiticon.png" /></a>
    <a id="mapcollege" target="_blank" title="View Location In Google Maps" href="<?php echo $maplink; ?>"><img src="/sites/all/themes/amped/images/mapicon.png" /></a>
    <div class="getstarted-top" style="background:<?php print_r($bg);  ?>;">
        <figure>
            <img title="<?php print_r($auth_title);  ?>" alt="<?php print_r($auth_alt); ?>" src="<?php print_r($auth_img); ?>" />
        </figure>
    </div><!--getstarted-top-->
    <div class="getstarted-bottom">
        <p><?php print_r($text); ?></p>
        <a target="<?php print_r($target); ?>" title="<?php print_r($link_title); ?>" href="<?php print_r($link); ?>">Get Started</a>
        <span>This will take you to <?php print_r($college_name);  ?></span>
    </div><!--getstarted-bottom-->  
</article><!--getstarted-wrapper-->

我想知道这个过程如何与最佳实践相匹配,我做错了什么,我做得对,更重要的是我的安全风险是什么?如何避免它们?

2 个答案:

答案 0 :(得分:1)

每当您将纯文本字符串(即任何非故意标记的内容)输出到HTML页面时,您都需要将其转义。

在普通的PHP模板中,通常使用htmlspecialchars()函数完成。 Drupal提供check_plain()作为捷径,虽然不是很短。您可以定义自己的短切以减轻疼痛:

function h($s) {
    echo htmlspecialchars($s, ENT_QUOTES, 'utf-8');
}

<a id="tocollege" target="<?php h($target); ?>" title="<?php h($link_title); ?>" href="<?php h($link); ?>">...

(我不确定print_r的用途是什么 - 这传统上用于生成可读的结构化对象输出以进行调试,但这种输出格式通常不是你想要的生产网页,并且在您的示例中,它仅用于字符串,无论如何它都没有区别。)

答案 1 :(得分:1)

Drupal的正确方法是在输出时清理用户输入。由于Drupal有多种输出模式(不仅仅是HTML),因此对输入进行清理是不合适的,所以在输出HTML时你可以使用Drupal的check_plain()函数作为bobince建议。 check_plain是可供使用的几种过滤函数之一,有关详细信息,请参阅https://drupal.org/node/28984

如果要覆盖输出并访问主题变量,那么自己运行check_plain(或其他过滤器函数)的最佳做法是正确的。如果它是节点属性,那么您也可以使用上面链接中描述的“安全”属性。