16

MySQLAPIの関数を使用しています

mysql_real_escape_string()

ドキュメントに基づいて、次の文字をエスケープします。

\0
\n
\r
\
'
"
\Z

ここで、OWASP.orgのESAPIセキュリティライブラリを調べたところ、Pythonポートに次のコードが含まれていました(http://code.google.com/p/owasp-esapi-python/source/browse/esapi/codecs/mysql。 py):

        """
        Encodes a character for MySQL.
        """
        lookup = {
        0x00 : "\\0",
        0x08 : "\\b",
        0x09 : "\\t",
        0x0a : "\\n",
        0x0d : "\\r",
        0x1a : "\\Z",
        0x22 : '\\"',
        0x25 : "\\%",
        0x27 : "\\'",
        0x5c : "\\\\",
        0x5f : "\\_",
        }

さて、これらすべてのキャラクターを本当にエスケープする必要があるのだろうかと思います。%と_が存在する理由は理解できますが、これらはLIKE演算子のメタ文字ですが、なぜバックスペースとタブ文字(\ b \ t)が追加されたのか簡単には理解できません。クエリを実行する場合、セキュリティの問題はありますか?

SELECT a FROM b WHERE c = '...user input ...';

ユーザー入力にタビュレーターまたはバックスペース文字が含まれている場合は?

私の質問はここにあります:なぜ彼らはESAPIセキュリティライブラリに\ b \ tを含めたのですか?それらのキャラクターをエスケープする必要があるかもしれない状況はあります

4

6 に答える 6

48

バックスペース文字に関する推測:「こんにちは、DBを必要に応じて更新するためのクエリです」というメールと添付のテキストファイルを送信するとします。

INSERT INTO students VALUES ("Bobby Tables",12,"abc",3.6);

ファイルをキャットし、問題がないことを確認して、ファイルをMySQLにパイプします。しかし、あなたが知らなかったのは、私が置いたということでした

DROP TABLE students;\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b

コンソール出力でバックスペースが上書きしたために表示されなかったINSERTSTATEMENTの前。バム!

ただし、推測です。

編集(抵抗できませんでした):

代替テキスト

于 2009-07-06T13:34:32.913 に答える
18

文字列のMySQLマニュアルページには次のように書かれています:

  • \0   ASCII NUL (0x00) 文字。
  • \'   一重引用符 ("<code>'") 文字。
  • \"   二重引用符 ("<コード>"") 文字。
  • \b   バックスペース文字。
  • \n   改行 (改行) 文字。
  • \r   キャリッジ リターン文字。
  • \t   タブ文字。
  • \Z   ASCII 26 (Control-Z)。表の後の注を参照してください。
  • \\   バックスラッシュ (「<コード>\」) 文字。
  • \%   「<code>%」文字。表の後の注を参照してください。
  • \_   「<コード>_」文字。表の後の注を参照してください。
于 2009-07-06T14:14:11.397 に答える
4

他のオプションがある場合、ブラックリスト (悪い文字を識別する) は決して行く方法ではありません。

ホワイトリストを組み合わせて使用​​する必要があり、さらに重要なことに、バインドされたパラメーターのアプローチを使用する必要があります。

この特定の回答はPHPに焦点を当てていますが、それでも十分に役立ち、多くの場合、文字フィルターを介して文字列を実行するだけでは機能しないことを説明するのに役立ちます. htmlspecialchars と mysql_real_escape_string は PHP コードをインジェクションから安全に保ちますか?を参照してください。

于 2009-07-06T14:04:33.860 に答える
0

ユーザー入力にタブレータまたはバックスペース文字が含まれている場所は?

今日に至るまで、ほとんどのユーザーがユーザー入力をエスケープする必要があると信じており、そのようなエスケープによって「インジェクションを防ぐ」ことができるという事実は非常に注目に値します。

于 2014-05-01T05:09:16.787 に答える
-2

ユーザー入力から一重引用符を削除することはできませんか?

例えば:$input =~ s/\'|\"//g;

于 2017-03-13T12:54:08.460 に答える