2011-07-22 28 views
3

我正在添加私人消息到我的網站。在我的表單中的收件人文本字段中,我想在有人開始輸入時提示有效的用戶名。在閱讀教程和學習一些腳本之後,我提出了以下代碼,用於從名爲users的數據庫表中建議用戶名。它有效,但我不確定它是多麼正確和安全。我的Codeigniter自動完成與阿賈克斯

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); 
} 

回答

2

有一個編輯,我會建議做...

我將使XSS保護通過傳遞第二個參數TRUEget()

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

好的提示!謝謝! – CyberJunkie

1

笨活動記錄數據庫應該讓你的代碼清理任何SQL注入。如果你沒有發佈任何內容,你不需要擔心XSS。

使用這個人可以得到所有可能的用戶名的列表。但除此之外,我會說這是「安全的」(它看起來非常相似,我使用什麼我的網站= P)

編輯:

如果你不發佈任何東西,你不需要擔心XSS。

我要澄清,IF您發佈任何東西(顯示任何用戶輸入的),那麼你應該XSS過濾器(這johndavidjohn的我下面的回答解釋了[只是通過TRUE爲第PARAM])..我沒不太明白你在解釋什麼「術語」是什麼意思......如果你正在做的是搜索,那麼你不需要XSS過濾器,但是如果用戶可以發送/寫入消息(生成內容您的網站商店[待顯示]),那麼你應該 XSS過濾器的iput。

+0

謝謝,我沒有添加限制('5')'所以有人不能檢索整個數據庫表。 – CyberJunkie

+0

哦,是的,它肯定會放大塊路障,但有人可以嘗試不同的字母組合與腳本.....我只是說你離開整個用戶羣打開..這可能是你想要的!,但如果你只想要'朋友'或某些東西能夠自動完成,那麼你應該改變代碼.. – mazlix

+0

是的用戶也通過郵件發送消息,但我分開處理。也許最好的辦法是檢查用戶是否有效提交(沒有Ajax)而不是建議。 – CyberJunkie

2

您還可以添加更多的例外,如果你想該功能將只適用於阿賈克斯調用:

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

謝謝!我一定會補充一點。 – CyberJunkie