代码之家  ›  专栏  ›  技术社区  ›  tuomassalo

使用PHP(和ZF)对用户提供的数据进行HTML转义的最佳实践

  •  5
  • tuomassalo  · 技术社区  · 16 年前

    <?php echo $this->escape($this->myVariable); ?>
    

    我想至少 Smarty points against Smarty ,但也许至少其中一些在即将到来的3.0中得到了解决——我还没有检查过。

    PHPTAL

    • 有时视图只想打印前n个字符,我们不想最终截断数据 foo & bar foo &am (第一次逃离它是因为 foo &amp; bar )

    < >

    Twig Open Power Template

    4 回复  |  直到 16 年前
        1
  •  11
  •   Community Mohan Dere    6 年前
    1. 尽快。您应该确保所有文本输入都是正确的UTF-8,以使您的文本操作功能可预测地工作。

      但不要试图过滤掉“危险”的字符或片段!这不起作用。只修复或拒绝输入中的错误数据。没有什么不对的 < ' 字符。

    2. 尽可能晚。在SQL查询函数中添加SQL转义(或更好地使用预处理语句)。HTML模板中的HTML转义。在电子邮件生成函数中引用可打印转义符,在运行CLI命令时引用shell转义符等。

        2
  •  3
  •   bobince    16 年前

    解决方案0a

    <?php
        function h($s) {
            echo(htmlspecialchars($s, ENT_QUOTES));
        }
    ?>
    ...
    
    My lovely variable is <?php h($this->myVariable); ?>.
    

    我不知道为什么PHP不为此定义一个快捷方式,正如你所说,这是迄今为止最常见的用例。现在他们已经抛弃了XML PI样式标签的短标签,为什么没有另一个名称的标签来做正确的事情,比如说 <?phph ?

        3
  •  2
  •   Brienne Schroth    16 年前

    这不是一个完整的解决方案,但在这种情况下,匈牙利式符号是一个非常有用的方法。对我来说,一直使用的匈牙利符号很烦人,但在这种地方,变量名中的元数据非常有价值。一个好的做法是用一个前缀来命名你的变量,该前缀说明了它的预期内容……即$rawUserInput、$escapedUserInput等。

    这并不能完全解决问题,但这是一种很好的编码实践。然后,当你看到一段代码时,它说

    'SELECT * from table where username = ' + $rawUserName
    

        4
  •  0
  •   Gordon Haim Evgi    16 年前

    至于模板中的PHP很冗长,好吧。它可能不会提供最短的符号,但话说回来,它

    你也可以使用 Alternative PHP Syntax NowDoc or HereDoc 在模板中删除 <?php echo 打电话,这样你就可以得到这样的结果

    <?php
    // get some partial block done first
    foreach($this->books as $book):
    $loopdata = << LOOPDATA
    <li> {$book->title} -  {$book->author} - {$book->publisher}</li>
    LOOPDATA;
    endforeach;
    
    // render entire template
    echo << HTML
    <h1>{$this->title}</h1>
    <ul>{$loopdata}</ul>
    HTML;