codeigniter $ this-> post->输入未发布完整值

时间:2012-09-05 14:32:29

标签: php codeigniter

我有一个用于上传嵌入代码的文本区域。当我发布嵌入代码时,它不会发布完整代码。 这是我的嵌入代码

<iframe frameborder="0" width="480" height="308" src="http://www.dailymotion.com/embed/video/xt7dgo?autoplay=0&logo=0&hideInfos=1&start=0&syndication=108944&foreground=%23F7FFFD&highlight=%23FFC300&background=%23171D1B"></iframe>

这是我的PHP代码。

public function embeded(){
    $this->form_validation->set_rules('video_heading', 'Video heading', 'required|trim|xss_clean');
    $this->form_validation->set_rules('embeded', 'Embeded code', 'required|trim|xss_clean');
    $this->load->model('videos');
    $error['error']="";
    if ($this->form_validation->run() == FALSE)
    {
        $error['error']= validation_errors();
        $this->load->view('sidebar');
        $this->load->view('addvideo', $error);
        $this->load->view('footer');
    }else{
        //<iframe width="420" height="315" src="http://www.youtube.com/embed/Niiyh3sxwYk" frameborder="0" allowfullscreen></iframe>
        $plink=$this->videos->processlink($this->input->post('embeded'));
        $info = array('heading'=>$this->input->post('video_heading'),
        'status'=>$this->input->post('status'),'video'=>$plink,
        'comment'=>$this->input->post('comment'),'category'=>$this->input->post('category'));   
        $this->load->model('videos');
        $obj= (object)$info;
        echo "opsted_link".str_replace("syndication","syndicate", $_POST['embeded']);
        if(isset($_POST['embeded']))
         {
              echo $_POST['embeded'];exit;
         }
        //$this->videos->addembededvideo($obj);
    }

}

当我使用它时,我得到的i帧代码部分是这样的。

<iframe frameborder="0" width="480" height="308" src="http://www.dailymotion.com/embed/video/xt7dgo?autoplay=0&logo=0&hideInfos=1&start=0&syndicati></iframe>

我将src中的参数syndication = 108944更改为syndicator = 108944。

现在我得到了完整的网址!

是“联合”是任何保留字吗? 为什么会这样?

3 个答案:

答案 0 :(得分:0)

我做了类似的事。

这是我控制器中的方法:

function framex()
{
    $this->load->helper('form');
    if(isset($_POST['frame']))
    {
        echo $_POST['frame'];exit;
    }
    $this->load->view('deneme');
}

这是视图页面:

<?php
    echo form_open('deneme/framex');
?>

<textarea name="frame"></textarea>

<?php 
    echo form_submit('submit','Submit');
    echo form_close();
?>

有效!

答案 1 :(得分:0)

您的输入可能会在XSS过滤器中被捕获。这正是XSS过滤器的设计目标;保护您的网站免受跨站点脚本攻击。请尝试删除要测试的xss_clean规则,但请注意,以免将其投入生产。

我的建议是只通过HTTP发送视频ID(在您的表单中)。在此特定的dailymotion视频中,您可以找到ID:xt7dgo。它实际上是<iframe>标签中唯一重要的信息。

其余属性是自动播放,徽标(打开或关闭),hideInfo(打开或关闭),启动...等等。所有这些属性都可以在服务器上重新创建。使用服务器回显<iframe>标记+提交的id +所有其他属性。

答案 2 :(得分:0)

就在line 607 2nd line_remove_evil_attributes System/core/Security.php xss_clean函数中,该错误存在。 $evil_attributes = array('on\w*', 'style', 'xmlns', 'formaction'); 正在调用它。

// All javascript event handlers (e.g. onload, onclick, onmouseover), style, and xmlns

我甚至不知道这是不是一个错误。他们基本上试图提供安全性

xss_clean

所以,我想你必须这么做。或者,您可以将“联合”更改为“辛迪加”(就像您现在所做的那样)并在{{1}}之后将其转换回联合。