いろいろ備忘録

雑記です。

N 実践HTTP 15~ 覚書

URL設計は基本的にモデルを基準にする。単独で操作するケースが少ないモデルは、そのモデルが従属するモデルのURLで行う。例を出すと、試験問題モデルは試験モデルのURLでよい。

 passport.serializeUser( (obj,done) => {} )でユーザオブジェクトをどのようにセッションに埋め込むかを規定できる。例えば省メモリ化するためにIDのみ埋め込むなど。

passport.initialize() middleware not in useとエラーが出た。メッセージそのまま、app.use(passsport.initialize())の前にpassport.authenticate()していたため。

Nodeでオブジェクトのプロパティを全てログ出力したいときは、util.inspect()を使う。引数はバージョンによって違うのでドキュメントを見る。

 npm package.jsonのscriptsのキーでコマンドを定義できる。npm startもそこで定義されている。

supertestによってExpressを起動することなく、routerオブジェクトをテストすることができる。

github-stubなど、OAuthのスタブのライブラリがある。

supertestではget()でGETリクエストして、expectでヘッダやbodyの内容をチェックできる。当然正規表現も使える。

 UUIDとは、全世界で(ほぼ)唯一の文字列。主キーが推測されてはいけないとき等に使える。Sequelizeではこのデータ型が用意されている。

複合主キーの順番は、インデックスによって結果を絞る順番と同じなので、慎重に設計する必要がある。

Sequelizeはsync()でCREATE TABLEする。つまり、外部キー制約に引っかからないために、A→Bという関係がある時はA.sync().then( () => { B.belongsTo(なんたら); B.sync()})のようにする必要がある。

npm start でsync()する場合、当然ターミナルは最後のSQLのログを吐いて、サーバとしての役割をするため終了しない。10分くらい待ってしまった。

UPSERTとは、レコードが存在しない場合はINSERT,存在する場合はUPDATEを行うこと。

router.get('/new', checker, (req, res, next) => {
 

このcheckerは別のrouter。checkerを通してから処理できるので、ログインが必要なページにルーティングするとき、このように記述してcheckerに認証処理等をさせる。checkerは委譲されたルーティングを元に戻さないとダメなので戻認証処理の後にnext()が必要。

slice(0, 255)によって255文字以下にする。

.map((b) => { return { a:b , c-key:1 }  })とすれば、DBで従属側に外部キーを一気につけられる。

 sequelizeは基本的にSQLインジェクションが不可能だが、where句で複雑なものが使いたい時に、条件を文字列で書くと可能になってしまう。そこはちゃんとエスケープかプレースホルダを使う。

レスポンスヘッダのX-Frame-Options:SAMEORIGINにより、外部サイトからアクセスできないようになる。

オープンリダイレクタ脆弱性とは、http://hoge.com/login?to=http://危険.xyzというリンクによってhttp://危険.xyzにリダイレクトするようなこと。
ログイン前にログインが必要なページに行く→ログインする→ログイン後にそこにリダイレクト のようなケースでは、ログインページでクエリを基にcookieにリダイレクト先を書いておき、ログイン後にそれを基にリダイレクトする。
そのときオープンリダイレクタ脆弱性をもつ可能性がある。対策はドメイン名より後のパスのみをクエリにし、かつcookieに書き込む前にスキーマが含まないことを確認すること。

<img src="URL"のURLは画像じゃなくても良い。画像が動的に生成されるページもあるので拡張子は考慮されないため。つまり勝手にGETできるということ。

CSRFとはjsで勝手にログインしているAmazonなどに向けてPOSTすること。トークンと呼ばれるセッションIDに紐付いた推測不可能な文字列(ハッシュで作れる)をhiddenで埋め込み、一緒にPOSTすることによって防ぐことができる。組み込みのモジュールを使っておけば問題ない。

Bootstrap Form おさらい - Qiita