Joomla的JInput在每个过滤器上都会删除HTML

时间:2013-10-17 12:36:55

标签: php joomla joomla2.5

我正在尝试在Joomla 2.5中安全地将HTML文本保存到数据库,所以我使用JInput来获取表单数据。

根据developer.joomla.org,有HTML过滤器:

  

HTML - 返回一个包含完整HTML实体和标签的字符串   过滤器中的白色或黑色列表。

根据docs.joomla.org,有这些过滤器应该(逻辑上。它们没有在那里解释)通过HTML标签:

  

RAW,HTML,SAFE_HTML

在JInput用于过滤的代码JFilterInput::clean处,没有SAFE_HTML过滤器。我不知道它在一个文档中做了什么以及为什么另一个文件中缺少RAW过滤器。除此之外,所有这些过滤器无论如何都会剥离HTML标签。

只需$ _POST:

$_POST['shortDescription'];

返回

<b>Hello <i>world</i></b>

当我使用JInput时:

$input->get('shortDescription', '', 'RAW');
$input->get('shortDescription', '', 'HTML');
$input->get('shortDescription', '', 'SAFE_HTML');

所有回报只是

Hello world

没有HTML标记。那是什么呢?当我需要安全地存储HTML时如何使用它?

4 个答案:

答案 0 :(得分:2)

我用这种方法做了一遍:

public function getHtmlInput($htmlText)
{
    $input_options = JFilterInput::getInstance(
        array(
            'img','p','a','u','i','b','strong','span','div','ul','li','ol','h1','h2','h3','h4','h5',
            'table','tr','td','th','tbody','theader','tfooter','br'
        ),
        array(
            'src','width','height','alt','style','href','rel','target','align','valign','border','cellpading',
            'cellspacing','title','id','class'
        )
    );

    $postData = new JInput($_POST, array('filter' => $input_options));

    return $postData->get($htmlText, '', 'HTML');
}

用法:

$this->getHtmlInput('documentation');

我希望在Joomla 3中解决这个问题......

答案 1 :(得分:1)

你应该这样做:

$jinput = JFactory::getApplication()->input;
$html = JComponentHelper::filterText($jinput->post->get('shortDescription', '', 'raw'));

答案 2 :(得分:0)

这是一篇很老的帖子,但我想我会投入2美分,因为它可能会帮助人们找到这篇文章寻找解决方案。

使用html编辑器,它仍然使用HTML过滤器剥离html。为了解决这个问题,我使用ARRAY作为过滤器,然后只是破坏结果。

Easy bo breazy。

答案 3 :(得分:0)

(在Joomla 3.x的上下文中)JInputFilter实例的默认配置是在白名单模式下运行,带有空列的白名单标签和属性,即。 HTML过滤最有限的可能模式,有效地摆脱了一切。

这显然没有开箱即用的功能,但它选择安全性而不是方便性,并让开发人员有意识地决定放宽安全性以接受接收内容中的标签和属性备用JInputFilter实例,可以是:

A)带有指定的标签白名单(@Jon最终在他自己的答案中做了什么)

$filter = JInputFilter::getInstance(array('img', ...), array('src', ...));

B)配置为以黑名单模式运行

$filter = JInputFilter::getInstance([], [], 1, 1);

除此之外,除非您禁用$ xssAuto选项(请参阅下面的用法),否则Joomla将强制执行以下黑名单,而不管JInputFilter实例配置的模式是什么:

标签:'applet','body','bgsound','base','basefont','embed','frame','frameset','head','html ','id','iframe','ilayer','layer','link','meta','name','object','script','style','title','xml'< / p>

属性:'action','background','codebase','dynsrc','lowsrc'

供参考,以下是JFilterInput::getInstance方法的使用信息:

/**
 * Returns an input filter object, only creating it if it doesn't already exist.
 *
 * @param   array    $tagsArray   List of user-defined tags
 * @param   array    $attrArray   List of user-defined attributes
 * @param   integer  $tagsMethod  WhiteList method = 0, BlackList method = 1
 * @param   integer  $attrMethod  WhiteList method = 0, BlackList method = 1
 * @param   integer  $xssAuto     Only auto clean essentials = 0, Allow clean blacklisted tags/attr = 1
 * @param   integer  $stripUSC    Strip 4-byte unicode characters = 1, no strip = 0, ask the database driver = -1
 *
 * @return  JFilterInput  The JFilterInput object.
 *
 * @since   11.1
 */
public static function &getInstance($tagsArray = array(), $attrArray = array(), $tagsMethod = 0, $attrMethod = 0, $xssAuto = 1, $stripUSC = -1)

Joomla还在管理界面的“全局配置”页面的“文本过滤器”选项卡上提供可配置的过滤规则。在这里,您可以配置操作模式,以及基于每个用户组过滤的标签和属性。要在您自己的代码中利用此功能,请根据@ xavip的答案使用JComponentHelper::filterText()方法。