最初に
今回は初心者が見落としがちな脆弱性について書いてみようと思います。
対策等も書いてありますので、最後まで見ていただければ幸いです。
もし記事に誤字脱字等ありましたらコメント等で教えていただけると幸いです。
SQLインジェクションって?
簡単に言うと特殊な文字列を入れることによって情報を抜くことが出来るという事です。
えー!って思いますよね?詳しく仕組みを見ていきましょう!!
具体的にどういう脆弱性?
まず以下の文字列を見てみてください
" or "1"="1
何だよこれって思いますよね?
この文章こそ今回の脆弱性のカギなんです
SQLite3を使って特定の情報を引き出すときに以下のような文章を使いませんか?
SELECT * FROM account where password = "ここにプログラムなどから値を代入";
実際に自分もNode.jsでsqlite3ライブラリを使って上記のようなものを書いています。
では先ほどの文章を{ここにプログラムなどから値を代入}の部分に入れてみましょう
SELECT * FROM account where password = "" or "1"="1";
//代入した部分を分かりやすくするとこんな感じ (実際には[]はない)
SELECT * FROM account where password = " [" or "1"="1] ";
そうです!!先ほどの文章を入れたことによってpasswordが空白か1=1という式が成り立てば情報を出してくれる式に早変わりしました。
プログラミングをしている皆さんなら分かると思いますが1=1なんて絶対成り立ちますよね?
つまり要約するとすべてのデータを出してくれるという事です。
この脆弱性の危険性
まず第一にアカウントのメールアドレスやパスワードを保存してあるデータベースにSQLインジェクション(この記事で説明してる脆弱性)をかけられると、すべてのアカウントの情報が漏洩する可能性があります。
Webサイトを作っている人などは尚更気を付けなくてはいけません
なぜならこのようにデベロッパーツールを使う事でどのような通信をしているのか、たどられて、脆弱性を突かれる可能性が高いからです。
具体的な対策
次はどのような対策を取ればいいかを書いていこうと思います。
プレースホルダ
まず以下のNode.jsのコードをみてください
let id = '" or "1"="1"'
const db = new sqlite3.Database(":memory:")
db.all("select * from account where id = ?;",[id],(err,rows) => {
console.log(rows)
})
node.jsのsqlite3ライブラリにはプレースホルダというのがあるのでそれを活用します。
プレースホルダでは?の部分に値を代入します。
今回の場合は?の部分に変数idの値が代入されます。
代入されるだけだと意味がないですって?大丈夫です。
この場合はidのなかの値を文字列として代入してるんです
前のような場合だとダブルクォーテーションを特殊文字列として代入するのでエラーが出るのです。
実行してみるとわかると思います。
このようにダブルクォーテーションを文字列として代入できればSQLインジェクションを防ぐことができるんですね
ダブルクォーテーション = "
Node.js以外でも…
自分はNode.js出来ないよ!!って人でも大丈夫です!
自分が調べた限り著名な言語は調べればエスケープ処理のサンプルコードなどが出てくるので、是非調べてみてください
最後に
自分が紹介した対策やライブラリ以外にも方法やライブラリは沢山あるので是非調べてみてください
そしてもし友達がSQLインジェクション対策を忘れていたら教えてあげてください!!
自分は他にもNode.jsやTypeScirpt等に関する記事を複数あげているので見ていただければ幸いです。