カテゴリー: Development

  • 間違いだらけのHTTPセッション管理とその対策

    HTTPセッション管理はWebセキュリティの中核と言える機能です。Webセキュリティの中核であるHTTPセッション管理に設計上のバグがある事は少なくありません。今回のエントリはPHP Webアプリ開発者ではなく、主にWebフレームワーク側の開発者、つまりPHP本体の方に間違いがあるという話しです。Webアプリ開発者の回避策も紹介します。

    まずセキュリティの基本として「入力のバリデーションを行い、正当な入力のみを受け入れる」があります。しかし、PHPに限らず多くのセッション管理機構は当たり前の「入力のバリデーションを行い、正当な入力のみを受け入れる」を行っていません。セッションIDの再生成(リセット)も不完全な物が多いと思います。

    参考:

    (さらに…)

  • SSL暗号を無効化する仕組み – BREACH, CRIME, etc

    CRIMEBREACHといったSSL暗号を無効化する攻撃を知っている方は多いと思います。しかし、その仕組みや攻撃方法は広くは理解されていないようです。Webシステムに関わる方であれば、BREACH攻撃の原理と対策を理解しておいて損はありません。BREACHや類似の攻撃は全く難しくありません。直ぐに理解できると思います。原理は簡単です!
    (さらに…)

  • PHPのOpenSSL関数を利用して暗号化する例

    色々やることがあってブログを更新できていませんでした。久々のブログはPHPのOpenSSL関数を使ってAES-256-CBCを使って暗号化する例です。今時のハードウェアとソフトウェアならハードウェアAESが利用できるので普通はAES-256-CBCで構わないでしょう。

    (さらに…)
  • サニタイズは絶対的な悪か?

    いつも堅苦しく「こうするほうが良い」とばかり書いているので、たまには「あまり良くない」と言われているセキュリティ対策も、有用かつ必要である例を紹介します。サニタイズの話です。

    サニタイズ(Sanitize)とは消毒、汚れた物を綺麗にする事を意味します。汚れた物、つまり悪い物を除去・変換して綺麗にする処理がサニタイズ処理と言われています。悪い物を定義し排除する典型的なブラックリスト型の処理です。ブラックリスト型の処理を行うと「悪い物」の指定に「漏れ」が発生しやすく、間違いの元なのでセキュリティ処理では基本的に使わないことが推奨されています。

    「サニタイズはするな!」これはほとんどの状況でサニタイズしない方が安全になる可能性が高くなるので正しいと言えます。しかし、これは全ての状況で正しいでしょうか?

    (さらに…)

  • 開発者は必修、CWE/SANS TOP 25の怪物的なセキュリティ対策

    SANS TOP 25 の解説はもっと後で行うつもりでした。しかし、現在のアプリケーション開発者向け教育に対する疑念のエントリへの反響が大きいようなので書くことにしました。

    やるべきセキュリティ対策には優先順位があります。効果が大きい対策から行うべきです。セキュリティ対策は全体的に行うべきものですが、最も効果的な対策を除いて対策を行うようでは全体的な対策など行えません。
    (さらに…)

  • PHP文字列のエスケープ

    PHP文字列をテキストとして出力したい場合もあります。PHPの文字列型はバイナリセーフなのでどのようなデータでも保存可能ですが、プログラム中でPHP変数をPHPのテキスト(リテラル)として出力するにはaddslashes()によるエスケープ処理が必要です。

    【重要】エスケープ/API/バリデーション1は出力先に合った方法でないと意味がないです。一口にHTMLと言っても複数の”コンテクストがあります。

    • JavaScript(識別子、変数など)、CSS、タグ属性名、タグ属性値(URIコンテクストに特に注意。BASE64、JavaScriptを使う場合もある)

    があります。
    SQLクエリと言っても

    • 引数(更にLIKE、正規表現、JSON、XMLなどに別れる)、識別子、SQL語句

    などがあります。全てのテキストインターフェースにコンテクスト2があります。
    それぞれの”コンテクスト
    に適切なエスケープ/API/バリデーションを利用しなければ意味がありません

    (さらに…)
  • CasperJS/PhantomJSでシンタックスエラー行を取得する方法

    CasperJSやPhantomJSを使っていてシンタックスエラーがあると

    [yohgaki@localhost ]$ casperjs test.js
    SyntaxError: Parse error
    

    と表示するだけでエラー行を返してくれません。

    (さらに…)

  • Fedora19用のPhalconのRPM/SRPMパッケージ

    PHP最速フレームワークPhalcon 1.2.4のRPM/SRPMパッケージを作りました。バイナリRPMはFedora19 x86_64用のみ作りました。

    (さらに…)

  • Linux上のCasperJS/PhantomJS/SlimerJSでShift JIS/EUCを取り扱う方法

    Linux上のCasperJS/PhantomJS/SlimerJSからShift_JIS/EUC-JPのページを取り扱う事が出来なくて困っていたのですが、解決策が分かりました。

    (さらに…)

  • PHPのJSONのエスケープ

    追記:最近のOWASPガイドの更新でJavaScript文字列はUnicodeエンコードで安全性を確保するよう変更されました。元々このブログでもUnicodeエスケープのまま利用するように書いています。他の言語のユーザーはUnicodeエスケープを利用しましょう。PHPもASCII領域の文字をUnicodeエスケープするようにした方が良いと思います。これは提案して実現するように努力します。

    JSONはJavaScriptのオブジェクトや配列を表現する方式でRFC 4627で定義されています。メディアタイプはapplication/json、ファイル拡張子はjsonと定義されています。

    PHPにJSON形式のデータに変換するjson_encode関数json_decode関数をサポートしています。

    JSON関数がサポートされている話は簡単!となれば良いのですが、 いろいろ考慮しなければならない事があります。

    TL;DR; PHPのjson_encode()を安全に利用する方法

    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文字データは”予めバリデーションしておく”必要があります

    (さらに…)
  • PHP最速フレームワークPhalconのインストール

    Phalconを初めて知ったのはもう忘れるくらい昔の話です。今でも活発に開発が行われており、かなり使えるフレームワークに仕上がっています。

    Phalconは他のどのPHPフレームワークと違う特徴があります。PhalconはPHPのフレームワークですが、PHPで書かれていません。C言語で書かれています。つまり、PHPのネイティブモジュールとして動作するPHPフレームワークです。

    (さらに…)

  • PhantomJSがURLをopenするとハングする原因

    PhantomJSはWebKitを利用したヘッドレスHTTPクライアントです。Webアプリのテストのみでなく、WebページをPDFや画像に変換する為に利用している方も多いと思います。手元のFedora19を載せているマシンでは動作せず、原因と思われる物も分ったのでエントリを作りました。
    (さらに…)

  • PHPのスクリプトを色々な環境で試すサービス

    PHPで開発したり、記事を執筆する時には色々な環境で試したい場合があります。自分の環境で試すのも良いですが、Webサイトにコピー&ペーストで試せると便利です。あまり知られていない(?)ようなので紹介します。

    (さらに…)

  • Webアプリの入力はバリデーションできない、という誤解

    Webアプリの入力はバリデーションできない、と誤解している方は少なく無いようです。システム開発に関わる人でなければ誤解していても構わないのですが、システム開発者が誤解していると安全なシステムを作ることは難しいでしょう。

    Webアプリの入力はバリデーションできない、と誤解している開発者にも理解できるよう噛み砕いて解説してみます。

    (さらに…)