Php 向用户显示json时使用XSS

Php 向用户显示json时使用XSS,php,javascript,jquery,json,xss,Php,Javascript,Jquery,Json,Xss,我通过jQuery获得了一些JSON格式的数据,然后我需要将其显示给用户,但是它容易受到XSS攻击。在这里我有什么选择,我应该在把数据放入数据库之前去掉字符吗?我正在使用的框架(Kohana)有一个漂亮的函数HTML::Chars(),但由于我使用javascript显示数据,因此无法在那里使用它 一种选择似乎是遍历被json编码的每个数组元素,并应用HTML::Chars()到它。这是唯一的选择吗?如果是的话,最佳的方法是什么 例如: 用户输入一些数据:标题,正文 数据被存储到数据库中 然后其

我通过jQuery获得了一些JSON格式的数据,然后我需要将其显示给用户,但是它容易受到XSS攻击。在这里我有什么选择,我应该在把数据放入数据库之前去掉字符吗?我正在使用的框架(Kohana)有一个漂亮的函数
HTML::Chars(),但由于我使用javascript显示数据,因此无法在那里使用它

一种选择似乎是遍历被json编码的每个数组元素,并应用
HTML::Chars()到它。这是唯一的选择吗?如果是的话,最佳的方法是什么

例如:

  • 用户输入一些数据:
    标题,正文
  • 数据被存储到数据库中
  • 然后其他一些用户进入站点,从数据库中获取数据数组 并导出为json格式
  • 我的jQuery脚本使用json并将新元素添加到 我的页面主体
  • 代码:

    $(document).ready(function(){
        $.ajax({
            url: '/timeline/latest/1',
            dataType: 'json',
            success: function(data){
                $.each(data, function(key, val) {
                    switch (val.type){
                        case 'post': // I have only made post so far
                            addPost(val);
                            break;
                    }
                });
            }
        });
    })
    function addPost(val){
        $('.content .timeline').prepend(val.title + '<br />' + val.body); // xss vulnerable
    }
    

    我建议你像Drupal那样做

    Drupal不过滤任何输入。如果要显示此HTML代码而不进行过滤,则它会在数据库中存储带有XSS漏洞的文本

    相反,它对输出进行过滤。您绝对应该在服务器端这样做

    您应该从Drupal使用的函数中获得启发

    确保它适用于您的每个条目。当然,如果可以的话,可以在全球范围内这样做,如下所示:

    // In the Model_Timeline class
    public function Latest( $id ) {
    
        // Get your array, and then
        foreach ( $array as $entry ) {
    
            // Filter each entry
            // I use $util->filter_xss but use it how you implemented it
            $entry = $util->filter_xss( $entry );
        }
    
        // And return the filtered array
        return $array;
    }
    

    在将mysql\u real\u escape\u字符串存储到数据库之前,应该调用它,htmlspecialchars是可选的。您的问题是,您不想只向用户显示html,因此htmlspecialchars将无法工作,因为它编码的内容类似于

    如何容易受到XSS攻击?如果我键入javascript,它将执行它。示例:我在body字段中键入这个
    哦,我明白你的意思,让我给你写一个答案。不需要
    mysql\u real\u escape\u string()因为它可以防止SQLInjection,因为我使用的是NoSQL,所以不可能在我的网站上执行sql注入。
    
    array_walk($latest, function(&$latest){
        foreach ($latest as &$key){
            $key = HTML::chars($key);
        }
    });
    
    // In the Model_Timeline class
    public function Latest( $id ) {
    
        // Get your array, and then
        foreach ( $array as $entry ) {
    
            // Filter each entry
            // I use $util->filter_xss but use it how you implemented it
            $entry = $util->filter_xss( $entry );
        }
    
        // And return the filtered array
        return $array;
    }