【T2d】Npgsqlを用いたデータベースへのアクセス(5/6)
プロジェクトタイプ | C#コンソールアプリ※ |
---|---|
プロジェクト名 | T2d |
ソリューション名 | PIT2 |
ターゲットフレームワーク | .NET 8.0(長期的なサポート) |
最上位レベルのステートメントを使用しない | 使用する(チェックオフ) |
※ 「コンソールアプリ(.NET Framework)」ではないので注意せよ!
注意
- 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
- 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
- プロジェクトの作成作業についてはプロジェクトの作成とライブラリのインストールを参照せよ.
2d-5. 手動構築したSQL文の危険性
先ほどの例では,絞り込みなどを行わないSQL文を使用したがWHERE句を使って絞り込みを行うことももちろん可能である. 今回はキーボードから従業員番号を読み取って,それを絞り込みに使用することにしてみよう. Program.cs を_のように書き換える. あらかじめ言っておくと,この方法は期待どおり動作するが絶対にやってはいけない方法である. このやり方で覚えてはいけない.
|
|
書き換えたら実行してみよう.実行すると従業員番号の入力を求められるので適当な従業員番号(例えば100
)を入力して
Enterキーを押す.実行結果は_のようになる.
対象の従業員番号を入力: 100 jugyoin_no = 100, sei = 孫, mei = 正義
_は,指定した従業員番号の従業員の氏名が表示されている.にもかかわらずなぜ 絶対やってはいけない方法なのだろうか.ではもう一度実行して キーボードから従業員番号を入力する代わりに, _の文字列を入力してみよう(コピペ推奨) .
|
|
実行結果は_のようになる.
対象の従業員番号を入力: 100; DELETE FROM tbl_shokureki; DELETE FROM tbl_bumon; DELETE FROM tbl_jugyoin; SELECT * FROM tbl_jugyoin jugyoin_no = 100, sei = 孫, mei = 正義
一見何の問題もないように見えるはずであるが,これによって従業員データベースは破壊されてしまった.
ではpgAdminで確認してみよう.【★】のクエリツールは開いたままになっているはずだが,
誤って閉じている場合には同じ手順で開きなおし,リスト2d-4-1のSQL文を実行してみよう.
結果は_のようになるはずである.
また,同様にして職歴テーブルや(tbl_shokureki
)や部門テーブル(tbl_bumon
)の中身も同様に確認しておこう(_,_).
これらのテーブルの中身が空になってしまったことがわかるだろうか. なぜこうなったのかというと_のSQL文に,意図しない文字列が差し込まれたためである. 当該部分を_に再掲する.
|
|
これによって構築されるSQL文は_のようになるはずである.
SELECT jugyoin_no, sei, mei
FROM tbl_jugyoin
WHERE jugyoin_no = targetNo
ORDER BY jugyoin_no ASC
targetNo
の部分が,キーボードの入力値で置き換えられるわけであるが,今回は_の
ような入力値を使用した.したがって最終的に構築されるSQL文は_のようになってしまう.
SELECT jugyoin_no, sei, mei
FROM tbl_jugyoin
WHERE jugyoin_no = 100; DELETE FROM tbl_shokureki; DELETE FROM tbl_bumon; DELETE FROM tbl_jugyoin; SELECT * FROM tbl_jugyoin
ORDER BY jugyoin_no ASC
これに分かりやすいように改行を加えたものが_である.
|
|
1行のSELECT文のつもりが,その後ろに3つのDELETE文が差し込まれている.最後のSELECT文はORDER BY句が孤立しないように つじつまを合わせるためのものである.
このような攻撃手法をSQLインジェクションといい,実際にウェブアプリケーションでもユーザーからの入力を必要とする 場面で問題になることが多い.このため_のように実行するSQL文を手動で組み立てるような実装は決して書いてはいけない.
ここまで確認したら,先ほどの「Query Tool」で以下の復元用SQL文を実行し破壊されてしまったテーブルをもとの状態に戻しておこう.