我的 Codeigniter 使用 ajax 自动完成

Posted

技术标签:

【中文标题】我的 Codeigniter 使用 ajax 自动完成【英文标题】:My Codeigniter autocomplete with ajax 【发布时间】:2011-10-11 06:24:22 【问题描述】:

我正在向我的网站添加私人消息。在我的表单的收件人文本字段中,我想在有人开始输入时建议有效的用户名。在阅读了教程并研究了一些脚本之后,我编写了以下代码,用于从名为 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);
 

【问题讨论】:

【参考方案1】:

我建议进行一项修改...

我将通过将第二个参数 TRUE 传递给 get() 来启用 XSS 保护

    $username = trim($this->input->get('term', TRUE));

【讨论】:

【参考方案2】:

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

if($this->input->is_ajax_request())

//... process the input

else

    show_404();

【讨论】:

谢谢!我一定会补充的。【参考方案3】:

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

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

编辑:

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

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

【讨论】:

谢谢,我确实添加了limit('5'),所以有人无法检索整个数据库表。 哦,是的,它肯定会设置一个很大的障碍,但有人可以尝试不同的字母组合和脚本......我只是说你让整个用户群保持开放......可能是您想要的!但是如果您只想要“朋友”或能够自动完成的东西,那么您应该更改代码.. 是的,用户也通过邮件发送消息,但我单独处理。也许最好的办法是检查用户在提交时是否有效(没有 ajax)而不是建议。

以上是关于我的 Codeigniter 使用 ajax 自动完成的主要内容,如果未能解决你的问题,请参考以下文章

在 Codeigniter 中无需终端(无 AJAX)的页面加载时自动运行 PHP 服务器

CodeIgniter、Ajax... 如何使用 insert_id()

Codeigniter- Ajax Codeigniter Ajax - 通过ajax返回不止一行

使用 codeigniter 和 jquery 进行 AJAX 分页

在 CodeIgniter 中使用 AJAX 从数据库中获取单行?

如何在codeigniter中使用ajax在mysql数据库中插入数据?