2013-02-13 54 views
2

顯然你應該驗證服務器端的所有用戶輸入數據。我只是好奇什麼被認爲是「正確的」輸入驗證和它應該完成的順序。正確的PHP輸入驗證順序

截至目前(和最近的項目過去)我已經這樣做了:

獲取用戶輸入,實例化對象,並調用該方法:

if(isset($_POST['addCat'])) { 
    $db = new DBConnection; 
    $categories = new Category($db); 

    if($categories->insert_cat($_POST['name']) === TRUE) { 
     echo "Category Inserted Successfully!"; 
    } 
} 

的從實例化對象中調用的方法:
1.轉義用戶輸入
2.將data_validation對象隔離(請參見下面的驗證對象)

class Categories { 
    public function insert_cat($catName) { 
     $catName = $this->mysqli->real_escape_string($catName); 
     $validate = new data_validation; 

     if(!($validate->validate_string($catName))) { 
      echo "Invalid characters found in category name"; 
      die(); 
     } 

     $query = $this->mysqli->query("INSERT INTO categories(name) VALUES ('".$catName."')"); 

     if($query === false) { 
      printf("Error: %s\n", $this->mysqli->error); 
      die(); 
     } else { 
      return true; 
     } 
    } 
} 

data_validation類其中:
1.修剪數據
2.數據匹配正則表達式
3.返回數據到insert_cat方法數據庫插入

class data_validation { 
    public function validate_string($data) { 
     // Remove excess whitespace 
     $data = trim($data); 

     if (preg_match("/^[0-9A-Za-z \.\-\'\"]+$/", $data)) { 
      return true; 
     } else { 
      //return 'Not a valid string'; 
      return false; 
     } 
    } 
} 

所以基本上在簡而言之,我的問題是:首先轉義數據,然後修改它,然後將其與正則表達式進行比較,然後添加htmlentites()或其他類型的內容以保留任何格式,或者應該按不同的順序完成?

提高我的安全習慣的任何提示都非常值得歡迎!

+0

首先格式化消毒,然後是SQL查詢之前的數據庫轉義。在相關說明中,如果您要使用* prepared statements *,則可以跳過SQL轉義。 - 'htmlentities'應在輸出前先應用。 – mario 2013-02-13 03:51:45

+0

所以這不是一個問題,我首先逃避用戶輸入?我可以使用準備好的語句,但我不熟悉PDO。我以爲'htmlentities'是爲了保存數據庫中的html實體,然後使用'html_entity_decode'來解碼html實體? – 2013-02-13 03:54:15

+2

哎呀,是的。那就錯了。逃避必須是最後一步。而mysqli也允許參數綁定。 'htmlentities'與數據庫無關。在將文本寫入HTML上下文(=頁面輸出)時使用它,而不是之前。 – mario 2013-02-13 03:56:13

回答