明らかに、サーバー側ですべてのユーザー入力データを検証する必要があります。「適切な」入力検証と見なされるものと、それを実行する順序に興味があります。
現在(および過去の最近のプロジェクト)の時点で、私は次のようにしています:
ユーザー入力を取得し、オブジェクトをインスタンス化し、メソッドを呼び出します。
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()
またはそのようなものを追加してフォーマットを保持するのは適切ですか、それとも別の順序で行う必要がありますか?
セキュリティの習慣を改善するためのヒントは大歓迎です!