正規表現

多くのプログラミング言語でも正規表現は実装されているが、実はかなり奥深い。そして、普通の人が聞いたら間違いなく「性器表現」と勘違いする不思議な言葉だ。現在、Oreillyから出版されている『詳細 正規表現 第2版』を読んでいて改めて正規表現について認識する必要があると考え、以下のとおりまとめてみた。これは今後順次改訂していく予定です。
正規表現の種類
正規表現にはPerlやPHP, Java, .NET, Python, Ruby, sedに実装されているNFAとawk, egrep, MySQLで実装されているDFAというものがある。NFAは従来からある正規表現であり、記述方法で動作速度が決まる。つまり、どれだけでも遅い正規表現を書くことが出来る(ひどい場合ではSegumentation Faultとなり、実行できない)と言うことになる。NFAで正規表現を記述するにはそれなりの知識と経験が必要になる。
一方で、DFAは最適化される正規表現であり、効率の悪い正規表現も実行動作前(コンパイル時)に最適化されて実行することになる。
文字クラス
リテラルをグループ化して、いずれか1つをあらわす。
[a-z] 小文字のアルファベットすべて
[^a-z] 小文字のアルファベット以外(「^」を最初におくと文字クラスが否定される)
[0-9] 数字すべて
[a-zA-Z] 大文字小文字を含むアルファベット
[a-zA-Z&[^mM]] 大文字小文字を含むアルファベット。但しMおよびmは除外される。
グループ
複数のパターンを表す。
(a|bc) aまたはbc
(?!a|bc) aでもbcでもない(否定形)
量子指定子
前に付くリテラルならびに文字クラス、グループを修飾する。
* 0文字以上
+ 1文字以上
? 0または1文字
{2,5} 2文字以上5文字以下
{,5} {0,5}の省略
{3,} 3文字以上
NFA拡張(Perl拡張)
NFA拡張にはキャプチャなし括弧(?: …)、先読み(?= …)、戻り読み(?<= …)がサポートされている。
(?:aaa|bbb) aaaまたはbbb。但し(aaa|bbb)と異なり、括弧の中は$1で取得できないようにする(つまりメモリを節約することができる)。
(?<=aaa)bbb 直前にaaaがくるbbbにマッチ(先読み)。
(?<!aaa)bbb 直前にaaaがこないbbbにマッチ(否定先読み)。
aaa(?=bbb) 直後にbbbがくるaaaにマッチ(戻り読み)。
aaa(?!bbb) 直後にbbbがこないaaaにマッチ(否定戻り読み)。
・モード修飾子
多くの言語の場合には、大文字小文字の区別なしや改行を無視するiやxのモードを言語側で用意している。たとえば、Perlでは
$a =~ /a-z/i; #大文字小文字のアルファベットにマッチ
$a =~ /abc
def/x; #abcdefにマッチ(正規表現内の改行とタブを無効化する)
だが、正規表現内でもこれが利用できる。
(?i:[a-z])、(?:x:abc
def)で代用できる。iモード修飾子の場合には、正規表現内で大文字小文字を区別しないケースとするケースを混在させられる便利な修飾子といえる。
・欲張り型と非欲張り型
NFAにはバックトラックと言う機構によってパターンマッチングを行っている。バックトラックを抑止する方法が欲張り型であり、後続のマッチ文字列に配慮することなくマッチングする。逆に量子指定子の働きを最大限抑制する方法が非欲張り型である。いずれもNFAでサポートされている。
.++または(?>.+) 任意の文字列を欲張り型でマッチ(この場合はほとんど全ての文字列にマッチすることになり、後続するマッチ文字列の指定があれば失敗することになる)
.+? 任意の文字列を非欲張り型でマッチ。.+?aは[^a]+と同義となる。また、.*?aは[^a]*と同義。バックトラックが起こらない分だけ、それぞれ同義のマッチ文字列の方が早い。

The Definitive Guide to Symfony (Definitive Guide)

Symfonyに関する解説本が出版される見込みです。まだ日本語版なんて遠い先ですが、Symfonyは少しずつ定着しつつあるフレームワークのひとつになりそうな予感があります。
今後のWebプログラミングにおいては、フレームワークに対する理解もまた重要なスキルのひとつになることは間違いなさそうです。(クライアントアプリケーションプログラミングにおいては、フレームワーク(ロジックとビューを分離して、コントローラーで制御する)はRADにおいて当たり前のように使われているわけで、ようやくWebプログラムもそれに追いついたのかもしれない)

プログラマ主役型プロジェクトのススメ ~ソフトウェア開発現場で本来の力を発揮するために~

プログラマ主役型プロジェクトのススメ ~ソフトウェア開発現場で本来の力を発揮するために~
職場の人から薦められて読んだ本。
端的に言えば、プログラマは取って代わることのできる工場労働者、プロジェクトマネージャーを筆頭に組織的な仕事をしているというのが一般的な考え方とされているが、この本では、納品物を製作するプログラマこそ不確定要素をどんどんつぶしてプロジェクトを成功させることができる唯一の職種であると説いている。
ソフトウエア開発は、製造業ではなく、サービス業とされる理由は、無形というあまりに納品物が不確定なのものをいかにしてエンドユーザーに満足してもらうかというところにあると思う。なぜ工場労働者であってはいけないか、そして明日からの仕事の仕方について考えさせられる一冊である。

成功への情熱―PASSION

成功への情熱―PASSION
京セラ会長の稲盛さんの著で、松下電器創業者の松下幸之助さんの影響を強く受けた本です。
なぜ会社は福利厚生や待遇を充実させるのか?
企業は最大利潤追求が目的でなければならないと考えていた僕は、この理由がよくわからなかったが、この本を読んでよくわかった。
経営者ならびに従業員は私利私欲のために仕事をしてはならないからだ。
私利私欲を持たないようにするには、現状に不満を持たないような心のゆとりが必要だ。心のゆとりを持つようにするためには、(他人を思いやれるような)人間らしく生きていくための最低限の待遇が必要だ。だから成熟した会社は従業員に多いくらいの福利厚生と待遇を与えているのだと。
仕事をするということはどういうことなのかを考えさせられる一冊です。

あの航空機事故はこうして起きた

あの航空機事故はこうして起きた
一見、ITとは関係のない本のようにも思えるが、技術ならびに運用面においては非常に参考になる一冊。
トラブルが発生した場合、多くの日本人はなぜトラブルが発生したのかではなく、誰がトラブルを起こしたのかということに注目する傾向がある。
人間は必ずエラーを起こすものであり、そのエラーが発生しないようにコンピューターシステムによってエラーを未然に防いだり、エラーが発生したとしても、安全な方向に制御するのが本来のシステム設計の考え方である。
しかしながらエラーが発生したときに犯人探しを行うようではそこに改善を行う余地がないことにこの本は警鐘を鳴らしている。

Webアプリケーションの脆弱性

Webアプリケーションには主に14の脆弱性が含まれるらしい。

・XSS(Cross Site Scripting)
不正なスクリプトを埋め込ませることでクッキー情報などを他サイトに送りつけ不正取得などを可能にする。
参考サイト:マルチバイトの落とし穴

・Script Insertion
リクエスト内容がそのまま表示されてしまう脆弱性を悪用し、Javascriptをはじめとするスクリプトを埋め込むことで掲示板などを訪れたユーザーのCookie情報を取得したり、フィッシングを仕掛けたりできる。

・SQL Injection
正規のSQLに不正なコードを埋め込むことで、異なる条件による問い合わせや、まったく予期されない問い合わせを可能にする攻撃手法。

・CSRF(Cross Site Request Forgeries)

・ヌルバイト攻撃
ヌルバイトは文字列の終了を示すC言語の仕様を悪用した攻撃手法。バイナリセーフでない場合には、ヌルバイト以降に不正なコードを仕込むことでコード内に含まれるチェック機構をバイパスできる。

・Directory Traversal
予期しないディレクトリへのアクセスを可能にする攻撃手法。チェックさえ正しくされていればこのようなことは起こらないが、上位ディレクトリへのアクセスを許してしまうことで、Webアプリケーション実行ユーザーが許可されているファイルを取得できてしまう。

・HTTPレスポンス分割攻撃

・インクルード攻撃
PHPが外部URIをインクルードできてしまうため、他サイトの悪意あるコードを実行できてしまう。includeファイルにユーザーが入力可能な文字列を含めてしまうということ自体がそもそも脆弱性である。

・eval利用攻撃

・外部コマンド実行攻撃

・ファイルアップロード攻撃

・セッションハイジャック
セッションキーを無理やり指定してプログラムを実行させ、実行してしまったユーザーのセッション情報を後ですべて取得する方法。

・スパムメール踏み台攻撃
メール送信フォームが任意のユーザーに送れる場合に利用可能な攻撃方法。メール送信フォーム自体がスパムメール送信装置となってしまう。

XSSとSQL Injectionはかなり有名だが、ほかにも多くの脆弱性が考えられるとは。
PHPサイバーテロの技法にはこれらがサンプルコードとともに掲載されているので非常に分かりやすい。

セキュリティウォリア―敵を知り己を知れば百戦危うからず

セキュリティウォリア―敵を知り己を知れば百戦危うからず
リバースエンジニアリングの手法を中心に前半は説明が続いており、興味のある人には詳しく説明されいて良いと思う。
自分がこの本を読んでよかった点は、当たり前が当たり前でないという別の認識ができたことだと思う。
たとえば、「ソフトウエアのライセンスキーを入力するような場面では、製造元は適当に入力しても正しいライセンスキーが入力されないようにロジック開発に苦心しているが、そもそもライセンスキーを比較するというロジックが無効にされてしまうようなことがあれば、まったくもってそれらは無意味であるということである」などです。
4,800円とかなり高価な書籍ではあるが、読んでも損はないと思います。