『体系的に学ぶ安全なWebアプリケーションの作り方』3章まとめ

あの徳丸本が第2版になったと聞いて、最近セキュリティのことも仕事でちょっと触っているのもあり早速買って読んでいます。

600ページ超の充実した内容です。今回読んだのは3章「Webセキュリティの基礎~HTTP、セッション管理、同一オリジンポリシー、CORS」です。基礎的なこともよくわかっていないこともあり、内容を自分なりにまとめようと思います。

3.1HTTPとセッション管理

  • リクエストメッセージとレスポンスメッセージがある
  • レスポンスメッセージの1行目であるステータスラインはたとえばHTTP/1.1 200 OK
  • レスポンスメッセージの2行目はヘッダで、Content-LengthやContent-typeが入っている
  • POSTメソッドによるリクエスト・メッセージにはボディという部分がある
  • GETメソッドは参照(リソースの取得)のみに用いる。副作用がないことが期待される。
    • GETで秘密情報を送信した場合、様々な漏洩のリスクがある
  • 秘密情報の送信にはPOSTメソッドを使う
  • hiddenパラメータは利用者自身で書き換えられる
  • サーバー側がアプリケーションの状態を覚えておくことをセッション管理とよぶ
  • クッキーは値の個数や文字列長で限界があり、クッキーの値を利用者本人に参照・変更できるので、秘密情報の格納には向かない
    • セッションIDだけを持たせるべき
  • セッションIDに求められる要件は以下の3点
    • 三者がセッションIDを推測できないこと
    • 三者からセッションIDを推測されないこと
    • 三者にセッションIDが漏洩しないこと
  • セッションIDは認証後に変更するべき

後ろの2項に比べると基本的な内容。とはいえ知らないことも結構あり、勉強になった。セッションIDのセキュリティ上の重要性が理解できた。対話にたとえた説明が非常にわかりやすい。

3.2 受動的攻撃と同一オリジンポリシー

  • 受動的攻撃:Webサイトの利用者に罠を仕掛け、罠を閲覧したユーザーを通じてアプリを攻撃する。パターンが3つ紹介されている
    • 罠サイト
    • 正規サイトに罠を仕込む
      • この手法はよく用いられている
      • 正規サイトに罠を仕込む方法は後の章で記載されている
    • サイトをまたがった受動的攻撃
  • 受動的攻撃にはブラウザが対策を講じている
  • サンドボックスとは、JavaScriptや、ActiveXなどができることを制限する
    • JavaScriptの場合は以下の通り
      • ローカルファイルへのアクセス禁止
      • プリンタなどの資源の利用禁止
      • ネットワークアクセスの制限=同一オリジンポリシー
  • 同一オリジンポリシーとは、サイトをまたがったアクセス(クロスドメインアクセス)を禁止すること
  • アプリケーションに脆弱性があった場合、同一オリジンポリシーの制約を受けていても攻撃をすることが可能
  • クロスドメインアクセスは全面的に禁止されているわけではない

受動的攻撃の3手法は、2つ目が頻度・流出する情報の二点から特に危険なものだと感じた。あと3つ目については仕組みがまだよくわかっていない。

JavaScriptがやりたい放題できると危険極まりないから、ブラウザで制約をかけているという認識を持った。

3.3 CORS(Cross Origin Resource Sharing)

サイトを超えてデータをやり取りできる仕様のこと。 たとえばXMLHttpRequest

  • Access-Control-Allow-Origin:クロスオリジンからの読み出しを許可するための仕掛け
  • シンプルなリクエストの場合、相手の許可無しでHttpリクエストを送れる
    • メソッド、リクエストヘッダ、Content-Typeに制約がある
  • 条件を満たさない場合は、プリフライトリクエストを送る必要がある

全般的にこの項はついていけなかった。

まとめ

基本といいつつ、僕にとっては知らないことがかなり多かったので勉強になった。4章も折を見て進めていきたい。その前に環境構築が先かもだが。

『退屈なことはPythonにやらせよう』流し読み

タイトルの通りです。1章だいたい2,3分で読んで何が書いてあるか確認したという状況です。

目次一覧

  • 第1章 Python入門
    • 整数、小数、print出力など
  • 第2章 フロー制御
    • if、for、while
  • 第3章 関数
    • スコープの話とか
  • 第4章 リスト
    • リスト、タプル
  • 第5章 辞書とデータ構造
  • 第6章 文字列操作
    • 取り出し、置換など
  • 第7章 正規表現によるパターンマッチング
  • 第8章 ファイルの読み書き
    • ファイルの作成
  • 第9章 ファイルの管理
    • ZIPファイルの取り扱い
  • 第10章 デバッグ
    • アサートやログ
  • 第11章 Webスクレイピング
  • 第12章 Excelシート
    • 読み書きとレイアウト
  • 第13章 PDFファイルとWord文書
    • 読み取りと作成、簡単な加工
  • 第14章 CSVファイルとJSONデータ
    • 読み取りとそこからの加工
  • 第15章 時間制御、自動実行、プログラム制御
    • timeモジュール、マルチスレッド
  • 第16章 電子メールやSMSの送信
    • 受信もある
  • 第17章 画像の操作
    • Pillow
  • 第18章 GUIオートメーションによるキーボードとマウスの制御
    • pyautoguiでマウスや画面を制御

所感

「ノンプログラマーにもできる」と謳っている通り、ノンプログラマーが頻繁に触っていそうなExcel、Word・PDFの章があります。ちなみに前回の記事で書いたツールは、この書籍のExcelの章をヒントにしています。

11章から18章で取り扱っているものを見て、自動化できそうな作業があれば、まずは読んでみるといいと思います。

Pythonで音ゲー(ボルテ)のツール作ってみた

タイトルを何にするか迷いましたが、一般的な感じにしました。

背景

僕はSOUND VOLTEX(以下ボルテ)というゲームが好きでよく遊んでいます。

このゲームはゲームセンターで遊べる音楽ゲーム音ゲー)です。音ゲーがどのようなものかは省略します。ボルテは以下のような特徴を持った音ゲーです。

  • レベルが20段階
    • 特に16~19あたりが多く遊ばれる
  • 譜面数が非常に多い
    • レベル16・17は300以上の譜面ある
  • スコアが1000万点満点
    • ほとんどの譜面は900万点以上獲得できる
  • 各譜面のハイスコアをCSVファイルで入手できる(→後述)

僕自身のボルテに対するスタンスはというと、

  • プレー歴5年以上
  • 5000クレは投入?
  • その割に上手くない
  • 成長が鈍い(伸びてないわけではない)
  • 現在はレベル15~20の譜面を遊んでいる

つまり、マンネリとなってモチベーションが低下してしまう可能性が常にあるというわけです。

また、ボルテには様々な非公式なツールが存在しています。

nearnoah.sakura.ne.jp

myamyasdvx.herokuapp.com

今は使えませんが昔はこのようなツールがありました。

SDVX IIIのスコアツール

スコアツールによって、何が可視化されてうれしいかというと、代表的なものに各レベルのスコア平均値があります。

f:id:alek3:20180616234341p:plain

これを見ながら、「レベル15の平均99いった!」とか「今月はレベル18の平均957目指そう~」とかそういう使い方をします。計測可能な目標を増やすというわけです。

現状のツールの不満点に、参照できるデータが最新のもののみであるという点があります。昔のツールは、過去のスコアや、ひとつ前の記録との差分を見ることができました。

以上の背景から、「各レベルのスコアの平均値の推移表を作成する」ツールを作成することにしました。

Input/Output

プログラムを作成する前に用意するもの、すなわちインプットは、ボルテのスコアが記録されたCSVファイルです。これは最新版がKONAMI提供のe-amusement gateから取得できます。

これを定期的に取得して保管しておきます。

f:id:alek3:20180617002456p:plain

ファイル名は自分でリネームしています。

プログラムは下記を参照してください。

github.com

scoresheetディレクトリにいくつかのCSVファイルを入れて、プログラムを実行すると、以下のようなxlsxファイルが得られます。これがアウトプットになります。

f:id:alek3:20180617002807p:plain

これによって僕は、「6月10日から13日までで、レベル18の平均スコアが2700点も伸びてる!!よっしゃ!!!!」という達成感を得ることができるようになりました。ボルテをやってない人にはさっぱりでしょうが、僕にとっては有用な代物です。*1

終わりに

エクセルファイルをアウトプットにしようと思ったのは最近読んだ以下の書籍の影響があります。今回Pythonで書いたのにも少し影響しています。

改善ポイントとしては、以下があるかなと思います。

  • コードが汚い
  • 平均スコアが上がったセルは、赤色とかで塗りつぶしがあるといいな
  • スコアのCSVを定期的に手動でダウンロードするのが面倒

アウトプットがExcelファイルというのは見やすくていいなと思いました。

*1:ちなみに、R3からR4にかけて平均値が16000も上がっています。これは一見すると異常なのですが、上昇の理由はΩ Dimensionでクラッシュしたまま放置していた曲があったためです。Ω Dimensionで解禁できない曲がある19は、平均値が大きく上下します。

レビュー『改訂新版 Swift実践入門』

こちらの書籍のレビューです。

対象読者

本書の「はじめに」にあるように

  • 他の言語の経験はあるがSwiftの経験はない方
  • Swiftの知識をより深めたい方

です。歯ごたえあると思います。実践入門は入門に非ず。

感想

また「はじめに」から引用ですが

どんな(what)言語仕様があり、それらをどのように(how)使うかに関しては豊富な情報源があります。それらがなぜ(why)存在し、いつ(when)使うべきかについてまとまった情報があるとは言えません。本書は、読者の皆さんの「なぜ」や「いつ」を解消することにも主眼をおいています。

とあるように、類似する機能の使い分けについて、いくつか書かれていました。例を挙げると以下の2つです。

  • クラスと構造体の使い分け
  • 継承とプロトコルの使い分け

特にクラスと構造体の違いは、この本に触れる前から気になっていたので勉強になりました。

ただ全般的に僕にとっては少し難しすぎたようです。特に11章あたりから……

14・15章はスキップしました。

現状は、完全に理解したいというよりも、なにか課題にぶつかったときにこの本の内容を参照できればよしというスタンスです。例えるなら「心のインデックス*1」ですね。

*1:僕発祥ではない。この概念を説明するの難しい

ネットで調べて出てきたSwiftコードを精読してみた

実装に困ったらstackoverflow先生に頼るのはよくあることですが、そのままコピペするのはいけません。「これってどうしてこういう実装になったの?」「stackoverflowからコピペしました!」だと怒られる気がします。*1そこで、今回は僕が参考にしたソースを精読して理解したいと思います。

想定されるレベル感はSwift書き始めたばかりくらいの人です。

今回の元ネタはこちらです。

ios - How do I resize the UIImage to reduce upload image size - Stack Overflow

画像をサイズ縮小するにはどうしたらいいか?という問いです。 最も+を得ている回答は以下のとおりです。

extension UIImage {
    func resized(withPercentage percentage: CGFloat) -> UIImage? {
        let canvasSize = CGSize(width: size.width * percentage, height: size.height * percentage)
        UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale)
        defer { UIGraphicsEndImageContext() }
        draw(in: CGRect(origin: .zero, size: canvasSize))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
    func resized(toWidth width: CGFloat) -> UIImage? {
        let canvasSize = CGSize(width: width, height: CGFloat(ceil(width/size.width * size.height)))
        UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale)
        defer { UIGraphicsEndImageContext() }
        draw(in: CGRect(origin: .zero, size: canvasSize))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

(Xcode 8.2.1 • Swift 3.0.2)

では書いていきます。

1行目

extensionは型を拡張するときに使います。これをするとUIImageのインスタンスimageがあったときに、 imgae.resized(withPersentage: 0.1) で使えるようになります。

2行目

withPercentageは外部引数、percentageは内部引数です。 CGFloat型とFloat型の違いはなんだろう?と思って調べたところ、以下の通りだそうです。

Float型とDouble型はCocoaでも用途によって明確に使い分けられています。たとえば、画面上の座標に使用されるCocoaのCGFloat型は、32ビットのプラットフォームではFloat型、64ビットのプラットフォーム型ではDouble型になります。

どうしてこのような使い分けになっているかはちょっと分かりませんでした。 処理自体は、引数で指定したpercentage分だけ、画像の大きさを小さくするというものです。辺の長さが半分なら0.5を指定します。

3行目

CGSizeは縦横のサイズを指定するクラス。関連したものにCGRect、CGPointがあります。

4行目

UIGraphicsBeginImageContextWithOptionsはbitmap-basedなImageをOptionつきで作成できるクラス。scaleをこのクラスでは定義していないけど何故か動いている。気になってdefinitionにさかのぼったが、どうやらUIImageのopen varらしい。

5行目

deferは遅延実行です。

リソースの解法など、そのあとの実行フローの内容にかかわらず、スコープの退出時に確実に実行されて欲しい処理の記述に利用します。

で、何が実行されているかと言うとUIGraphicsEndImageContext()ですが、要するにUIGraphicsBeginImageContextWithOptionsの対になるもので、画像の描画を終わらせるために活用するものだと思います。開始と終了がワンセットだから、この位置でdeferされているのでしょうか。*2

6行目

draw(in: CGRect)は、元々のUIImageを引数で指定した大きさに変換して再描画する処理です。CGRect()では、座標とサイズの設定が行われています。origin: .zeroの方は、座標を表しているから、元のところから動かさないの意味?

7行目

UIGraphicsGetImageFromCurrentImageContext()は、現在の"Context"にあるImageを取得するというものです。 つまり、4行目~7行目でUIGraphicsBeginImageContextWithOptions→UIGraphicsGetImageFromCurrentImageContext→UIGraphicsEndImageContextの流れが記述されているということになります。

8行目以降

大きさの設定方法以外全部同じなので省略

まとめ

振り返ってみるとそこまで難しい処理をやっているわけではなく、Contextの生成→Imageを作成→Contextの削除という流れがあるとわかりました。一つでもちゃんと読んで理解できると、他の類似のソースを見たときに何が違っているのか理解しやすくなりますね。

参考

石川・西山『改訂新版 Swift実践入門』

https://developer.apple.com/documentation/uikit/1623912-uigraphicsbeginimagecontextwitho?language=objc

https://developer.apple.com/documentation/uikit/1623933-uigraphicsendimagecontext

https://developer.apple.com/documentation/uikit/uiimage/1624092-draw

https://developer.apple.com/documentation/coregraphics/cgrect/1454856-init

*1:社畜ちゃん』の後輩ちゃんもどっかで怒られていました

*2:他の例を見ると、deferを使わずにreturnの直前に置いているのもあるので、活用は好みの問題なのかなとも思いました。

レビュー『独学プログラマー』

こちらの書籍のレビューです。

独学プログラマー Python言語の基本から仕事のやり方まで

独学プログラマー Python言語の基本から仕事のやり方まで

結構軽い書籍で、僕は秋葉原有隣堂併設のカフェで1時間くらいで一周しました。 その結果、これは手元に置いておきたいと思って購入しました。

対象となる読者層

本文中にははっきり書かれていなかったと思いますが、

  • プログラミングに興味がある人~始めて1~2年以内の人
    • 特に「興味があるけど何したらいいかわからない」人
  • 「独学」と聞いて心躍る人

がいいと思います。

内容

良いところ

「次何したらいいか」がわかる

プログラミングの入門本にありがちなのは、「文法は分かったけどこれで何をすればいいの?」となる場合があることです。 すでにプログラミング関連の職種についている人は別ですが、独学、すなわち自分の意思や興味から始めている人にとっては、次にやれることがたくさん示されているこの本は非常に役に立つと思います。

参考となる書籍やサイトがたくさん挙げられている

前に上げた良いところの続きです。 内容の項を見ると分かりますが、紹介されているトピックは幅広いですが、その分内容は簡単なものにとどまっています。 それの補完として、様々な参考書籍やサイトが数多く挙げられていて参考になります。

それだけでもすごいのですが、さらに良いのは日本語訳者が日本語のサイトや書籍を追加で紹介してくれていることです。 とてもたくさん紹介されているのでそこから選ぶのが悩ましい。

個人的感想

今の僕にとっては、どう学ぶかという方法論ももちろん大事ですが、そろそろ実際にモノを作ろうぜという段階だな~と思います。(今まで何も作ってなかったというわけではないです、たぶん)

レビュー #マンガでわかるDocker

お久しぶりです。アレクです。

『マンガでわかるDocker 』を電子書籍版で購入し、ひと通り試したのでレビューします。

 

良い点

ターゲット層が明確かつ、そのターゲットに見合ったレベル感

レベル感は購入ページに書いてありますが、「・Dockerを初めて使う方」「・かつ、コマンドラインをさわったことがある方」です。

そのような人が持ちやすい、「Dockerってよく聞くけどどんな機能を持っているの?」「使うとどんなメリットがあるの?」という疑問に簡潔に答えています。

イラストかわいい

Daemonちゃんかわいい。俺も悪魔だと思ってました。わかばちゃんの表情も豊かになったような気がするかわいい。

Dockerを動かせる

入門本らしく、本の内容に従って進めていくと、Dockerを動かすことができます。

改善点

コマンドをたたいても期待通りに動作しない

P21のコマンドを実行したところ、本文中と異なる結果となりました。 f:id:alek3:20180506133053p:plain

ちょっと残念…… ちなみに docker run --rm -it alpine すると起動します。

その他

  • ページ数分かんないなあと思って買ったけどもう一度見たら書いてあった。ポンコツ乙。
  • 28ページのマンガなので良くも悪くもすぐ読み終わる。
  • Docker動かないよーと泣きついたら@HKDnetさんが教えてくれました。ありがとう@HKDnet