アカウント名:
パスワード:
例えばOracleDBMSなんかだと, 一回構文解析したSQLはキャッシュ上に保存しておいて, 同じ字面のSQLが再発行された場合にはキャッシュ上の解析済みのコードを実行するようになっています. この効果は抜群で, 1回目には100m秒単位でかかっていた解析処理が2回目以降は10m秒未満から1m秒単位で実行可能になり, それに応じてCPU負荷も減ります.
そのため, OracleDBMSを利用したエンタープライズシステムではSQLの動的生成は論外に近く, 基本的にPreparedStatementを使ってパラメータのみを変更するのが定石になっています. 副次的に, PreparedStatementを使うと, かなりの割合のSQLインジェクションを防ぐことができるという利点もあります.
そういった開発パターンに慣れている立場から見ると, それほど容易にSQLインジェクションを可能にする環境というのがどういうものなのか, 逆に興味があります.
PreparedStatement を使っていても危険な場合で、自分が知っている範囲だと。
LIKE 演算子の場合は SQL インジェクションとは言わないのかもしれませんが、サーバーの負荷を上昇させたりはできなくはないと思うのですよ。
個人的にはですね。SQL インジェクション云々以前に、' を入力したらエラーになるのを仕様とか言い張るのがどうかしているんじゃないかと思うのですよ。' は入力しないで! ってマニュアルに一言書くだけじゃんと言われてしまったり。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
アレゲは一日にしてならず -- アレゲ見習い
SQLは人が手で入力して使うツール (スコア:1)
コードにSQLの断片を埋め込んで、パラメータを文字列連結して、ランタイムでコードがSQLを生成するのは、全面的にやめるべきだと思います。
メンテナンス性の為や手抜きのために複雑な構文解析機を通して検索ロジックを実行時に機械語へビルドしている事になるわけですが、安全なサービスの構築のためにはロジックは静的に用意されているべきだと思います。
上に ORM をのっけて蓋をするのでもいいんですが、SQLという文字列でロジックをDBSに渡すというのは、無駄が多すぎる気がしてなりません。
良い解決策をもっているわけではないのですが…
Re: (スコア:4, 興味深い)
例えばOracleDBMSなんかだと, 一回構文解析したSQLはキャッシュ上に保存しておいて, 同じ字面のSQLが再発行された場合にはキャッシュ上の解析済みのコードを実行するようになっています. この効果は抜群で, 1回目には100m秒単位でかかっていた解析処理が2回目以降は10m秒未満から1m秒単位で実行可能になり, それに応じてCPU負荷も減ります.
そのため, OracleDBMSを利用したエンタープライズシステムではSQLの動的生成は論外に近く, 基本的にPreparedStatementを使ってパラメータのみを変更するのが定石になっています. 副次的に, PreparedStatementを使うと, かなりの割合のSQLインジェクションを防ぐことができるという利点もあります.
そういった開発パターンに慣れている立場から見ると, それほど容易にSQLインジェクションを可能にする環境というのがどういうものなのか, 逆に興味があります.
Re: (スコア:0)
> それほど容易にSQLインジェクションを可能にする環境というのがどういうものなのか,
> 逆に興味があります.
PreparedStatementだと安全だと思い込んでる段階で既にヤバそうだな
ま、いいけどさ
PreparedStatementを使ってもSQLインジェクションの危険はあるの? (スコア:1)
元のコメント主とは違いますが、PreparedStatementやまっとうなO/Rマッパーを使えば起こることは無いと認識していたのですが違うんでしょうか?
不勉強で申し訳ないですが「こういうときにヤバいぞー」というのとその場合の対策が知りたいです。
Re: (スコア:1)
PreparedStatement を使っていても危険な場合で、自分が知っている範囲だと。
LIKE 演算子の場合は SQL インジェクションとは言わないのかもしれませんが、サーバーの負荷を上昇させたりはできなくはないと思うのですよ。
個人的にはですね。SQL インジェクション云々以前に、' を入力したらエラーになるのを仕様とか言い張るのがどうかしているんじゃないかと思うのですよ。' は入力しないで! ってマニュアルに一言書くだけじゃんと言われてしまったり。
Re:PreparedStatementを使ってもSQLインジェクションの危険はあるの? (スコア:0)
参考:Java の PreparedStatement で MySQL の LIKE を扱う方法 [nilab.info]
>サーバーの負荷を上昇させたりはできなくはない
JDBCサイドでPreparedStatementとtimeoutの設定するのと、インフラ的にDDoS対策をするので充分。
もちろん、インデックスや分割などの各種チューニングは当然されているものとして。
>' を入力したらエラーになるのを仕様とか言い張るのがどうかしているんじゃないか
まあ、'でエラーはともかくRFCに併せて入力しないでと断る状況はありうるけどね。
それはエラーではなく、妥当性チェックで弾かれている類のものですね。
データベースで'入力でエラーでるから入れないでで済ます輩は、メール送信でも同じ事やってるね。
日本人開発者は日本語のメールが文字化けしたとクレームつけたら、変だと納得して修正するが、
オフショア開発にはそういう意識無くゴタゴタが起きるので、発注に回るときは気をつけたい所。