Codeigniter:使用<script>里面的<script>提交textarea

时间:2013-10-14 15:43:47

标签: php jquery regex codeigniter code-injection

因为我不知道在哪里搜索这个 - 也许这里有人可以帮助我。

我需要用户在textarea中添加这样的内容:

<script> var foo  bar; </script> 
<script type="text/javascript" src="http://foobar.de/mylist.js"></script>

但Codeigniter似乎有一个内置的代码注入保护 - 所以我提交后得到的是:

[removed] var foo  bar; [removed] 
[removed][removed]

我怎么能改变这个?我知道这是不安全的,但我需要解析URL。

作为替代方案,我需要一个jQuery函数来解析这个URL ....我对regEx不是很熟悉。 ^^

我的PHP解析器看起来像这样(从某处复制^^):

$reg_exUrl = '/\b(?:(?:https?|ftp|file):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i';
if (preg_match($reg_exUrl, $_POST['code'], $matches)) {
        $jsUrl = $matches[0];
}

1 个答案:

答案 0 :(得分:0)

@ Gavin的评论很好。可能是您没有看到它,因为脚本标记会使其不可见(如果您尝试echoprint结果)。

function index()
{
    echo form_open();
    echo form_textarea('test');
    echo form_submit('', 'Submit');
    echo form_close();

    if($this->input->post())
    {
        echo "<pre>";

        $textified = str_replace('<', '&lt;', $this->input->post('test', false));
        echo "textified string = $textified <br><br>";

        // find URL. Regex from http://stackoverflow.com/a/2721152/183254
        preg_match_all('/\b(?:(?:https?):\/\/|www\.|ftp\.)[-A-Z0-9+&@#\/%=~_|$?!:,.]*[A-Z0-9+&@#\/%=~_|$]/i', $textified, $result, PREG_PATTERN_ORDER);

        echo "URL in textified string: " . $result[0][0];
    }
}

编辑:

以上情况似乎取决于$config['global_xss_filtering'] = FALSE;的设定。当$config['global_xss_filtering'] = TRUE;时,无论如何都会过滤所有字段,并且没有办法让选择字段不通过过滤器。因此,如果将TRUE设置为$this->input->post(),则上述情况将不起作用。

false的默认值是XSS过滤为false,因此上例中的$config['global_xss_filtering'] = FALSE;也是多余的。

这似乎唯一的方法就是离开$this->input->post('filtered_item', true);并在希望 XSS过滤的所有输入字段上设置$this->input->post('unfiltered_item');并仅使用{{1对于需要脚本标记的字段。

http://ellislab.com/forums/viewthread/182774/#871558