永久仮称

ゲーム関係、本、映画などの日記、最近は新型コロナの記事記録

プログラミング作法読了

プログラミング作法

プログラミング作法

この手の技術本は辞書系を除き、章が進むにしたがってあまり役に立たない。この本も御多分に漏れず前半と付録以外は読み飛ばした。逆に言うと前半は重要だ。正規のプログラミング教育を受けた人間には復習になるのだろうが、仕事場はそんな人ばかりではない。コーディング規約の片隅にでも記述したい。付録「ルール集」の前半を引用しよう。行頭記号、太字、注記は私付記。

スタイル
  • グローバル*1にはわかりやすい名前を、ローカルには短い名前を統一しよう
  • 関数には能動的な名前を
  • 名前は的確に
  • 構造がわかるようにインデントしよう
  • 自然な形の式を使おう
  • 明快に書こう
  • 副作用に注意
  • インデントとブレースのスタイルを統一しよう*2
  • 慣用句によって一貫性を確保しよう
  • 多分岐の判定にはelse-ifを使おう*3
  • 関数マクロはなるべく使うな*4
  • マクロの本体と引数はかっこに入れよう
  • マジックナンバーには名前を付けよう
  • 数値はマクロではなく定数として定義しよう
  • 整数ではなく文字定数を使おう
  • オブジェクトサイズは言語に計算させよう
  • あたりまえの事はいちいち(コメントに)書くな
  • 関数とグローバルデータにコメントを
  • 悪いコードにコメントをつけるな、書き直せ
  • (コメントは)コードと矛盾させるな
  • あくまでも明快に、混乱を招くな
インターフェイス
  • 実装の詳細を隠蔽しよう
  • 直交性のある小さなプリミティブセットを選択しよう
  • ユーザーに内緒で何かをするな
  • 同じ事はどこでも同じように実行しよう
  • リソースの開放は割り当てと同じレイヤで
  • エラーの検出は低いレベルで、その処理は高いレベルで
  • 例外は例外的な状況にのみ使用しよう
デバッグ
  • おなじみのパターンを見つけよう
  • 最新の変更点は要チェック*5
  • 同じ間違いを繰り返すな
  • デバッグは今すぐに*6
  • スタックトレースを取得しよう
  • 打つ前に読め
  • 自分のコードを他人に説明してみよう
  • バグを再現できるようにしよう*7
  • 分割統治しよう
  • 誤動作を「数値占い」で検証しよう
  • 出力表示によってバグ探査範囲を狭めよう
  • 自己検証コードを記述しよう
  • ログファイルを出力しよう
  • 作図しよう*8
  • ツールを使おう
  • 記録を取ろう*9

作法とは直接関係無いが、コーディングの際にはセキュリティも気にしたい。IPA セキュア・プログラミング講座:IPA 独立行政法人 情報処理推進機構(http://www.ipa.go.jp/security/awareness/vendor/programming/)が言語別、環境別に基礎的な事項を紹介している。

webアプリケーションではサーバのファイルが丸見え?!:Webアプリケーションに潜むセキュリティホール(1) - @IT(http://www.atmarkit.co.jp/fsecurity/rensai/webhole01/webhole01.html)も気にしたい。

  • Buffer Overflow(バッファオーバーフロー
  • Cross Site Scripting(クロスサイトスクリプティング
  • Parameter Manipulation(パラメータ改ざん)
  • Backdoor & Debug Options(バックドアデバッグオプション)
  • Forceful Browsing(強制的ブラウズ)
  • Session Hijacking/Replay(セッション・ハイジャック/リプレイ)
  • Path Traversal(パスの乗り越え)
  • SQL Injection(SQLの挿入)
  • OS Command Injection(OSコマンドの挿入)
  • Client Side Comment(クライアント側コメント)
  • Error Codes(エラーコード)

このうちSQL Injectionがカカクコムで使われ、基本的なセキュリティ対策もされていなかったと呼ばれる所以だ。できれば(カカクメソッド|サイバーノーガード戦法)は使用したく無い。

凄くタイムリーに文書が翻訳されたのでこちらもリンクしておこう。
「Web Application Security Consortium:脅威の分類」(http://www.webappsec.org/projects/threat/)
目次の引用

おことわり 1
目標 1
ドキュメントの用途 1
目次 2
概論 4
背景 5
貢献していただいた方々 6
チェックリスト 7
攻撃の分類 10
1 認証 10
1.1 総当たり 10
1.2 不適切な認証 11
1.3 パスワード復元の検証が弱い 12
2 承認 14
2.1 証明書とセッションの推測 14
2.2 不適切な承認 16
2.3 不適切なセッションの期限 17
2.4 セッションの固定 18
3 クライアント側での攻撃 21
3.1 偽コンテンツ 21
3.2 クロスサイトスクリプティング 24
4 コマンドの実行 27
4.1 バッファオーバフロー 27
4.2 書式文字列攻撃 28
4.3 LDAP インジェクション 30
4.4 OS の命令 33
4.5 SQL インジェクション 35
4.6 SSI インジェクション 40
4.7 XPath インジェクション 41
5 情報公開 44
5.1 ディレクトリの索引化(Directory Indexing) 44
5.2 情報漏洩 47
5.3 パス乗り換え(Path Traversal) 50
5.4 リソースの位置を推測する 53
6 ロジックを狙った攻撃(Logical Attack) 54
6.1 機能の悪用 54
6.2 サービス拒否 57
6.3 自動化の停止が不適切 59
6.4 不適切なプロセスの検証 60
連絡先 62
付録 63
1.1 HTTP レスポンスの分割 63
1.2 Web サーバやアプリケーションの特定 69
ライセンス 85

*1:変数|関数

*2:インデントという言葉を知らないSEが居た時は参った。

*3:ifの入れ子は避けたほうがいいか

*4:C言語

*5:ソースコード管理ツールはすばらしい

*6:結構忘れがちです

*7:経験上、困ったバグほど再現できない

*8:オブジェクト構成やレイヤ構成は重要

*9:コード管理ツールは本当にすばらしい。でもWindows版でフリーで使いやすいの無いかなぁ