- - PR -
SQL インジェクションの防止
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-07-07 14:12
パラメータクエリでも十分、楽で融通のきく書き方が可能です。 むしろ、考えなくてはいけない事が減る分、トータルでは楽なのではないでしょうか。 _________________ 「伝える」とは「人に云う」と書く。 http://d.hatena.ne.jp/NAL-6295/ | ||||||||||||
|
投稿日時: 2005-07-07 16:05
たとえば JDBC なんかだとパラメータを ? で書いて番号で指定しないといけないので、ソースコードの可読性が高いとは言えない。文字列組み立て方式のほうがコードを追いやすい。 それと、SQL Server の場合、パラメータ化クエリを使用するとプロファイラが読みにくくなります。パラメータ化クエリってミドルウェアがプレーンテキストに展開して実行するのではなく、パラメータを扱える専用のストアド経由で実行されるんですよね。なので、プロファイラの可読性が落ちる。 なので、私は PreparedStatement 実装を自分で作って、プレーンテキストに展開してサーバーにクエリを投げる仕組みを作っています。で、この実装がエスケープ処理しているのは、いまのところ シングルクォーテーションだけなので、注意しなければいけない文字種についての情報があるなら私も知りたいなあ。 | ||||||||||||
|
投稿日時: 2005-07-07 16:48
どもです。がると申します。
んっと。とりあえずまずひとつ。がうしぇさんもかかれてますが。
SELECT *は「絶対に使っちゃ駄目」な構文です。 コンソールで「手で叩いて中身を見る」時にはまぁよいと思うのですが。 プログラム中には何があっても埋め込まないようにしておきましょう。 で。おいらの場合はエスケープ処理用の関数を自作してます。 現状は ’ ” ¥ ; の4種ですね。
んっと。 ・数字だろうがなんだろうが絶対に’で括る ことを前提にするとして、念のために¥は注意しておいたほうがよいと思うです。 (¥がエスケープ文字であることを前提にしたとして) 簡単に実例を出すと。 動的領域が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とかを 瀬戸際で防ぎたいから」です。 なにかの参考にでもなれば幸いです。 | ||||||||||||
|
投稿日時: 2005-07-07 17:23
これは、どのようなソースから得られた情報でしょうか。パラメータクエリの場合は、どんな RDBMSでも「ミドルウェアが展開」なんてしないと思いますが。そんなことしたらパラメータ クエリのメリットである「ハードパースの回避によるパフォーマンス向上」が得られなくなって しまうと思います。 プロファイラってのは使ったことないんですが、それが理由でパラメータクエリを使わないと いうのは、本末転倒じゃないですか? | ||||||||||||
|
投稿日時: 2005-07-07 17:27
どもです。がるです。
そういえば、ちょいと便乗な質問で恐縮なのですが。 パラメタクエリって、MS以外の世界観でも使用できるものでしょうか? なんかぐぐったりしている限りだと、ODBCとかJDBCとかVBとかC#とか、 そのあたりしか資料がなくて。 例えば LinuxでPerlでMySQL とか Free BSD で C++ で DB2 とか、そういった「MSのいない」環境でも使えるものなんでしょうか? # ぶっちゃけ「便利なら使ってみたい」ので :-P | ||||||||||||
|
投稿日時: 2005-07-07 17:41
¥ (←半角バックスラッシュ) がエスケープ文字として扱われる処理系ってどのようなものがありますか? SQL Server, Oracle, C, Java いずれも問題ないようようですが。いや、むしろエスケープしようとすると ¥ が二重になってしまうのですが・・・。
Java などで、実行時にソースコードをコンパイルして動かすようなものを想定しているのでしょうか? | ||||||||||||
|
投稿日時: 2005-07-07 17:45
パラメータを使う事でここを考えなくても良くなるなら、その方が良いと思うんですよね。 まぁ、思うだけですが。 私は、プロファイラで見難いことよりも、エスケープ処理が漏れていて危険な方が怖い。 _________________ 「伝える」とは「人に云う」と書く。 http://d.hatena.ne.jp/NAL-6295/ | ||||||||||||
|
投稿日時: 2005-07-07 18:01
「SQL Server の場合は」 という表現は、私が確認した範囲という意味です。他の RDBMS がどうなのか知らない・確認していないので、このように書きました。
実装が存在するかどうか知りませんが、パラメタ化クエリを使用できない RDBMS では、ミドルウェアがプレーンテキストに展開するしかないのでは? パラメタ化クエリをサポートしていない RDBMS で JDBC(PrepareStatement) や ADO(Command) のパラメータ指定をサポートしているものがあってもおかしくないと思います。 それと、(密接な関係があるのは確かですが) パフォーマンス向上の要因になっているのはパラメタを使うことではなく、プリコンパイルによるものでしょう。
パラメタを使わないとは言っていませんよ? プリコンパイルクエリを使わないだけです。パラメタは使いたいので自分で実装しています。それで、注意が必要な文字があれば教えて欲しいということ。 安全のためにパラメタを使いたいだけ。都度コンパイルでもパフォーマンスに不満は持っていません。いまのところ。 |