我的Codeigniter使用ajax自动完成

时间:2011-07-22 17:54:44

标签: php mysql ajax json codeigniter

我正在向我的网站添加私人消息。在我的表单中的“收件人”文本字段中,我想在有人开始键入时建议有效的用户名。在阅读了教程并研究了一些脚本后,我制作了以下代码,用于建议我的数据库表中名为users的用户名。它有效,但我不确定它是多么正确和安全。

Jquery(使用Jquery UI自动完成插件):

$(function() {                     
    $( "#username" ).autocomplete({ //the recipient text field with id #username
        source: function( request, response ) {
            $.ajax({
                url: "http://localhost/mysite/index.php/my_controller/search_username",
                dataType: "json",
                data: request,
                success: function(data){
                    if(data.response == 'true') {
                       response(data.message);
                    }
                }
            });
        },
        minLength: 1,
        select: function( event, ui ) {
            //Do something extra on select... Perhaps add user id to hidden input    
        },

    });
}); 

控制器(为简单起见,我没有使用模型,虽然我计划)

function search_username()
{
        $username = trim($this->input->get('term')); //get term parameter sent via text field. Not sure how secure get() is

        $this->db->select('id, username'); 
        $this->db->from('users');
        $this->db->like('username', $username);
        $this->db->limit('5');
        $query = $this->db->get();

        if ($query->num_rows() > 0) 
        {
            $data['response'] = 'true'; //If username exists set true
            $data['message'] = array(); 

            foreach ($query->result() as $row)
            {
                $data['message'][] = array(  
                    'label' => $row->username,
                    'value' => $row->username,
                    'user_id'  => $row->id
                );
            }    
        } 
        else
        {
            $data['response'] = 'false'; //Set false if user not valid
        }

        echo json_encode($data);
} 

3 个答案:

答案 0 :(得分:2)

我建议制作一个编辑...

我会通过将第二个参数TRUE传递给get()

来启用XSS保护
    $username = trim($this->input->get('term', TRUE));

答案 1 :(得分:2)

如果您希望该功能仅适用于ajax调用,您还可以添加更多异常:

if($this->input->is_ajax_request())
{
//... process the input
}
else
{
    show_404();
}

答案 2 :(得分:1)

Codeigniter活动记录数据库应该使您的代码清除任何SQL注入。如果您没有发布任何内容,则无需担心XSS。

使用此人可以获得所有可能的用户名列表..但除此之外我会说它是“安全的”(它看起来非常类似于我用于我的网站= p)

修改

  

如果您没有发布任何内容,则无需担心XSS。

我应该澄清, IF 你发布任何内容(显示用户输入的任何内容)然后你应该进行XSS过滤(我下面的johndavidjohn的回答解释了[只是传递TRUE作为第二个参数])。我不太明白你在解释“术语”是什么时的意思......如果你所做的只是搜索,那么你不需要XSS过滤,但是如果用户可以发送/写入消息(生成)您的网站存储[要显示的内容])然后您应该 XSS过滤输入。