いまさら聞けないWebアプリセキュリティの基本ルール
C言語の最も重要なセキュリティの基本ルールは「メモリをきっちり管理する」です。もちろん他にもプログラミングをする上で注意しなればならない事は山ほどありますが、C言語でプログラミングする上で最も基本的なセキュリティのルールは「正確なメモリ管理」です。
Webアプリを作る上でのセキュリティの基本ルールは何でしょうか?
今回はWebアプリセキュリティはもっとシンプルに考えよう!という話です。
C言語の最も重要なセキュリティの基本ルールは「メモリをきっちり管理する」です。もちろん他にもプログラミングをする上で注意しなればならない事は山ほどありますが、C言語でプログラミングする上で最も基本的なセキュリティのルールは「正確なメモリ管理」です。
Webアプリを作る上でのセキュリティの基本ルールは何でしょうか?
今回はWebアプリセキュリティはもっとシンプルに考えよう!という話です。
ブラックリスト型(サニタイズ型)のセキュリティ対策クイズ 解答編 ではバリデーション時の注意点をまとめに書きました。
ホワイトリスト型のバリデーションを行う場合でも以下の項目に注意しなければなりません。
ブラックリスト型(サニタイズ型)のセキュリティ対策クイズ 解答編 でパストラバーサルを禁止するようなフィルター処理(ブラックリスト型サニタイズ処理)は基本的には行うべきではありません。しかし、どうしてのフィルター/デコード処理が必要になる場合があります。
もっと読む
昨日のエントリのクイズです。今回はその解答です。もう一度問題を書いておきます。
ブラックリスト型のセキュリティ対策は、どうしても仕方がない限り使ってはなりません。以下のサニタイズコードは “../” 、”..” を無効な文字列として取り除きます。このサニタイズコードを回避しカレントディレクトリよりも上の階層からのパスへアクセスするパストラバーサルを行う文字列を考えてみて下さい。(/etc/passwdなどにアクセスできる文字列を考えて下さい)
レベル1
<?php if ($_GET['filename']{0} === '/') { // 絶対パスは無効 die('無効なファイル名が送信されました。'); } // トラバーサルに利用される"../", ".."を削除 // カレントディレクトリ以下のファイルだけ読み込む? $safe_path = str_replace(array('../', '..'), '', $_GET['filename']); readfile($safe_path);
簡単すぎた方はレベル2をどうぞ。以下のコードはブラックリスト型チェックでパストラバーサルに利用される “.” が1つしか無いことでセキュリティを維持しようとするコードです。
レベル2
<?php if ($_GET['filename']{0} === '/') { // 絶対パスは無効 die('無効なファイル名が送信されました。'); } if (strpos($_GET['filename'], '.') !== strrpos($_GET['filename'], '.')) { // トラバーサルに利用される"."は1つしか許さない die('無効なファイル名が送信されました。'); } // カレントディレクトリ以下のファイルだけ読み込む? readfile($_GET['filename']);
まだ解いていない方は少しだけ時間を使って考えてみて下さい。
今日はWordPressプラグインとWebサーバー設定の脆弱性を例にスクリプトアップロード対策を紹介します。
ファイルアップロードをサポートしているシステムの場合、PHPスクリプトとして実行されてしまう拡張子を持つファイルをアップロードされてしまうとサーバーを乗っ取られてしまいます。
参考リンク:
今回はセキュリティ対策におけるAPIとエスケープ/バリデーションをどう考えるかの話です。
Cプログラマになろうとしているプログラマにメモリ管理を教えないことは考えられません。メモリ管理を考えなくても文字列の処理をしたりするライブラリなどもありますが、メモリ管理をあまり考えなくても良いAPIさえ使っていればOK、メモリリークもValgrindでチェックしてレポートされなければOK、と考えているプログラマが作ったプログラムが安全である可能性は低いでしょう。
言語やプラットフォームの基本中の基本を避けて通っては安全なプログラムの構築が難しくなるだけです。
安全なプログラムを作るために「プログラマに何を教えるべきか?」が今日のテーマです。
昨日までブログアプリはb2evolutionでしたが、今日からWordpressに変わりました。
CasperJSやPhantomJSを使っていてシンタックスエラーがあると
[yohgaki@localhost ]$ casperjs test.js SyntaxError: Parse error
と表示するだけでエラー行を返してくれません。
Node.jsは速いと言われています。Node.jsのMVCフレームワークであるSailsとPHP最速フレームワークであるPhalconとの性能を比較しました。
PHP最速フレームワークPhalcon 1.2.4のRPM/SRPMパッケージを作りました。バイナリRPMはFedora19 x86_64用のみ作りました。
他人のブログのコメントに書いて、自分のブログに書かないのも良くないので一応ここにも書いておきます。
「SSLでの圧縮の利用は禁止した方が安全」です。
Linux上のCasperJS/PhantomJS/SlimerJSからShift_JIS/EUC-JPのページを取り扱う事が出来なくて困っていたのですが、解決策が分かりました。
SQLにエスケープなんて必要ないと考えている方も居るとは思いますが、現実にはエスケープを知っておくことは必須と言っても構わないと思います。
既にSQL識別子のエスケープについては書きましたが、今回はSQLエスケープというよりは安全にSQLデータベース利用する話です。先ずはエスケープの話を全て終わらせよう、と思っているのですがSQLエスケープのエントリが無いので作りました。私のブログを読んでいる方はエスケープ処理、プリペアードクエリの利用方法などはよくご存知だと思うのでここの部分は省略しています。
RFC 4696をもう一度読みなおしてみると/
もエスケープ可能文字に定義してありました。JavaScriptのエスケープシークエンスの処理の部分も間違っていたので全面的に書き直します。
追記:最近のOWASPガイドの更新でJavaScript文字列はUnicodeエンコードで安全性を確保するよう変更されました。元々このブログでもUnicodeエスケープのまま利用するように書いています。他の言語のユーザーはUnicodeエスケープを利用しましょう。PHPもASCII領域の文字をUnicodeエスケープするようにした方が良いと思います。これは提案して実現するように努力します。
JSONはJavaScriptのオブジェクトや配列を表現する方式でRFC 4627で定義されています。メディアタイプはapplication/json、ファイル拡張子はjsonと定義されています。
PHPにJSON形式のデータに変換するjson_encode関数とjson_decode関数をサポートしています。
JSON関数がサポートされている話は簡単!となれば良いのですが、 いろいろ考慮しなければならない事があります。
json_encode()を利用する場合
$json = json_encode($data, JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT);
と利用します。これでもまだ最適なエンコード方式とは言えませんが、デフォルトとして最低限必要なオプションが
JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT
です。
JSONデータの文字エンコーディングは基本UTF-8です。UTF-8文字データは”予めバリデーションしておく”必要があります。
もっと読むPhalconを初めて知ったのはもう忘れるくらい昔の話です。今でも活発に開発が行われており、かなり使えるフレームワークに仕上がっています。
Phalconは他のどのPHPフレームワークと違う特徴があります。PhalconはPHPのフレームワークですが、PHPで書かれていません。C言語で書かれています。つまり、PHPのネイティブモジュールとして動作するPHPフレームワークです。