3

javascript/jquery を使用して SQL クエリを生成しています。javascript/jquery スクリプト内で生成および使用している SQL クエリがあります。

このようなもの:

var storeName;
var query = "SELECT * FROM stores where storeName = '" + storeName + "';";

(storeNameユーザーが html から選択すると、jquery を介して生成されます)

したがって、 「Jackson Deli」storeNameの ような場合、クエリは問題なく実行されます。

しかし、「Jackson's Deli」のstoreName場合は機能しません。これは、 Jackson's のアポストロフィが引用符のように扱われているためと思われます。クエリをハードコーディングしていた場合、引用符を2倍にすることで引用符をエスケープできることを知っています...だから

SELECT * FROM stores where storeName = 'Jackson''s Deli'; 

動作するはずです。しかし、私はクエリをハードコーディングしていません。代わりに、ユーザー入力によって生成され、名前にアポストロフィが含まれている場合と含まれていない場合があります。'この場合、このキャラクターをエスケープするにはどうすればよいですか? Javascript / jquery内で動作する必要があります。

'inを探して??storeNameに置き換えるif ステートメントを作成する必要がありますか? ''または、これについて別の方法がありますか?

編集:痛い!通常、はい、クライアント側でクエリを生成する危険性を認識しています。
ですから、ここにもう少し文脈があります。私はcartodbで作業しており、そのドキュメントに従っています。これは、私が話していることと似たようなことをしているレポの例です (他の例もあります)。

https://github.com/CartoDB/cartodb.js/blob/develop/examples/layer_selector.html

cartodb では、データを変更できるクエリを実行することはできません。データを取得できるクエリのみを実行できます。ですから、この引用文字をエスケープする最善の方法は何かをまだ考えています。

4

5 に答える 5

5

クライアント側で SQL を生成しないでください...

そうは言っても、動的クエリを使用する場合は、ユーザー入力をエスケープして、サーバー側の準備済みステートメントにバインドすることをお勧めします。

サーバー処理に使用しているデータベース (MySQL、Postgres など) と言語について詳細を投稿すると、より良い回答が得られます。

はい...これが質問に答えないことを十分に認識しています。ただし、誰もこの方法でコードを作成するべきではありません。

編集:強調するために警告を大きくしました。

于 2013-09-06T14:39:37.367 に答える
2

他の人が答えているのを見ましたが、この質問にいくつかの角度からアプローチしたかったのです。

あなたが尋ねている質問は良いものです。SQL が単一引用符で機能しないことを認識しています。何かをエスケープする必要があることに気付きます。これらは、安全で保守可能な方法でソフトウェアを設計するのに役立ついくつかの考慮事項の出発点として適しています。

  1. クライアント コード/コンテンツを直接実行しない- クライアントから SQL やあらゆる種類のコード/命令 (javascript、バイトコード、コンパイル済みコード) を生成することは、いくつかの重要な概念を壊すため、常にお勧めできません。

    • 入力を完全に制御できないため、維持が困難です。確かに SQL をエスケープすることはできますが、説明していない他の文字があるという奇妙なケースの両方のシナリオは修正されません。
    • 安全ではありません- 変数、入力、CGI パラメータ、ファイルの内容、前述のリストから値が取得されたデータベース フィールド、またはリモート システムから取得されたほぼすべてのものとの関係は、リモート ユーザーを信頼することはできません。常に入力をチェック、サニタイズ、および検証します。あなたのページのソースを開き、一重引用符のチェックを追加した場所を確認して変更し、コードを実行してレコードを削除し、特定のストアド プロシージャが利用可能な場合は電子メールで送信し、SQL バックエンドでコードを実行し、データベースをドロップします。 (クエリが適切な権限で実行されると仮定します。)
    • クライアントの入力/表示とビジネス ロジックの間の境界線をブレンド/ぼかします。ビジネス ロジックを表示/入力から分離する概念の概要については、MVC、n 層開発、およびその他の概念を調べてください。これは、スケーラビリティとパフォーマンスにとって重要であるだけでなく、重大なセキュリティ上の欠陥の原因となるこのような問題の変更を減らすためにも重要です.
  2. 「この文字列をエスケープして機能させるにはどうすればよいか」ではなく、悪者の視点からソフトウェア開発に取り組みます。「このページのエスケープをバイパスして、レコードを削除したり、必要なものを表示したりするにはどうすればよいですか.

  3. アプローチが間違っているからと言って気分を害するのではなく、そこから学んでください。これを絶対にやってはいけないというコメントをたくさん目にしますが (そして彼らは正しいです)、私たちの多くはこの教訓を難しい方法で学びました。私たちはリトル ボビー テーブルを笑いものにします。重要なのは、それが悪い考えである理由の根底を理解し、それをソフトウェアの設計に使用することです。ハードノックの学校へようこそ。私たちは皆卒業生であり、ありがたいことに、誰かがあなたのデータベースやアプリケーションをいじったり、破損させたり、削除したり、侵入させたりするのではなく、私たちのコメントから学ぶことができます.

この旅を始めるにあたって、以下を読むことをお勧めします: SQL インジェクションの説明

追加のボーナスとして、XSS Eg は、外部システムまたは人から発信された OUTPUT をエスケープします。たとえば、コメントエントリを含むHi!!! <script>alert('Thanks to this site not escaping this output I get to run this code under your login. Thanks for the 4000 crates of free tshirts you just ordered for me');</script> how are you???ので、出力すると次のようになります

Comments:Hi!!! <script>alert('Thanks to this site not escaping this output I get to run this code under your login.  Thanks for the 4000 crates of free tshirts you just ordered for me');</script> how are you???

これは「有効な」HTML であり、ブラウザはそれを実行します。

最終的な考え- モットー「信頼するが検証すれば大丈夫」を採用する

于 2013-09-06T15:06:37.623 に答える
2

参考までに、CartoDB では、テーブル内の何かを変更するクエリを実行することはできません。これは読み取り専用です。

于 2013-09-06T15:39:05.563 に答える
0

最初にサーバーにデータを送信してから、エスケープする必要があるすべての文字を addslashes() コマンドでエスケープします (PHP を使用している場合)。

PHP での addslashes() コマンド

文字のエスケープ処理が完了したら、cartoDB の API と API キーを使用してデータを cartoDB に送信できます。

于 2013-10-20T13:20:06.090 に答える
-1

cartoDB は、SQL API を介して挿入/更新/削除タスクを提供します。このリンクを参照してください。

http://developers.cartodb.com/documentation/sql-api.html

于 2013-12-18T13:37:55.430 に答える