安全なウェブアプリケーションの作成?運用?閲覧?

体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 脆弱性が生まれる原理と対策の実践』 という本を読みました。

私は(WEB上のマニュアルやドキュメントであればともかく)脆弱性を専門に扱った書籍に触れるのは初めて、フロントエンドも専門外なので、知らないことが幾つも掲載されていて勉強になりました。

脆弱性の実物に触れることを重視していると筆者が前文に書かれているように、主にWEBブラウザ操作に関連する脆弱性とそれに関連した攻撃手法が具体的に解説されており、配布されている実習環境を用いて脆弱性を体験できる構成になっています。

その内容もSQLインジェクション、OSコマンドインジェクション、スピアフィッシングと言ったよく知られたものから文字コードの取り扱いやファイルアップロードに関連する脆弱性まで詳しく説明されています。

本書のタイトルこそ『安全なWebアプリケーションの作り方』ですが、作る側よりもむしろ(ブログソフトウェアやアップローダを使用したサイトの管理者を含めた)使う側に向けたメッセージなのではないかと思わせる項目も少なからずあります。

少なくともクリックジャギング(詳しくは本書を読んでください)などの一部の項目に関しては、意図して実装するのは攻撃者だけなのではないかという感想を抱きます。これだけに関して言えば、脆弱性を把握していなければならないのは閲覧者です。

作成者と利用者(プログラムを利用したウェブサイト・サービスの管理者を含む)のどちらに向けて書かれた内容なのだろうという疑問は読中は常につきまといます。




セキュリティ意識の高くない私でも知っているようなことは多くの人がおそらく理解しています。

そんな私でも(過去に見たことがないから)きっと自分でも書かないようなコードが危険で非推奨となっている例などをみると、ウェブアプリケーションの利用者側に向けて書かれた内容なのだろうかという思いを改めて強くします。

もちろん作成者だけでなく、それを利用する管理者や閲覧者が脆弱性を把握して対策することが重要なのは言うまでもないことです。しかし、誰がどこまで把握しておくべきなのかを考えると線引きは簡単ではありません。

プログラミング言語を専門にしていないウェブデザイナが JavaScript ライブラリを多用したり、コンテンツ管理システムを使ってウェブサイトを自作したりすることは特に珍しいことではありません。

ところが最新の情報セキュリティを継続的に学び続けているのは、誠に失礼ながら専門家を除けば、知っておかなければならない立場にある一部の開発者や管理者に限られる印象を受けます。

本書の内容も、ウェブの利用者なら誰も知っていて損はないものですが、具体的な対策となるとソースコードを見た瞬間に、サーバやデータベースやウェブブラウザで何が起こるかを把握できないとどうしようもありません。

取り上げられている事例だけでも、呆れるほど多彩な手段で執拗にセッションやクッキーが狙われていることが分かったり、インジェクション攻撃でどれだけ簡単に情報を盗んだり、システムを破壊したりすることができるのかを実例を通して理解でき、実習環境上で簡単に再現できる(責任者の説得にも使える)という点では誰にとっても有益ですが、そこから更に進んで対策を行う段階ではウェブブラウザやOSだけでなくプログラミング言語や文字コード、さらには通信の仕組み等についても正確な理解が必要とされるのが難しいところです。

実習環境では主に PHP が用いられているものの、正規表現など基本的な知識を有していれば、PHP を知らなくても問題なく読めます。

自分で PHP を書くことはありませんし、PHP や Perl の CGI を扱うぐらいならば、よく使われている Java や Ruby で良いのに(個人的にはサーバサイド JavaScript/TypeScript 推し)ぐらいには思っていますが、そんな私でも言語の問題で躓くことはありませんでした。

ただし、HTMLメソッドやブラウザやサーバの機能についての理解は必要ですし、本書に詳しい説明はありませんので全く知識のない方は、先にウェブプログラミングを対象とした書籍を何冊か読まれたほうが良いかと思われます。対象の都合上、どうしてもソースコードやログを読み込んでいかないと本書の内容を完全には理解できません。

このように(解説は平易でわかりやすいのですが)敷居はそれなりに高いので誰にでも薦められるわけではないものの、アプリケーションを作る開発者だけでなく利用者にとっても有益な良書という感想を抱きました。

だからこそ、誰に向けて書かれたセキュリティの入門書なのだろうという疑問が生じるのかもしれません。

『Node.js 超入門』 一癖あるも良心的な入門書

Node.js に関する新しい書籍が出版されているのを書店で目にしたので購入して一読してみました。

本書の内容は書名どおり Node.js の導入とサンプル・アプリケーションの説明に重点が置かれており、スケーラブルなアプリケーションやデプロイメントについては触れられていません。

当然、Nginxとの連携やサーバ環境構築などについての言及もありません。

しかし、サンプル・アプリケーションではクッキーやセッションの使用、データベースとの連携など、アプリケーション作成において多くの人が知りたいと思う部分がきちんと記述されており、プログラムとして問題なく動作します。

Node.js に関する書籍の発行数が少ないこともあり、現行の環境でサンプル・アプリケーションが実際に動かして使える入門書の存在は貴重です。




本書では入門者を対象としていることから、Windows OS 上にてアプリケーションを実行する方法が書かれているのですが、他の OS でも全く問題なくアプリケーションを実行できます。

私の開発環境は下記の通り Ubuntu (開発環境として書籍では言及されていない OS) ですが、Visual Studio Code も含めて問題なく本書の開発環境を再現できました。

もっとも使い慣れたテキストエディタの方が作業効率が良いので VSC は、動作確認ぐらいしかしていないのですが。

しかし、せっかく VS Code を入れるのに ESLint でデバッグしないのでしょうか。これなら本当に Vim でいいじゃん。

DISTRIB_DESCRIPTION “Ubuntu 16.04.4 LTS”
js v8.11.1
node v8.11.1
npm 5.6.0
express 4.16.0
sqlite3 3.22.0
Visual Studio Code 1.22.2

なぜ SQLite3 がここに挙げられているのか? と思った方は、とても鋭い認識力をお持ちです。

本書のサンプルアプリケーションでは MongoDB や CouchDB といった JavaScript のデータベースではなく SQLite を用います。

入門者なら最初はSQL対応のDBを知るべきという著者の考え方が反映されている部分で、その主張自体はとても共感できるものですが、 Node.js を興味を持つ人で SQL に一切触れたことがない人はどれくらいいるのか判断が難しいところです。

個人的には NoSQL の独自クエリは大嫌いですし、サーバ接続の問題からアプリケーション起動に失敗する等の無用のトラブルを避けるという、入門書ならではの前提を考えると仕方がないかなと思えます。

またサンプルアプリケーションへのデータベースの導入時は、文字リテラルでクエリを手書きしていて閉口しますが、これも著者の考えあってのものであり、次章からは O/RM ツールが導入されますので安心してください (O/RMという用語自体は使われずにデータベース用のモジュールと記述されます)。

本書中では重要なポイントとされつつ、DBやSQLについては (Node.js という主題から外れるという事情もあって、詳しくは) 各自学習してみてくださいで終わってしまうので、本当に DB や SQL に触れたことがない人は他の書籍も参考にされた方が良いです。



SQL 第2版 ゼロからはじめるデータベース操作 (プログラミング学習シリーズ)


ここまで述べてきただけでも本書の役割や性格が見えてきたと思われるのですが、長所だけではなく短所ももちろんあります。

その中でも最も致命的なものは、サンプルアプリケーションのソースコードが目的のアプリケーションや章毎に整理されておらず、読み進めるごとに煩雑で読みづらくなっていくことです。

第2章で作成したアプリケーションを一部改編して第6章まで再利用していく構成になっており、進行時点においては既に使われていないモジュールがそのまま残されたり、必要以上にソースコードが複雑で読みづらくなります。

Node.js やフレームワークの初見での分かりづらさは、主にファイルや関数の数の多さと、(自分で設計したプログラムではないために) 「どの関数で何が行われているのか」を把握しづらい点にあります。

その点、本書では — 少なくとも初期の段階では — どこに何があり、どの関数が何が行われているのかという見通しがよく、それだけでも入門書として大きな価値があります。

それがソースコードの書き換えを行うごとに見通しが悪くなっていき、内容自体の複雑化と併せて終章に向かうに連れて苦痛になっていきます。

命名規則や開発効率の点からも良くありません。

私の場合はアプリケーションの目的が変わった時点で、プロジェクト (ディレクトリ/フォルダ) を新規に作成して対応しましたが、もし本書の中であらかじめサンプルアプリケーションやソースコードが整理されていて、個々のアプリケーションが単体でも実行可能であれば学習効率が大きく向上したことは間違いありません。

それでもアプリケーションとして、現行の環境できちんと動作するところは皮肉や嫌味ではなく特筆すべき点です。

例外処理を入れた方が良さそうと言った理由から個人的に書き換えたくなるところはありましたが、サンプルのソースコードをそのままアプリケーションとして実行してエラーとなったのは、一部の ejs ファイルの form method ただ1点だけです。

それも下記のようにパスを書き換えれば問題なく実行できます。

サンプルが正しく実行できるという安心感はとても重要で、だからこそソースコードを自身で改編して試行錯誤しながら上手くいく方法を模索できます。

本書から学べることは本書に書いてあることだけではない訳で、自分で console.log を付け加えて変数の中身を調べたり、関数を付け加えてサンプルとの出力の違いを確認したり、データベースを MongoDB に置き換えても構わないわけです。

上述のように一癖ある本書ですが、 Node.js の貴重な入門書であり、他の関連書籍と内容があまり重複しないという点でも一読してみて良かったなと思えました。

追記: node.js の開発をやるなら nodemon を入れておくと頻繁に再起動しなくて済むので楽です。



Node.js超入門


2冊目の参考書に『基本からしっかり身につく Android アプリ開発入門』を購入

『はじめてのAndroidプログラミング』の読了後に2冊目として『基本からしっかり身につくAndroidアプリ開発入門』 (以下、本書) を購入しました。

購入理由は Android 端末のストレージ操作とカメラ撮影を用いたアプリ開発について、短時間で効率的に学習したかったためです。

時間をいくらでも費やせるのであれば、自らソースコードを読み込んで学習しても良いのですが、時間を掛けずに体系的に知識を会得するには書籍を購入して自分で手を動かしながら検証した方が確実です。



基本からしっかり身につくAndroidアプリ開発入門 Android Studio 2.x対応 プロが本気で教えるアプリ作りの基本「技」 (ヤフー黒帯シリーズ)


本書はまさに2冊目に読む参考書として適当な内容で、ある程度のアプリ開発経験を持っていた方が内容が頭に入りやすいです。

というのも第1章でアプリ開発環境に触れた後は、アプリのコンポーネントとそのライフサイクル、リソースやパーミッションの話が始まります。

少しでもアプリ開発の経験があれば、なるほどと感心するところですが、前提知識を持たずに読むと何について解説しているのか具体的なイメージが思い浮かばずに混乱するかもしれません。

さらに付け加えると Java 言語の説明はありませんので、ソースコードを読み、何をしているのか理解できることが前提となります。

とりあえず動くアプリを開発したいという目的であれば、『はじめてのAndroidプログラミング 改訂版』を本書の先に読み、コンポーネントの名称や役割をアプリを動かしながら覚えた方が早いです。

前提知識があった方が望ましい反面、本書ではどの処理で何をすべきであり、何を避けるべきであるかが理由とともに述べられているところが本書の長所です。

具体的な開発経験からくる的確な助言が、処々に述べられており、この説明部分だけでも読むだけの価値があります。




短所はプログラムのソースコードが一部おかしかったり、( 紙面が足りなかったのか ) 本来は分けて説明すべき項目を一つの章にまとめているので、書籍やプログラムの構成が煩雑で分かりにくい部分が存在することです。

また出版時期の影響から現行の AndroidStudio Version 2.3 と ConstraintLayout に対応していません。

ソースコードがおかしい部分の一例としては、Chapter 3 の MainActivity.java クラス (pp.137) が挙げられます。

本書では以下のように View.OnClickListener をインプリメントしているのですが、これでは public void onTextChanged などの一部のメソッドをオーバーライドすることはできません。

仕方がないので、いつものごとくソースコードの内容を勝手に書き換えて対応します。

これが正解かどうかは分かりませんが、本書の説明どうりにアプリが起動するようになるのであれば、ソースコードを改変したところで大きな問題はないというのが私の方針です。

余談ですが、ソースコードの書き方には冗長に見える場面があったり (pp. 208)

と思いきや、その直後のページ (pp. 209) では余分な文字を省略したりという具合に書き方が安定しません。

もしかしたら、それぞれ別の人が書いたか、別の時期に書かれたソースコードなのではと思えてきます。

どうでも良い余談は置いておくとして、書籍やプログラムの構成が煩雑で分かりにくくなっていることが顕著なのは Chapter 4 です。

この章ではファイルの入出力とデータベースの利用とコンテントプロバイダの利用を行うクラスを実装しているのですが、どこまでが説明のための実装例で、どこまでがアプリを動かすための要素として必要なクラスなのかが分からずに混乱します。

見方を変えれば、具体的な実装例がいくつも提示されていてありがたいとも言えるのですが、改訂版では分かりやすく整理して頂けると私のような読者は助かります。

当然ながら本書一冊で Android 開発に求められる知識を網羅しているわけではありませんが、通読したことにより具体的な実装方法のみに留まらず、気を配るべき事項や実装中に注意すべき点などを学習することができたことは大きな収穫でした。

本書は Android アプリ開発の入門書を読み終えて、少しステップアップしたい私のような読者には役立つ書籍と言えそうです。

Contact Us