最良のアプローチは、提案したようにすべての入力データをグローバルにフィルタリングするだけでなく、各入力のデータ型を定義することです。例: 次のフィールドを検討してください: 名前: 電子メール: 年齢: 国: 住所: 電話番号: プレーン テキスト (テキストエリア): ファイル (ファイルのアップロード):
これらのフィールドを保護したい場合は、それぞれを個別に処理する必要があります。1- 名前: 最大文字長とデータ型 (形式) を定義します。通常、名前は (Az とスペース) のみで構成され、1 つのクォータ (') か、誰かが Eng のようなタイトルを入力した場合はドット (.) が含まれます。 . Mr.さあ、その欄を確認して考えてみましょう
<?php
$name = $_POST['name'];
$name_max_length = 30;
$name_min_length = 5;
$name_pattern = "/[a-zA-Z'\.\ ]{$name_min_length, $name_max_length}/";
if(!preg_match($name_pattern, $name)){
$error[] = "Please enter valid character for name field";
}else{
//lets now filter it for safe input
//above check not passes any kind of XSS, but it passes SQL injection
//we need to clear it from SQL injection
$name = htmlentities($name, ENT_QUOTES);
//ENT_QUOTES: Will convert both double and single quotes.
}
?>
2- 年齢: 整数である必要があります。組み込みの PHP 関数で簡単に確認できます。
<?php
$age = $_POST['age'];
if(!is_int($age)){
$error[] = "Please enter valid number in Age field";
}
?>
3- プレーン テキスト: ここでも、htmlentities($name, ENT_QUOTES) を使用します。 4- ファイルのアップロード: - ファイル拡張子を確認します。ホワイト拡張子のリストを作成し、アップロードされたファイル拡張子をホワイト リストと比較する必要があります。例:
<?php
$extensions = array('png', 'jpeg', 'gif');
if(!in_array($current_file_ext, $extensions)){
$error[] = "Please select valid file type! (".implode(", ", $extensions);
}
?>
最後に、これらのデータを入力する前に、そのようなエラーが発生した場合に配列である $error を確認してください
<?php
if(count($error) > 0){
//means $error contains errors
//print error values
}else{
//start inserting your data into database
}
?>