Strings of Life

PHP/Phalcon/MySQL/JavaScript/RegExp/Ruby/Perl/ActionScript

2013年02月

☆脆弱性の発生箇所
・アプリケーションには、入力-処理-出力 という流れがある。
・脆弱性は処理に起因するものと出力に起因するものとがある。
・(Webアプリに関しては)入力に起因する脆弱性はない。

☆脆弱性の種類(出力に起因)
ブラウザ:クロスサイト・スクリプティング、HTTPヘッダ・インジェクション
・RDB:SQLインジェクション
・シェル:OSコマンド・インジェクション
・メール:メールヘッダ・インジェクション

☆脆弱性の種類(処理に起因)
・ファイル:ディレクトリ・トラバーサル
・その他:クロスサイト・リクエストフォージェリ、セッションフィクセーション、認証不備、認可不備

PHPでの整数値か否かの判別、is_int()でいいじゃんと思ってたらダメだった。

PHPマニュアルのis_int()の解説より抜粋↓
変数が数値もしくは数値形式の文字列の場合 (フォームからの入力の場合は 常に文字列となります) 、 is_numeric() を使用する必要があります。
整数か判別したい場合というのはフォームからの入力値の場合が多いだけど、is_int()では、フォームからの入力値の全てにfalseを返してしまう。

では、is_numeric()ならいいのかというと、整数の判別の場合には問題がある。is_numeric()は、小数や負の数、16進表記(0xFF等)にもtrueを返してしまう。整数だけ判別したい。それも、できるだけ楽して。どうするか?

ctype_digit(strval($input))
というのが、現在の私の答え。ctype_digit()は、与えられた文字列のすべての文字が数字であるかどうかを調べる。
ctype_digit('1') // true
ctype_digit(1) // false
ctype_digit('-1') // false
ctype_digit('1.1') // false
ctype_digit('0xff') // false
引数が文字列でない場合はfalseが返るので、strval()で文字列に変換している。



13/2/25追記

手軽といえば、正規表現を使うのが一番手軽かも。preg_match('/[^0-9]/', $input) でも、ctype_digit(strval($input)) と同じ判定をできる。ただし、ctype_digit(strval($input)) とpreg_match('/[^0-9]/', $input) を比較すると、ctype_digitの方が67%ほど速い。

☆関数からのアクセス定義

プログラム内での関数の配置によって、プログラム中で定義されているもの(クラス、変数、メソッド、名前空間、インターフェース、他の関数)へアクセスできるかどうかが決まる。

しかし、関数がどこで定義されていようと、関数クロージャーの中で、thisキーワードは常にグローバルオブジェクトを参照する。インスタンスメソッドの中でネストされた関数を用いて現在のオブジェクトにアクセスする際には、thisを変数に代入すればよい。

例:
public function m () {
    var currentObject = this;

    function f () {
        // ここでもcurrentObjectにはアクセスできる
        trace(currentObject);
    }
}

☆値としての関数

ActionScriptでは、全ての関数はFunctionクラスのインスタンスである。したがって、関数は、その他の値と同様、変数へ代入したり、関数の戻り値にしたりできる。

例:
function a () {
}
var b = a;
// var b = a(); ではない
ここでは、関数a()を定義した後で、a()を変数bに代入している。注意が必要なのは、括弧演算子が無いことである。もし括弧演算子が含まれていれば、bにa()を代入するのではなく、a()の戻り値を代入することになる。

関数を変数に代入した後は、括弧演算子を使って関数を呼び出すことができる。

例:
b(); // a()と同じ結果が返る

今日の進捗:206→207/1644

☆能動的攻撃と受動的攻撃
・能動的攻撃(active attack):Webサーバーに対して直接攻撃
・受動的攻撃(passive attack):Webサイトの利用者に罠を仕掛けることにより、罠を閲覧したユーザを通してアプリケーションを攻撃

☆受動的攻撃の種類
(1) 単純な受動的攻撃:罠サイトを閲覧させる
(2) 正規サイトを悪用する受動的攻撃:正規サイトに罠を仕掛ける
(3) サイトをまたがった受動的攻撃:罠サイトを閲覧したユーザに正規サイトへの攻撃リクエストを送信させる

☆受動的攻撃に対するブラウザ側の対策:JavaScriptによるサイトをまたがったアクセスを禁止(同一生成元ポリシー same origin policy)

☆同一生成元である条件
・URLのホスト(FQDN:Fully Qualified Domain Name)が一致している
・スキーム(プロトコル)が一致している
・ポート番号が一致している

関数定義がソースファイルの最上位で行われていて、package本文の外側にある場合、そのソースファイルに限って利用可能な関数が作成される。

例:

A.as
package {
  class A {
    public function A () {
    }
  }
}

function f () { }
関数f()は、上記のコードのどこからでも呼び出せる。注意が必要なのは、ソースファイルレベルの関数定義には、アクセスコントロール修飾子を含めてはならない、ということである。

ソースファイルレベル関数は単独のクラスを補助するために用いられることがある。しかし、privateな静的メソッドもクラスを補助する働きをするため、ソースファイルレベルの関数は実際のActionScriptプログラムではめったに見かけない。


今日の進捗:204→205/1644

このページのトップヘ