<送られてきたパラメータをそのまま使う怖さについて>
こんにちは、三流プログラマーのKen3です。 今回は、 パラメータをノーチェックでそのまま使う怖さについて 少し書きたいと思います。 拾い読みして、何かの参考となれば幸いです。/* * 1.自分にダメ出し、パラメータチェックの甘さ */
そろそろ、機能別にASPのサンプルをまとめないとなぁと思い、 過去のサンプルをチェックしてます。 下記、ASP系で発行したサンプルです。 削除のSQL文を発行するサンプルなのですが、 'IDを条件にSQL DELETE文を作る strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID") を注目してみて下さい。 <%@LANGUAGE=VBScript%> <html> <head> <title>削除のSQL文 DELETE文を発行する</title> </head> <body> <h2>削除のSQL文 DELETE文を発行する</h2> test032-2.asp<br> <hr> <% '関数をコールする Call TEST_DELETE_DATA() %> <HR> 終了です。<br> <A href="test032-1.asp">再度削除選択処理へ</a><br> <A href="test029-1.asp">データ確認と登録</a><br> </body> </html> <% '削除処理%> 読者さんの一言:キタナイなぁ(笑)なんてお思いだと思いますが、続けると、
Sub TEST_DELETE_DATA() 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") '.Provider?プロバイダー?通信会社?じゃなくって 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("db029.mdb") 'やっとデータベースを開ける db.open 'IDを条件にSQL DELETE文を作る strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID") 'オマケで画面にデータ表示 Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>" Response.Write strSQL & "</font></B><br>です<hr>" 'SQL文の発行 db.Execute(strSQL) 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing End Sub/* * 2.まずは、そのまま呼ぶとエラーが発生する 危険度小 */
'IDを条件にSQL DELETE文を作る strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID") と フォームからPOSTされたDELETE_IDを使用しているのですが、 パラメータなしで直接呼ばれると、エラーが発生します。 (通常はTest032-1.asp で削除データ選択、032-2で実行の作りになってます) http://www.ken3.org/cgi-bin/test/test032-2.asp を直接起動すると、 発行する(した)SQL文は DELETE From KANSOU Where ID= です Microsoft JET Database Engine エラー '80040e14' クエリ式 'ID=' の 構文エラー : 演算子がありません。 /cgi-bin/test/test032-2.asp, 行 47 と、SQL文の作成が、 strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID") なので、 IDの条件が渡っていないので、実行時エラーで止まります。 こんなエラー発生状態を防ぐためにも [No.48 IsXXXXの処理でいろいろと遊んでみた(笑)] http://www.ken3.org/backno/backno_asp10.html#48 の IsEmpty関数などのチェックは必要です。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~/* * 3.もっと怖いのが違うパラメータが送られて来た時 */
もっと怖いのが、違うパラメータが送られて来た時です。 想像し易いように、問題点は、 'IDを条件にSQL DELETE文を作る strSQL = "DELETE From KANSOU " '感想(KANSOU)テーブルを削除するので strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID") と SQL文を作成してます。 ID無しは、 If IsEmpty(Request.Form("DELETE_ID")) でチェックできるのですが、 IDしか来ないと思って作成している坊ちゃんプログラムに 簡単なHTMLを作成して "10 Or ID < 20"を渡してみます。 <HTML> <FORM ACTION="http://www.ken3.org/cgi-bin/test/test032-2.asp" METHOD="POST"> DELETE_ID <INPUT TYPE="text" SIZE="20" NAME="DELETE_ID" VALUE="10 Or ID < 20"><br> <INPUT TYPE="submit" VALUE="テスト実行"> </FORM> </HTML> http://www.ken3.org/cgi-bin/test/test049-1.html でテストできます(ローカルHDからでもできます) テストを実行すると、プログラムは下記のように正常終了 発行する(した)SQL文は DELETE From KANSOU Where ID=10 Or ID < 20 です と、SQL文を発行してくれました。/* * 4.対策など */
削除番号なので、 strSQL = strSQL & " Where ID=" & Request.Form("DELETE_ID") を strSQL = strSQL & " Where ID=" & CInt(Request.Form("DELETE_ID")) と数値に変換してしまう。 えっ、そんなことしても、適当に番号を送られてデータ消されちゃうよ。 DBのオートナンバー型だから、1から連番で消しに来たりしてね。 送信元にも細工をする必要がありそうですね。 test032-1の選択処理から送られてきたか? Sectionなどのサーバー変数に入れておくなど、 POST/GETでデータを送信する時は、かなりの注意が必要ですね。 調査してからまた追加で対策案を報告します。/* * 5.終わりの挨拶 </HTML> */
今回は、 送られてきたパラメータをそのまま使う怖さについて 書いてみました。 怖かった?常識なので怖くなかった?アナタの感じかたは? ポイントは、 ・データチェックが入っていないとマズイよ ・フォームからPOST/GETで送られてきた値は注意が必要 ぐらいかなぁ。 まぁ、社内システムはそんなに気にしないでも、なんとかなるかなぁ。 でも、不特定多数がアクセスするシステムではかなりの注意が必要だと思います。 *オイオイ、どっちなんだよ?ヤッパ発行回数稼ぎ?だったの(笑) 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.5 IsEmptyでデータチェック ] http://www.ken3.org/backno/backno_asp02.html#5 で、パラメータの受取りのチェック処理を軽く書いてます。 [No.48 IsXXXXの処理でいろいろと遊んでみた(笑)] http://www.ken3.org/backno/backno_asp10.html#48 の IsEmpty関数などのチェックは必要です。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。
次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません
広告:
DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く
VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]