決定功能是私密還是公開的標準是什麼或什麼是標準。決定功能在CI中應該是私密還是公開的方式/標準
我總是編碼沒有聲明的功能,所以它被視爲公共,但它工作正常。不過,我在指南上看到這個,
在某些情況下,您可能希望某些功能隱藏公開訪問。要使某個功能成爲專用,只需添加一個下劃線作爲名稱前綴,並且不會通過URL請求提供。例如,如果你有這樣的功能:
控制器中的公共訪問功能如何?
我在每一個控制器上都有這行代碼。
if (! defined('BASEPATH')) exit('No direct script access allowed');
這可以防止用戶直接通過控制器並通過url權限訪問功能?
我試過了,儘管我把這行代碼用於查看頁面,如果有人試圖直接訪問視圖,他們會被髮送出去。
一個私有函數獲取一個錯誤,而我可以訪問函數聲明/假定爲公共。
什麼是功能的標準是'必須'私人。像訪問數據庫的功能?或有價值的數據?像來自用戶的輸入信息(敏感信息,如賬戶詳情/用戶名 - 密碼)?
或者我應該只保留一切私人,所以用戶不能直接訪問功能?
實施例:
我已命名爲 '主'
public function index(){
if($this->input->cookie('cookie',TRUE)){
}
else
$this->load->view('login');
}
檢查是否存在的cookie(如果用戶已登錄的話)缺省控制器。如果我將索引函數設置爲私有,每當我訪問根目錄/主文件夾時,它都無法訪問。所以我把它設置爲公開的。我的推理合乎邏輯/合理嗎?
public function login(){
$this->form_validation->set_rules('username', 'Username', 'required|callback_check_account');
$this->form_validation->set_rules('password', 'Password', 'required');
if($this->form_validation->run() == FALSE){
$this->load->view('login'); //i tried using redirect, but it does not pass the error message for validation
}else{
}
}
我宣佈登錄功能爲public。由於需要的數據通過登錄表單提交,因此它在調用時不能從回調函數訪問。
public function check_account($username){
$data = array('username' => $username, 'password' => $_POST['password']);
$result = $this->LoginModel->validate_account($data);
if(empty($result)){
$this->form_validation->set_message('check_account' , 'account does not exist');
$this->form_validation->set_message('required' , '');
return FALSE;
} else if($result == 'invalid'){
$this->form_validation->set_message('check_account' , 'password does not match');
$this->form_validation->set_message('required' , '');
return FALSE;
} else if($result){
$isLoggedin = array('username' => $result['username'] , 'type' => $result['status'] , 'is_loggedin' => TRUE);
$this->session->set_userdata($isLoggedin);
return TRUE; }
}
我聲明它是公開的,因爲如果我聲明它是私有的,我的回調會導致致命錯誤。用戶可以通過鏈接訪問此/Main/check_account/username
型號:
function validate_account($data){
$this->db->select('username,password')->where('username' , $data['username']);
$query = $this->db->get('admin')->result_array();
if(!empty($query)){
foreach($query as $row){
if($data['password'] != $row['password']){
return 'invalid'; }
else $query = array('username' => $row['username'] , 'password' => $row['password'] , 'status' => 'administrator');
return $query; }
} else {
$this->db->select('username,password')->where('username' , $data['username']);
$query = $this->db->get('user_mst')->result_array();
if(!empty($query)){
foreach($query as $row){
if($data['password'] != $row['password']){
return 'invalid'; }
else $query['status'] = 'user'; return $query; }
} }
}
編輯:改變了回調函數,以檢查是否
「帳戶不存在」
不顯示輸入的用戶名是否存在
,如果返回無效,則顯示
「密碼不匹配」
如果返回$查詢,我設置會話,加上帳戶狀態,因爲即時通訊創造只有1兩個管理員和用戶登錄。我仍然不知道我怎麼會在我的會話中使用
「型」
,但我只是把它放在那裏櫃面生病需要檢查會話,如果用戶是管理員或用戶,因此他們不能訪問彼此的頁面。
它帶來了什麼區別? 我也編輯了我的問題,更新了我的代碼。 – 2014-10-13 08:40:30
在CodeIgniter中,公共函數以Controller中的下劃線開頭,並不會公開爲網頁的動作,即/ Main/_check_account/username不會調用您的公共方法_check_account($ value)。這允許你爲不能通過HTTP訪問的驗證器編寫回調函數。你需要使回調「公開」(對於表單驗證器),但是保護HTTP訪問,比如CodeIgniter設計中的「private」。 – 2014-10-13 08:53:04
嗯,我明白,順便說一下,你可以檢查爲什麼我的會話用戶數據'用戶名'只打印爲'a',當我輸入時,print_r($ this-> session-> all_userdata()); – 2014-10-13 08:59:58