-2

次のコードは、SQL と PHP を介してリモート データベースにデータを渡す際のサニテーション メソッドの提案です。

$name = strtr(mysqli_real_escape_string($connector_obj, $_POST['name']), '/\\', '   ');

私の質問は、MSQLI 演算子が入力をサニタイズしてから、strtr 演算子を追加してコードを安全にするのか、それともフィールドがまだ脆弱なのかということです。このサニテーションは最初のクエリの後に行われるため、他のオプションはサニタイズされたデータベースに値を渡し、事後に strtr 操作を実行して顧客向けページに情報を出力することです。

より高いレベルのビューでは、ユーザーは MSQLI エスケープ文字列のスラッシュにどの程度注意を払っていますか? 少し魅力に欠けるように見え、評判の悪い人にアプリケーションの構造への洞察を与えると思いますが、アイデアについての意見をいただければ幸いです.

4

1 に答える 1

0

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 を禁止します。

于 2015-01-22T07:21:39.763 に答える