couchDB(NoSQL)の脆弱性対策(インジェクション)について考えてみる

あまりDBに詳しいわけでもないので参考になるかは微妙
Node.js から couchDB を操作することを想定
多少couchDBの知識がある人を想定








よく見るSQLインジェクションの例



/* paramはid値 どこからか持ってくる */
sql = "Select * From User Where id =" + param
paramに値を元にユーザーを取得すると言ったSQL文
通常は一件のみだがparamに" ' ' OR 1 = 1 " と言った値が入ってくるとどうなるか
sql = "Select * From User Where id = ' ' OR 1 = 1"
となりユーザデータが全件取得されてしまうという脆弱性である。
基本的すぎるので通常はフレームワークなどで何らかの手段が用意してある。


ではドキュメント指向型のcouchDBの場合はどうか?


データ取得時の脆弱性


下記はユーザーのViewを作成してRest形式でユーザ:managerを取得した例
[couchURL]/user-view/_view/id?keys=%5B"manager"%5D
後ろの ?keys=%5B"manager"%5D が抽出条件になる。
この例だとクライアントからユーザIDのみを渡すような作りにしていた場合、不正にユーザ情報が読み取られるかもしれない。
サーバ側でパスワードのチェックなどが必要になる?
ただしユーザを全件取得するといったことは難しいように思える。



データ挿入時の脆弱性


その仕様上データ追加時に削除とか更新は起こり得ないが、不正なデータが注入されるということはあり得る。
例えば掲示板などでコメントを追加するケースなどクライアントから文字列のコメントをサーバへ送るような仕組みにしていた場合、コメントにjsonやその他データを埋め込まれるということは作りによってはあり得る。(だからどうしたと言われると微妙)
制御文字などは一応注意しておいたほうがいいか

コメントを入力して送信(couchDB データ例)
{
  _id: 1,
  comment: "掲示板のコメントとか?"
}

文字列ではなくjsonデータが送信された(couchDB データ例)
{
  _id: 1,
  comment: { huseina: "不正な", "data": "データ"}
}
サーバ側でチェック処理が必要になるが
あまり厳密すぎると「それRDBでよくね?」となりそうな気が


データ更新時の脆弱性


更新時にブラウザから直接_idを渡すようなのはまずいか。
コメントを編集して送信(_idとcommentを指定)
(couchDB データ例)
{
 _id: 1,
 comment: "コメントの変更?"
}

他者の_idを不正利用して送信
(couchDB データ例)
{
  _id::2,
  comment: "改ざんされたコメント"
}

_idに想定されるようなものを使用しない、複数回不正なリクエストが来たらしばらく遮断するといった仕組みが必要?
あとは例えば更新はログイン者に関連するデータのみに限るとか
認証済みだったらある程度許容してもいいような気がしなくもない


無論ブラウザから直接挿入・更新ができるような作りはNG
必ずサーバを介すること


今思いつくのはこのくらい

2017年7月3日月曜日