ホームページ >バックエンド開発 >PHPチュートリアル >Flex / PHP セキュリティの基本
http://active6.com/blog/flex/flex-php-security-basics-part-one/
私は何年も Flash / PHP Web サイトとアプリケーションを作成してきましたが、比較的初心者です。フレックス。今週初めに Flex 用の Adobe PHP サンプルを閲覧した後、このコードの一部が公開 Flex サイトで使用されると非常に危険である可能性があることに気付かずにはいられませんでした。これは批判ではありませんが、これらの例は PHP と Flex をタンデムで使用したい人ならほぼ誰でも読むことになるため、セキュリティの基本を復習するのはおそらく悪いことではありません。私はただ PHP が大好きです。これは、動的なサイトとアプリケーションのバックエンドを迅速に開発するのに最適な言語です。 Flex 2 の RIA パワーと組み合わせると、できることは無限に増えます。しかし、すべての Web プログラミング言語と同様、Flex や PHP を使用して最も単純な Web サイトを設計する場合でも、セキュリティに関する考慮事項は非常に重要ですが、見落とされがちです。この記事では、一見しただけでは偏執的な考えが残るかもしれないという前提をいくつか立てていますが、PHP / Flex アプリを開発するときは、次のことに常に留意する必要があります:
Flex または Flash ファイルを逆コンパイルするのは非常に簡単です。ファイル形式は公開されており、多くの逆コンパイラが存在します。 Flex アプリとサーバー間のリクエストと結果を監視することも同様に簡単です。これと上記により、PHP スクリプトの URI と予期されるパラメータを簡単に取得できるようになります。ほとんどの Flex/PHP タンデム アプリケーションは、クリーンでシンプルな XML データを期待して返します。このデータは簡単に解析して、セキュリティ ホールが悪用される可能性があるかどうかを確認できます。多くの PHP 機能はセキュリティ ホールにつながる可能性があります。 PHP.net サイトおよび独立したセキュリティ イニシアチブ (phpsec.org、PHP セキュリティ コンソーシアムなど) は、次々と発生する数十の「重大なセキュリティ上の間違い」を特定しました。この記事では、Flex の観点からこれらについて説明します。考えられるそれぞれの欠陥を理解することは、PHP アプリケーションで同じ間違いを犯さないようにするのに役立ちます。
未検証のユーザー入力これは偏執的に思えるかもしれませんが、Web 開発における最も重要な経験則の 1 つは、ユーザーが送信したデータはすべて考慮されるべきであるということです。潜在的に悪意があるものとして。これを無視すると、これからレビューするほとんどの悪用につながります。ログインパネルを構築したいとします。不要なレイアウト コードを削除しました:
[viewcode] src="flexsecurity/flexapp.xml" link="no" showsyntax="no" geshi="actionscript"[/viewcode]
ご覧のとおり、 Flex アプリは、ログイン検証のためにユーザー ID とパスワードを PHP スクリプトに送信します。どれもかなり標準的なものだと思いませんか?
SQL インジェクションSQL インジェクションは、本質的には検証されていないユーザー入力です。データベースクエリの悪用が可能になります。たとえば、受け取った Flex アプリのユーザー ID/パスワード セットをユーザー テーブルと照合します。 MySQL では、これは次のようになります:
SELECT * FROM users WHERE userid='$userid' AND password='$password';
悪意のあるユーザーは、ユーザー ID として「admin」を入力し、パスワードとして次の情報を入力する可能性があります:
' OR '1'='1
これにより、次のクエリが生成されます:
すごいです
これにより、パスワードの検証がバイパスされます。ユーザーは管理者としてのエントリを取得しました!
送信された値から悪意のあるエントリを無効化する必要があります。多くの PHP インストールでは、これは php.ini ファイルの magic_quotes_gpc 設定によってすでに処理されています。これは、phpinfo() 関数を使用して確認できます。マジック クオートがオフに設定されている場合は、PHP の addlashes() 関数を使用する必要があります:
SELECT * FROM users WHERE userid='admin' AND pass='' OR '1'='1';
ただし、この設定を有効にすると、残念な副作用が 1 つあります。PHP スクリプトに返されるすべての値は、スラッシュが追加されました。何が最適な設定であるかについてはここでは説明しません。それは実際に構築しているシステムに依存するからです。 (詳細については、PHP ドキュメントを確認してください)。
経験則として、magic_quotes_gpc のステータスを常に確認し、オンになっている場合は、すべての入力を PHP のtripslashes() 関数に渡します。次に、データベース クエリで使用する値に addslashes() を適用します。
$userid = addslashes($_REQUEST['userid']); $password = addslashes($_REQUEST['password']);
}
SQL インジェクションにより、悪意のあるユーザーがデータベース レコードにアクセスすることもできます。クエリで使用されるデータの文字 '",;() や、「FROM」、「LIKE」、「WHERE」などのキーワードを常にチェックしてください (大文字と小文字は区別されません)。
シェル コマンド インジェクション上記で説明したようにユーザー ログイン コードを保護したと仮定します。ユーザーがログインすると、Flex アプリは、たとえば、search という変数を通じてユーザーがアップロードしたファイルのリストを要求することができます。物事のフレックス面は上記の例と似ているので、繰り返しません。 PHP スニペットは次のようになります:
[viewcode] src="flexsecurity/phpdir.txt" link="no" showsyntax="no" geshi="php"[/viewcode]この PHP コードは安全ではありません。 $_REQUEST 変数は検証なしで割り当てられます。悪意のあるユーザーは、「;rm -rf *」のような内容を追加し、Web サイトのフォルダーを削除する可能性があります。ユーザー入力が有効であり、期待されたもの以外のものがないことを確認する必要があります。これには、Flex ベースの検証だけを使用しないでください。ハッカーが簡単に利用して、Flex ファイルの変更を許可する HTTP モニターや SWF デコンパイラーが多数存在します。ユーザーが提供する情報が有効であることを確認するには、次のように PHP コードを追加する必要があります:
[viewcode] src="flexsecurity/phpsecdir.txt" link="no" showsyntax="no" geshi="php"[ /viewcode]
escapeshellcmd() は、シェル コマンドを騙して任意のコマンドを実行させるために使用される可能性のある文字列内の文字をエスケープします。
OK、これでこの記事の最初の部分は終了です。パート 2 では、エラー報告やセーフ モードなど、その他の潜在的なセキュリティ ホールについて説明します。