[解決済み] PHPでユーザー入力をサニタイズするにはどうすればよいですか?
質問
SQLインジェクションやXSS攻撃のためにユーザー入力をサニタイズしつつ、特定のタイプのHTMLタグを許可するためにうまく機能するキャッチオール機能はどこかにありますか?
どのように解決するのですか?
ユーザーの入力にフィルターをかけることができるというのは、よくある誤解です。PHPには、(現在では非推奨の)"機能"と呼ばれるものがあります。 マジッククオート この考えに基づいています。ナンセンスです。フィルタリング(またはクリーニング、あるいは人々が何と呼ぼうとも)のことは忘れてください。
あるデータをあるコードに埋め込むときは、そのコードの書式規則に従って処理しなければならないのです。しかし、そのようなルールはあまりにも複雑で、手作業ですべて守ろうとすると大変なことになることを理解しておかなければなりません。例えば、SQLでは、文字列、数値、識別子のルールはすべて異なっています。便利なように、ほとんどの場合、そのような埋め込みを行うための専用のツールがあります。例えば、SQLクエリでPHP変数を使用する必要がある場合、プリペアドステートメントを使用する必要があり、それはすべての適切なフォーマットと処理の世話をします。
もう一つの例は、HTMLです。HTMLのマークアップに文字列を埋め込む場合、それをエスケープするには
htmlspecialchars
. これは、すべての
echo
または
print
ステートメントを使用する必要があります。
htmlspecialchars
.
3つ目の例として、シェルコマンドを挙げることができる。もし、外部コマンドに文字列(引数など)を埋め込み、それを
exec
を使用する必要があります。
escapeshellcmd
と
escapeshellarg
.
また、非常に説得力のある例として、JSONがあります。ルールは非常に多く複雑で、手作業ですべてをフォローするのは不可能でしょう。そのため、JSONの文字列は決して手動で作成せず、必ず専用の関数を使用する必要があります。
json_encode()
は、すべてのデータを正しくフォーマットしてくれます。
などなど・・・。
その のみ データを積極的にフィルタリングする必要があるのは、あらかじめフォーマットされた入力を受け入れる場合です。例えば、サイトに表示する予定のHTMLマークアップをユーザーに投稿させる場合です。しかし、これは絶対に避けるべきです。なぜなら、どんなにうまくフィルタリングしても、常に潜在的なセキュリティ・ホールとなるからです。
関連
-
[解決済み] PHPでSQLインジェクションを防ぐにはどうしたらいいですか?
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] PHPのエラーを表示させるにはどうしたらいいですか?
-
[解決済み] 後で平文を取り出すためのユーザーパスワードの保管について、倫理的にどのように取り組むべきでしょうか?
-
[解決済み] mysql_real_escape_string() を回避する SQL インジェクション
-
[解決済み] bcryptはどうして塩を内蔵しているのですか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み】プリペアドステートメントは、どのようにSQLインジェクション攻撃から保護することができますか?
-
[解決済み] リファレンス - このシンボルはPHPで何を意味するのですか?
-
[解決済み] シングルクォートをエスケープし、ユーザー入力をシングルクォートで囲むことで、SQLインジェクションから保護することができますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Fatal error: 未定義の関数 sqlsrv_connect() を呼び出した。
-
[解決済み】move_uploaded_fileは、「failed to open stream: Permission denied" というエラーが出る
-
[解決済み】phpのob_start()の使い道は?
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】ディレクトリ内のファイル数を数える PHP
-
[解決済み] $wpdb->update または $wpdb->insert を実行すると、引用符の前にスラッシュが追加される
-
[解決済み] 入力ファイルが指定されていない
-
[解決済み】SSLピア証明書またはSSHリモートキーがOKでなかった
-
[解決済み】In_arrayが動作しない。
-
[解決済み】Wordpressの子テーマのstyle.cssが効かない。