2

現在、私はこの戦略を使用しています。

jQueryを使用して送信されたHTMLフォームまたはデータを送信した後、$.get()または$.post()私は何が来るのかを知り、それに基づいてロジックを適用する必要があります。

と、私が持っていると$_POST['username'], $_POST['password']しましょう$_POST['login_submit_button']。私の処理スクリプトファイルでは、次のようにしています。

if(isset($_POST['login_submit_button']) && isset($_POST['username']) && $_POST['username'] != "" && isset($_POST['password']) && $_POST['password'] != "") {
  // calling a common function safe_vars() which does
  // mysql_real_escape_string(stripslashes(trim($any_variable_need_to_become_safe)))
  // and now using the above variables for different purposes like
  // calculation, insertion/updating old values in database etc.
}

私はこのロジックがすべて間違っているか深刻な問題を抱えていることを知っているので、これの代わりに非常に安全で完璧なソリューションが必要です。私の戦略の脆弱性と深刻なセキュリティブリーチを見つけることを歓迎します。この質問は他の人にも役立ちます。答えがより説明的なものになった場合、これは有益なコミュニティwikiになる可能性があります。

4

2 に答える 2

3

一般的なスーパー「物事を安全にする」機能を作成する方法はありません。

mysql_real_escape_string

これは絶対に使用しないでください。これは古い mysql API を使用し、手動で文字列を結合して SQL を作成することを前提としています。そうしないでください。PDO または mysqli と、準備されたクエリとバインドされた引数を処理する関数を使用します。

stripslashes

これは魔法の引用に対する解毒剤です。マジック クォートがオンになっていない場合、データが破壊されます。使用しないでください。代わりに魔法の引用符をオフにします。

trim

これにより、データが破壊されます。文字列の先頭と末尾の空白を本当に削除したい場合を除き、使用しないでください。


ターゲット言語にデータを挿入する直前に、ターゲット言語のデータをエスケープします。

SQL の場合、バインドされた引数と準備されたクエリを使用します

HTML の場合htmlspecialcharsは、エスケープを行うテンプレート言語 (mustache など) を使用します。

または、(HTML を許可する場合) 解析し、DOM を生成し、ホワイトリストを使用してフィルター処理し、シリアライズして HTML に戻します。

JSON の場合は、encode_json

于 2012-05-22T12:25:14.507 に答える
1
  • magic_quotes が有効になっている場合にのみスラッシュを削除する必要があります (チェックするにはget_magic_quotes_gpcを使用します)
  • filter_varまたはctype_*またはpreg_matchを使用して、POST 変数をホワイト リスト フィルター処理する必要があります(長さや存在などの境界条件をチェックするだけでなく) 。
  • クエリに準備済みステートメント/ PDOを使用して、適切なエスケープを確保します
  • htmlentitiesを使用して HTML 出力をエスケープする

絶対的な証拠はありませんが、上記は SQL インジェクション / XSS を回避するための優れた方法です。

于 2012-05-22T12:24:43.683 に答える