読者です 読者をやめる 読者になる 読者になる

maitake219

とあるSEの徒然なるweblog

認証

アカウントロック

何度もログインに失敗した場合、対象のIDをアカウントロックし、一定時間ログインを拒否する。これにより、不正なログイン施行を抑制するとともに、パスワードリスト攻撃への耐性を上げることが出来る。ログイン失敗時に「パスワードが誤っています。」と親切にメッセージを表示したくなるが、攻撃者にIDが存在することを知らしめることになる。利用者のためにも、メッセージは「IDまたはパスワードが誤っています。」とした方が良い。

ブルートフォース攻撃

可能な組み合わせでログイン施行を繰り返す。基本的な対策は、同一IPアドレスから複数のIDへのログイン施行を検知した場合にそのIPアドレスからのログインを遮断することである。

パフォーマンスチューニング

下記に該当する場合は要修正。

  • コレクションの使い方が悪い
  • リニアサーチしている
  • 同じ処理を何回も行っている
  • 同じコレクションに対して何度もループ処理をしている
  • 何回も同じインスタンスを呼び出している
  • JITコンパイラが最適化出来ない
  • ログ出力が重い

読みやすいコード

そもそも、何をしているかを自分の言葉で説明出来ないコードを書いてはいけない。
説明出来るコードを書いたとして、その説明は他者がすぐ理解出来ただろうか。
理解するのに時間がかかってしまうなら、そのコードはまだ改善する余地がある。

コメント

  • コードから読んで分かることをわざわざ書かないこと
  • 名前のつけ方が悪いものをコメントするなら分かりやすい名前をつけてコメントが無い方がいい
  • コードに対する考え方や性能、欠陥についてコメントに残す
  • コードを読んですぐに仕様がわからないものはコメントを書く
  • 自分が分かっていても他人が見てわからないことはコメントにする
  • コメントに実例を載せる場合は簡潔に
  • 分かりづらい引数にはインラインコメントを

制御フロー

  • 三項演算子はそれを使って簡潔になるときだけ使う
  • if文は自然な順序で記述する
  • do-statementを避ける
  • 関数の出口を複数設けることは、関数の処理を早く打ち切ることが出来る利点である
  • goto-statementを使わない
  • ネストを浅くするためにcotinueが有効なこともある

コードを読みやすくする

  • 頭が良さそうなコードより行が増えても読みやすいコードを書く
  • 説明変数や要約変数を使うとコードの見通しが良くなることがある
  • 論理式が読みづらくなったらドモルガンの法則で読みやすくなることがある

変数の扱い

  • 一度しか使ってない一時変数を削除する
  • 中間結果を保持する変数を使わない処理体系に変える
  • 変数のスコープを縮める
  • JavaScriptではグローバルスコープに入ることを防ぐために変数を定義する時は常にvarを付ける
  • constやfinal修飾子で変数を書き換えられないようにすることで変数の追跡を容易にする

メソッドの抽出

  • そのコードが実現することに関係無い処理をしている箇所はメソッドに切り出すことが出来る
  • メソッドに切り出すことでコードの独立性が上がり、改善が楽になる
  • 1メソッド当たり1タスク

コードリファクタリング

  • コードを簡単な言葉で説明出来るようにするとコードはより自然になる

テスト

  • テストしやすいコードを書くことでコードはより自然になる
  • テストメソッド名は何をテストしているか分かりやすく付ける
  • 結果を確認するメソッドは様々なテストケースを実行するために再利用されることから別に切り出すといい
  • テストが失敗した場合、バグの原因を見つけやすいようにエラーメッセージを表示するといい

サーバ証明書

サーバにサーバ証明書を導入する。
クライアントがサーバ証明書を確認する。

  • 証明書が正しい認証局から発行されていること
    証明書発行局の電子署名を検証する
  • 通信しているサーバと証明書のサーバが一致していること
    証明書のコモンネームとアクセス先のホスト名が一致することを確認する

証明書を確認することでSSL通信を開始する。

Markdown記法のススメ

入社してから業務日誌をサクラエディタで書いてます。
txtなんで非常に軽くていいんですが、その軽さ故に味気ない
そこで注目したのがMarkdownです。

例えば#見出しが<h1>見出し</h1>に変換されて

見出し

になります。
要するにHTMLタグを簡単に書けるということです。
ハテブやqiitaでも採用されてます。

Markdownを使うと省エネでかつそれなりリッチなものが書けます。
Markdownエディタとしてオススメなのがatomです。
atomでは様々なプラグインがあり、Markdownで書いたファイルをpdfにすることも出来ちゃいます。

さらに、Markdownでスライドを作ることも可能です。 marp

セキュリティスペシャリスト

セキュリティスペシャリスト

自分の頭を整理するために書いてます。

セキュリティスペシャリスト

ログ

  • logoutを使うとログオフしたサーバのホスト名またはIPアドレスがログに含まれない要検証

改ざんへの対策

改ざんへの対策と言えば、改ざんの検知である。
検知するために、鍵付きハッシュ値を付加したり、ディジタル署名を付与する。

ルート証明書

プロキシへのアクセス

ブラウザがプロキシに最初に送信するHTTPリクエストは

CONNECT url:443 HTTP/1.1

である。

SQLインジェクション

ユーザの入力値をそのまま用いて動的にSQL文を組み立て、実行することで意図しない操作が行われる。
SQL文を組み立てる際はプレースホルダを用い、特殊記号をサニタイジングする。
JavaではprepareStatementを用いる。

メモリ管理

C++ではポインターでメモリに柔軟にアクセス出来る。
そのため、メモリ管理はプログラマの責任になる。

Javaではメモリ管理はJava VMが行う。
しかし、不要になったオブジェクトを破棄し、メモリ領域を解放するガーベジコレクションはCPUの負荷が高い。

メールの暗号化

  • 送信にはSMTP over SSL
  • 受信にはIMAP4 over SSL

アカウントロック

同一IDに対し、一定回数を超えるログインが試行された場合一定時間そのアカウントをロックする
これにより

プラグイン

pdfファイル等をブラウザで再生する場合、プラグインが用いられる。
不正な動作を引き起こすファイルをダウンロードさせ、それを処理する過程でプラグイン脆弱性を突くコードを実行することで、不正プログラムを実行させることが出来る。

Ajax

Referヘッダ

  • HTTPリクエストの任意の項目のため送信されない場合もある
    そのためReferヘッダを根拠に参照元を確認するような仕様は推奨されない

JSONP

抑止効果

  • 社内の内部不正を未然に防止するには 抑止効果 が重要
    • あえてセキュリティチェックしますとか
    • 送信メールはすべてチェックしていますとか

モニタリング

  • 情報にアクセスする権限をもった利用者による権限の濫用を防ぐコントロールとして有効
  • 条件設定が不適切であったり、システムの利用状況の変化に対応していなかったりする と形骸化してしまう

ネットワークモニタ

Webフィルタ

  • シグネチャで通信先が信用できるかを判断する
  • プロキシサーバに導入し、通信の出口対策を行う

HTTPS通信の監視

  • HTTPS通信では通信内容が暗号化されている
  • 最近ではIDSやWAFで秘密鍵を使ってHTTPS通信を監視出来るようになってきている

X-Forwarded-For

SSH

  • ポートフォワーディング により任意のポート間の通信を暗号化することが出来る

Cache-Control

  • HTTPヘッダ
  • no-storeを設定するとキャッシュにコンテンツが残留しない