これまでのところ、すべての $_GET/$_POST 入力をサニタイズし、PHP_SELF とは対照的に、アクション リクエストで常に php ファイル名を呼び出す練習をしています。しかし、他にもあることは知っています。ウェブ全体に散らばっています。
PHP のセキュリティに関する基本的なヒントをいただければ幸いです。この質問が、インターネット アプリケーションの開発に必要な標準的なセキュリティ対策を探しているすべての人にとってワンストップの場として役立つことを願っています。
これまでのところ、すべての $_GET/$_POST 入力をサニタイズし、PHP_SELF とは対照的に、アクション リクエストで常に php ファイル名を呼び出す練習をしています。しかし、他にもあることは知っています。ウェブ全体に散らばっています。
PHP のセキュリティに関する基本的なヒントをいただければ幸いです。この質問が、インターネット アプリケーションの開発に必要な標準的なセキュリティ対策を探しているすべての人にとってワンストップの場として役立つことを願っています。
スクリプトがデータベースサーバーと対話している場合、 SQLインジェクションを回避するために、このサーバーに送信されるすべてのクエリをエスケープする必要があります。このセキュリティ対策を講じないと、多くの破壊が発生する可能性がありますが、幸いなことに、関数はphpにすでに存在するため、文字列をエスケープするのは非常に簡単です。MySQLデータベースの場合はmysql_real_escape_string(string $unescaped_string [, resource $link_identifier ])
仕組みの例を次に示します。
スクリプト:index.php?user = '; TRUNCATETABLEユーザー; SELECT * FROM users WHERE user = '
$user = mysql_real_escape_string($_GET['user']);
mysql_query("SELECT * FROM users WHERE user = '$user'"); //The table users won't be truncated
すべてのユーザー入力を mysql_real_escape_string でエスケープするよりも優れたアプローチは、準備済みステートメントを使用することです。
ここでそれについて読むことができます: http://php.net/manual/en/pdo.prepared-statements.php
準備済みステートメントを使用すると、高速かつ安全になります。一度準備され、何度も実行されるため、高速です。SQL インジェクション攻撃に対して非常に耐性があるため、安全です。
もう 1 つのタイプの攻撃は、クロスサイト リクエスト フォージェリ攻撃です。多くの PHP フレームワークは、この種の問題に対してすでに準備ができており、何らかの方法で解決しています。フレームワークを使用している場合は、csrf 防御が提供されているかどうかを確認する必要があります。フレームワークなしで作業している場合は、この種の攻撃について読み始める必要があります。
最後になりましたが、XSS タイプの攻撃 (クロスサイト スクリプティング) があります。これは、javasript でのユーザー入力の不適切なエスケープに関連しています。攻撃者は、ユーザーから重要なデータを盗む可能性があります。したがって、この種の攻撃からも保護する必要があります。ここを見てください: http://phpmaster.com/php-security-cross-site-scripting-attacks-xss/
これらは基本的な種類の攻撃です。それらを防ぐことができれば、Web の 80% をより安全に保つことができます。