1

私が取り組んでいるプロジェクトには、JRuby/Java で記述された REST API があり、MySQL データベースにヒットして多数のレコードを取得するエンドポイントがあります。

ブール値チェックや範囲値など、1 つ以上の列を使用してクライアントがこれらのレコードをフィルタリングできるようにする必要があります。

これを行う最も簡単な方法は、文字列パラメーターを API に追加し、それを SQL ステートメントに追加することです。

総じて、開発チームはこれが悪い考えであることに同意しますが、代替手段は、SQL に変換されるフィルタリングにほぼ同じ構文を提供することです。SQL インジェクション パラメータの魅力は強力です。

だから私の質問は、これが安全なことである状況はありますか?

特に、事前に完全に解析され、そのように識別されている場合、WHERE 句を安全に使用することを検討できます。または、少なくとも、DROP、SELECT などの特定のトリガー ワードをチェックします。

また、仲介者として機能する (外部式を WHERE 句に変換または解析する) 優れたライブラリを誰かが知っていれば、それは素晴らしいことです。

4

4 に答える 4

2

OData および GData プロトコルは、この機能を安全かつ標準的な方法で実装しています。Ruby、PHP、MySQL などのサーバーとクライアントの両方の実装を見つけることができます。OData ライブラリについては、こちらを確認してください。

于 2012-11-30T15:37:06.633 に答える
1

セキュリティへの影響に加えて、任意の WHERE 句を許可することは、「API」から「I」を削除するため、悪い考えです。これはインターフェイスではありません。API は、ユーザーが実装の詳細を知る必要がないように想定されています。テーブル名と列名のように。

クライアントが独自の WHERE 句を作成してデータと対話している場合、データベースを変更することはできません。それらのステートメントがプログラムされたコードがそこにある可能性があります。バグや新機能により、既存のクライアントとの対話を中断するような方法で DB を変更する必要がある場合、行き詰まるでしょう。API はフィルタリング機能を提供し、リクエストをバックエンドへの呼び出しに変換して、API を壊さずにバックエンドを変更できるようにする必要があります。

于 2012-11-30T15:47:02.383 に答える
1

SQL インジェクションの問題は別として、内部実装 (選択したデータベース - MySQLテーブル構造の両方) を API の形式で直接公開します。

たとえば、バックエンドで NoSQL タイプの実装に変更すると、公開 API がすぐに壊れます。データベースを再構築する場合も同様です。インジェクション攻撃の可能性/重大性を心配していない環境でも、これは行いません。

于 2012-11-30T15:45:15.197 に答える
0

この目的のための多数の ORM があり、特に ruby​​ では (activerecord、sequel)

必要な最も基本的なことは、文字列入力をエスケープすることです。これにより、適切に実行していれば、続編の挿入をほとんど防ぐことができます。

パラメータを Sequel ステートメントに直接挿入する必要がない場合は、有効性を確認してから論理的なものにマップする必要がない場合に役立ちます (これは常に可能であるとは限りません)。たとえば、html ドロップダウン リストがあり、フォームを送信すると、パラメータ 'firstitem' が渡され、'firstitem' を ID にマップするか、ユーザーが指定したバージョン (このマッピングはデータベースを含まないと仮定します)。

于 2012-11-30T21:43:05.077 に答える