[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.049 送られてきたパラメータをそのまま使う怖さについて

送られてきたパラメータをそのまま使う怖さについて


本文(発行内容)


<送られてきたパラメータをそのまま使う怖さについて>

こんにちは、三流プログラマーの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関数などのチェックは必要です。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

フィードバック

ASP系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.049を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

三流君の主なリンク先

[アクセスランキング] [サイトマップ] [リンク先・相互リンク先など]
ASPで遊ぶ、失敗する 掲示板 バックナンバー 登録と解除
三流プログラマー 業務の愚痴 掲示板 バックナンバー 登録と解除
VBAで楽しくプログラミング 掲示板 バックナンバー 登録と解除
コンビニのオモテとウラ話 掲示板 バックナンバー 登録と解除
www.ken3.org(サイト内)から Google を利用して、

Ken3の日記(weblog) -- [広告・副収入系] [プログラマー業務の愚痴] [VBA系の話題] [ASP系の話題] [コンビニ系ネタ] [その他]

その他 宣伝広告