2

我正在尝试在 Joomla 2.5 中创建一个自定义组件,并努力让它阻止它从编辑器字段中剥离所有 html 标签 - 链接、新行、p 标签 - 完整的作品。表单域如下:

<field
    name="post"
    type="editor"
    label="COM_HELLO_WORLD_EDITOR_LABEL"
    description="COM_HELLO_WORLD_EDITOR_DESC"
    class="inputbox"
    filter="JComponentHelper::filterText"
    required="true"
    default=""
/>

显然,在 SO 和 Joomla 论坛上都有很多关于此的帖子。然而,它们通常似乎有两个明确的主题。

  1. 微小的 MCE 设置。在将我的默认编辑器设置为“无”(即只是一个文本区域)后,我已经检查过了,标签仍然被剥离
  2. Joomla 文本过滤器设置。我以全局管理员身份登录,超级用户设置为“无过滤”

我为此覆盖了模型的保存功能:

function store()
{
    $row =& $this->getTable();
    $input = new JInput();
    $data = $input->getArray($_POST);

    //Sets Users id as current logged in user if not set
    if(!$data['jform']['post_user']) {
        $data['jform']['post_user']=JFactory::getUser()->id;
    }

    // Bind the form fields to the post table
    if (!$row->bind($data['jform'])) {
        $this->setError($this->_db->getErrorMsg());
        return false;
    }

    // Make sure the hello is valid
    if (!$row->check()) {
        $this->setError($this->_db->getErrorMsg());
        return false;
    }

    // Store the hello table to the database
    if (!$row->store()) {
        $this->setError($this->_db->getErrorMsg());
        return false;
    }
    return true;
}

我的直觉是它与 JInput 剥离 HTML 标签有关。但即使在保存文件中添加额外的行$data['jform']['post']=$input->getHTML('post');也没有任何反应。所以我不确定从这里去哪里。有任何想法吗?


更新

只是为了快速澄清一个问题 - 我想使用“全局配置”下预设的 Joomla“文本过滤器”设置,而不是手动设置组件中的每个标签!


更新 2

我将 filter="raw" 添加到编辑器表单字段中。现在,<p>当我转储变量时,我看到了 html 标记$_POST['jform']['post'], null, 'HTML')。然而,当只应用一个简单的 JInput 过滤器函数时——更不用说应用 Joomla 配置值了——我得到了空值。

    $input = new JInput();
    $data = $input->getArray($_POST);
    $data['jform']['post']=$input->get($_POST['jform']['post'], null, 'HTML');

这里的句子是“HTML - 返回一个完整的 HTML 实体和标签的字符串,受过滤器中的白名单或黑名单的约束。” 描述引用全局配置文本过滤器设置的 JInput HTML 过滤器?只是为了确认?

4

3 回答 3

1

尝试这样的事情

$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));

第一个数组是允许的标签,第二个数组是允许的属性。

于 2013-03-02T15:30:13.153 回答
0

这是关于什么的?filter="JComponentHelper::filterText"? 您是否编写了自定义过滤器?

与 Joomla 中的大多数东西(例如 acl)一样,默认过滤非常严格,因此如果您从不过滤中获得 xss,这是一个深思熟虑的选择,您没有在核心中做出安全风险。但是你的核心过滤应该被应用......除了你似乎已经被未知过滤器覆盖了。所以我怀疑给定这个未知的过滤器它正在回落到非常字符串。

于 2013-03-03T13:28:42.140 回答
0

过了一段时间,但只是为了记录,对于遇到同样问题的任何人,这里是我的解决方案。

对我来说,这个问题通过使用 JRequest 而不是 JInput 立即得到了解决。我相信它已被弃用,但它仍然在 JControllerForm 的 save() 函数中被 Joomla 2.5.14(目前最新的 Joomla 2.5)使用。

于 2013-10-16T14:29:22.150 回答