- PR -

SQL インジェクションの防止

投稿者投稿内容
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-07-07 14:12
引用:

こばさんさんの書き込み (2005-07-07 13:54) より:
 みなさんが書かれているパラメータクエリ、とても有益なことは分かってますが、SQL 文を直に書くほうが楽で融通きくことも多いもので・・・(--



パラメータクエリでも十分、楽で融通のきく書き方が可能です。
むしろ、考えなくてはいけない事が減る分、トータルでは楽なのではないでしょうか。
_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-07-07 16:05
引用:
パラメータクエリでも十分、楽で融通のきく書き方が可能です。
むしろ、考えなくてはいけない事が減る分、トータルでは楽なのではないでしょうか。


たとえば JDBC なんかだとパラメータを ? で書いて番号で指定しないといけないので、ソースコードの可読性が高いとは言えない。文字列組み立て方式のほうがコードを追いやすい。

それと、SQL Server の場合、パラメータ化クエリを使用するとプロファイラが読みにくくなります。パラメータ化クエリってミドルウェアがプレーンテキストに展開して実行するのではなく、パラメータを扱える専用のストアド経由で実行されるんですよね。なので、プロファイラの可読性が落ちる。

なので、私は PreparedStatement 実装を自分で作って、プレーンテキストに展開してサーバーにクエリを投げる仕組みを作っています。で、この実装がエスケープ処理しているのは、いまのところ シングルクォーテーションだけなので、注意しなければいけない文字種についての情報があるなら私も知りたいなあ。
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-07-07 16:48
どもです。がると申します。
んっと。とりあえずまずひとつ。がうしぇさんもかかれてますが。
引用:

こばさんさんの書き込み (2005-07-07 10:22) より:
select * from account


SELECT *は「絶対に使っちゃ駄目」な構文です。
コンソールで「手で叩いて中身を見る」時にはまぁよいと思うのですが。
プログラム中には何があっても埋め込まないようにしておきましょう。

で。おいらの場合はエスケープ処理用の関数を自作してます。
現状は
’ ” ¥ ;
の4種ですね。

引用:

未記入さんの書き込み (2005-07-07 16:05) より:
で、この実装がエスケープ処理しているのは、いまのところ シングルクォーテーションだけなので、注意しなければいけない文字種についての情報があるなら私も知りたいなあ。


んっと。
・数字だろうがなんだろうが絶対に’で括る
ことを前提にするとして、念のために¥は注意しておいたほうがよいと思うです。
(¥がエスケープ文字であることを前提にしたとして)

簡単に実例を出すと。
動的領域が2箇所あるとして、
WHERE data1='動的1' and data2='動的2';
という構文において、
動的1に \
動的2に or 'a'='a';
という変数を入れると、
WHERE data1='\' and data2=' or 'a'='a';';
となってしまいます。この場合

data1 が 「' and data2=」である
もしくは
'a' が 'a' である

という条件式になってしまい、「簡単に条件をture」にできるです。
で、ちょっと応用すれば、updateからdelete、insertなど「色々な」
ことができてしまいます :-P

私が”を念のためにやってるのは「まれに’じゃなくて”を使うケースを想定」
で、;に関しては「ド最悪の場合に、insertとかupdateとかdeleteとかを
瀬戸際で防ぎたいから」です。

なにかの参考にでもなれば幸いです。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-07-07 17:23
引用:

それと、SQL Server の場合、パラメータ化クエリを使用するとプロファイラが読みにくくなります。パラメータ化クエリってミドルウェアがプレーンテキストに展開して実行するのではなく、パラメータを扱える専用のストアド経由で実行されるんですよね。なので、プロファイラの可読性が落ちる。


これは、どのようなソースから得られた情報でしょうか。パラメータクエリの場合は、どんな
RDBMSでも「ミドルウェアが展開」なんてしないと思いますが。そんなことしたらパラメータ
クエリのメリットである「ハードパースの回避によるパフォーマンス向上」が得られなくなって
しまうと思います。

プロファイラってのは使ったことないんですが、それが理由でパラメータクエリを使わないと
いうのは、本末転倒じゃないですか?
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-07-07 17:27
どもです。がるです。
そういえば、ちょいと便乗な質問で恐縮なのですが。
パラメタクエリって、MS以外の世界観でも使用できるものでしょうか?
なんかぐぐったりしている限りだと、ODBCとかJDBCとかVBとかC#とか、
そのあたりしか資料がなくて。
例えば
LinuxでPerlでMySQL
とか
Free BSD で C++ で DB2
とか、そういった「MSのいない」環境でも使えるものなんでしょうか?
# ぶっちゃけ「便利なら使ってみたい」ので :-P

未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-07-07 17:41
¥ (←半角バックスラッシュ) がエスケープ文字として扱われる処理系ってどのようなものがありますか? SQL Server, Oracle, C, Java いずれも問題ないようようですが。いや、むしろエスケープしようとすると ¥ が二重になってしまうのですが・・・。

Java などで、実行時にソースコードをコンパイルして動かすようなものを想定しているのでしょうか?
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2005-07-07 17:45
引用:

未記入さんの書き込み (2005-07-07 16:05) より:
で、この実装がエスケープ処理しているのは、いまのところ シングルクォーテーションだけなので、注意しなければいけない文字種についての情報があるなら私も知りたいなあ。



パラメータを使う事でここを考えなくても良くなるなら、その方が良いと思うんですよね。
まぁ、思うだけですが。
私は、プロファイラで見難いことよりも、エスケープ処理が漏れていて危険な方が怖い。
_________________
「伝える」とは「人に云う」と書く。
http://d.hatena.ne.jp/NAL-6295/
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-07-07 18:01
引用:
パラメータクエリの場合は、どんな RDBMSでも「ミドルウェアが展開」なんてしないと思いますが。


「SQL Server の場合は」 という表現は、私が確認した範囲という意味です。他の RDBMS がどうなのか知らない・確認していないので、このように書きました。

引用:
そんなことしたらパラメータクエリのメリットである「ハードパースの回避によるパフォーマンス向上」が得られなくなってしまうと思います。


実装が存在するかどうか知りませんが、パラメタ化クエリを使用できない RDBMS では、ミドルウェアがプレーンテキストに展開するしかないのでは? パラメタ化クエリをサポートしていない RDBMS で JDBC(PrepareStatement) や ADO(Command) のパラメータ指定をサポートしているものがあってもおかしくないと思います。

それと、(密接な関係があるのは確かですが) パフォーマンス向上の要因になっているのはパラメタを使うことではなく、プリコンパイルによるものでしょう。

引用:
プロファイラってのは使ったことないんですが、それが理由でパラメータクエリを使わないというのは、本末転倒じゃないですか?


パラメタを使わないとは言っていませんよ? プリコンパイルクエリを使わないだけです。パラメタは使いたいので自分で実装しています。それで、注意が必要な文字があれば教えて欲しいということ。

安全のためにパラメタを使いたいだけ。都度コンパイルでもパフォーマンスに不満は持っていません。いまのところ。

スキルアップ/キャリアアップ(JOB@IT)