Мой Codeigniter автозаполнен с помощью AJAX - PullRequest
3 голосов
/ 22 июля 2011

Я добавляю личные сообщения на мой сайт.В текстовом поле «Получатель» в моей форме я хочу предложить действительные имена пользователей, когда кто-то начинает печатать.После прочтения учебных пособий и изучения некоторых сценариев я создал следующий код для предложения имен пользователей из таблицы базы данных с именем 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 ]

2 голосов
/ 22 июля 2011

Существует одно редактирование, которое я бы рекомендовал сделать ...

Я бы включил защиту XSS, передав второй аргумент TRUE в get()

    $username = trim($this->input->get('term', TRUE));
2 голосов
/ 23 июля 2011

Вы также можете добавить больше исключений, если хотите, чтобы эта функция работала только для вызовов ajax:

if($this->input->is_ajax_request())
{
//... process the input
}
else
{
    show_404();
}
1 голос
/ 22 июля 2011

База данных активных записей Codeigniter должна очистить ваш код от любых SQL-инъекций.И если вы ничего не публикуете, вам не нужно беспокоиться о XSS.

Используя это, кто-то может получить список всех возможных имен пользователей ... но кроме этого я бы сказал, что это "безопасно" (это выглядит очень похоже на то, что я использую для своего сайта = p)

РЕДАКТИРОВАТЬ:

И если вы ничего не публикуете, вам не нужно беспокоиться о XSS.

Я должен уточнить, ЕСЛИ вы что-либо публикуете (отображая все, что вводит пользователь), то вам следует выполнить XSS-фильтр (который объясняет ответ johndavidjohn ниже меня [просто передайте TRUE как второй параметр]) .. Я не совсем понял, чтоВы подразумевали в своем объяснении, что такое «термин» ... Если все, что вы делаете, это поиск, то вам не нужно фильтровать XSS, но если пользователь может отправлять / писать сообщения (генерировать контент, который хранит ваш сайт [длябудет отображаться]), тогда вы должны XSS фильтр на iput.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...