mysqli_real_escape_string 文字のみをエスケープします。それは消毒しません。
値が投稿されたら、サニタイズを行います。
私は整数値を使用することを好みます。ユーザー名として電子メール アドレスの代わりに、電話番号を要求します。次に、正規表現を使用して数値以外をすべて削除します。
$number = preg_replace('/[^\d]/','',$_POST['number']);
スペース、コンマ、ダッシュのない整数を探している場合は、次を使用します。
$number = intval($_POST['number']);
クエリで使用される値を修飾する必要があります。
$sql = sprintf("SELECT * FROM `Client` WHERE `Number` = %d", $id);
また、提出されたものすべてに目を通します。SQL インジェクション攻撃で一般的に使用される記号や単語を探します。
$strike1 = 1 + preg_match_all('/\x3F/',$SAVE_ID,$matches, PREG_SET_ORDER); // )
$strike2 = preg_match_all('/[\x21-\x2F]|[\x3A-\x40]|[\x5B-\x60]|[\x7B-\x7F]/',$SAVE_ID,$matches, PREG_SET_ORDER);
$strike3 = preg_match_all('/\x28/',$SAVE_ID,$matches, PREG_SET_ORDER); // )
$strike4 = preg_match_all('/\x29/',$SAVE_ID,$matches, PREG_SET_ORDER); // (
$strike5 = preg_match_all('/COALESCE|0x|like|regex|mid|select|delete|drop|insert|do|call|replace|update|infile|lock|set|from|into|show|table|kill|reset/i',$SAVE_ID,$matches, PREG_SET_ORDER);
違反が多すぎる場合は、IP アドレスを禁止します。
@mysql_unbuffered_query("INSERT INTO `Banned` (`ip`, `TimeStamp`,`Strike3`, `Attributes`) VALUES ('$ip', CURRENT_TIMESTAMP, $alert);");
パスワードの失敗も監視します。短期間に失敗した試行が多すぎる場合、または試行間の時間が短すぎる (人間ではない) 場合は、IP を禁止します。