2011年2月28日月曜日

AccessmdbのSQLインジェクション対策

1つ前の書き込み「VBScript IsNullとかIsEmptyとかIsNumericとか」で、
「実際にはポストされていないデータをRequestで取得してしまった場合、その値はEmptyとなる」
また、「IsNumeric(Empty)はTrueになる」ということを確認しました。

Access MDB では、数値型を「'(シングルクォート)」で囲むことができないため、
クエリに数値型のパラメータを埋めこまなくてはならない場合、埋め込む値が
数値型であるかどうかを厳密にチェックする必要があります。
VBScriptのIsNumericだけでは意図したチェックにならない可能性があるので、
注意しなくてはなりません。

Webのようなインジェクションの恐れがある環境で、
データベースにmdbを用いないのが本来だとは思うのですが・・・。

VBScript IsNullとかIsEmptyとかIsNumericとか

定義 構文 結果
num = "" Response.Write num
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) False
IsObject(num) False
(num=0) スクリプトエラー
(num="0") False
num = Empty Response.Write num
TypeName(num) Empty
IsNull(num) False
IsEmpty(num) True
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") False
num = null Response.Write num
TypeName(num) Null
IsNull(num) True
IsEmpty(num) False
IsNumeric(num) False
IsObject(num) False
IsNull(num=0) True
IsNull(num="0") True
num = 0 Response.Write num 0
TypeName(num) Integer
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") True
num = "0" Response.Write num 0
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") True
num = "0"(全角) Response.Write num
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=0) True
(num="0") False
num = "〇"(漢数字) Response.Write num
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) False
IsObject(num) False
(num=0) スクリプトエラー
(num="0") False
num = "3D2" Response.Write num 3D2
TypeName(num) String
IsNull(num) False
IsEmpty(num) False
IsNumeric(num) True
IsObject(num) False
(num=300) True
(num="300") False


上記は各データをチェックした一覧です。
想像していたのと、違う結果になっていないでしょうか。

特に↓のような時
Dim num
num = Request("numnum") '←実際はnumnumというnameのデータはポストされていない
numはEmptyとなるので、IsNumericで数値チェックをするとTrueとなってしまいます。

2011年2月21日月曜日

IETesterでタブを分割表示する

IETester
http://www.my-debugbar.com/wiki/IETester/HomePage

IETesterを用いるとIE5.5, IE6, IE7, IE8での表示・動作確認を行うことができます。


サンプル画面のようにタブで分割表示するには、


まず確認したいバージョンのIEでサイトを開きます。


どちらのタブでも良いので、タブをつまんでウィンドウ内にドラッグ&ドロップします。


タブの分割表示ができました。


※ちなみに、上の参考画像はこのサイトでキャプチャしただけなので、
別に私は「ポンパレ」の広告塔ではありません(汗)
最近このお姉さんめっちゃ見るなぁ

2011年2月15日火曜日

Eclipseで矩形選択

Alt + Shift + A
で矩形選択できます。
Alt + ドラッグ の方が便利で良いのですが・・・。

ちなみに矩形は「くけい」と読むそうです。
短形選択だと思ってました。

2011年2月9日水曜日

SQL Server から CSV データのエクスポート

ハマったのでメモ

単純にテーブルをそのままCSVにエクスポートなら、コマンドプロンプトなりbatファイルなりで
bcpコマンドを叩けば成功した。

参考
bcp ユーティリティ


引数つきのストアドプロシージャの実行結果をエクスポートしようとした時に上手くいかなかった。
また、引数も動的に決定したいのでbcpコマンド自体をストアドに入れてしまって
ジョブで定期実行するなどしたい。

まずはmaster.dbo.xp_cmdshell(master.sys.xp_cmdshell?)を有効にする必要があるので
以下を実行する。

-- To allow advanced options to be changed.
EXEC sp_configure 'show advanced options', 1
GO
-- To update the currently configured value for advanced options.
RECONFIGURE
GO
-- To enable the feature.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- To update the currently configured value for this feature.
RECONFIGURE
GO

実行結果は以下の通り

構成オプション 'show advanced options' が 0 から 1 に変更されました。RECONFIGURE ステートメントを実行してインストールしてください。
構成オプション 'xp_cmdshell' が 0 から 1 に変更されました。RECONFIGURE ステートメントを実行してインストールしてください。

これで、ストアドプロシージャ内で以下のような感じでbcpコマンドが使えるハズです。

EXECUTE xp_cmdshell 'bcp AdventureWorks2008R2.Sales.Currency2 in Currency.dat -T -c'

EXECUTE xp_cmdshell 'bcp "SELECT Name FROM AdventureWorks2008R2.Sales.Currency" queryout Currency.Name.dat -T -c'

2011年2月3日木曜日

HIDEBBS

HIDEBBS終了?