クライアントに任意のSQLを実行させる危険性

クロスブラウザ関数群をブラウザ限定して小さくし、欲を言えば、日付入力用カレンダー やダイナミックロードとか、jslb_ajaxやドラッガブルフロートやインジケータオブジェクト、AjaSQLなども整理したいなぁと。

うぉ。AjaSQLは1年近く放置されてたのでもう放棄かと思ったらやる気なんですね。なんか、はてなブックマークのほうを見ても最近でも地味にブックマークしている人がいるけど、自分の感覚からいえば有る程度制限を掛けているとしても不特定多数のクライアントから任意のSQLを実行させるなんてライブラリは作るほうも使おうとするほうも正気の沙汰とは思えないんだけどなぁ。ブックマークコメントを見てもほとんどの人は危険性を認知していないように思える。というより、多分、危険だと思った人はブックマークしてないだけなんだと思うけど。
ということで、とりあえずそのコンセプト自体の問題点を考えてみる。

レコードごとの認証を掛けることができない

多分、世の中のほとんどのRDBMSはテーブル毎のアクセス権限は細かく設定できてもレコード(行)毎のアクセス権限は設定できない。少なくともMySQLSQLiteは無理。
すると有るテーブルのレコードを見せようとすれば、そのテーブルのレコードは全部見えてしまうことになるし、更新させようとすれば全レコードを更新できてしまう。JavaScriptのレベルで認証しても最終的には単なるHTTPリクエストなので、スクリプトBookmarkletで簡単にHTTPリクエストが発行されるので問題外。JavaScriptのソースを難読化するとか暗号化するとかすれば有る程度防げるかも知れないが、所詮JavaScriptなので、多分Firefox+FireBugs+LiveHTTPHeadersとかで一発で解析される。

DoSに弱い

たとえ100レコードのテーブル1つしかなくても

SELECT f.id FROM foo as f, foo, foo, foo, foo;

ってやれば、結果は100億レコードになる。ついでに ORDER BY とか GROUP BY とか DISTINCT とかつければさらに効果的かもしれない。要するに、たかだが50文字程度のクエリパラメータを含むHTTPリクエスト1つで簡単にDoS攻撃ができるようになる可能性があると。

と、今思いつくのはこんなところかなぁ。DoSの方というかセキュリティ全般的にも、SQLの実行は

SendSQL("SELECT name FROM users WHERE id = ?", user_id);

みたいなプレースホルダを使った形にしておいて、登録してあるSQLしか実行できないようにしておくとかすれば多少はマシかなぁ。パラメータを検査なしで使うだけでも十分危ないけど。