6

PHP / MySQL 初心者のビット...

表示名、ユーザー名、パスワードなどのユーザー情報を格納するために MySQL データベースを使用する PHP ベースのサイトを構築しています。

私は、エスケープ、準備されたステートメントなどについて学んでおり、"bobby'); drop table users--" のような SQL インジェクションを防ぐ方法を学んでいます。

DBに登録するために、PDOプリペアドステートメントを使用してフォームからユーザー入力を取得しています。ただし、いくつかのことを知る必要があります。

  1. 表示名、ユーザー名、パスワードなどに準備済みステートメントを使用しているため、@、#、$、または「一重引用符」や「二重引用符」などの特殊文字を使用しても問題ありませんか? スペース、国際文字、アクセントのある文字、または ♥ のようなものはどうですか? そして、これらの文字を許可しても「大丈夫」かどうか尋ねると、人々のユーザー名に引用符や括弧を許可したり、太字や斜体の html タグなどを許可したりすることで、さらにセキュリティ上のリスクが生じるのではないかと考えています。

  2. ほとんどの特殊文字を許可しても、一部を許可しない場合: (MySQL の範囲内で) 絶対に違法にする必要がある特定の「危険な」文字はありますか? (引用はこのアジェンダに合うかもしれないと思いますが、それについてはさまざまな兆候があります。)

  3. 典型的な「英数字とアンダースコア」の範囲外の文字を許可する場合、後で (MySQL、SQL、または PHP で) 変な文字を許可することで発生する可能性のある落とし穴はありますか? 人々のユーザー名を表示するときに、HTML タグを実際のタグではなく文字列として表示する必要がありますか? または、クエリを実行したいときはいつでも、人々のユーザー名の引用符をエスケープする必要がありますか? それとも、PDO で準備済みステートメントを使用するので、これは問題になりませんか?

  4. utf8 や utf16 のような文字セットは、Web サイトでこれらのアルファベットをレンダリングできることを確認しながら、幅広い表示名とユーザー名を受け入れることができるようにするために、どこにでも使用できますか?

  5. 英語と同じように見えるキリル文字がいくつかあることを私は知っています。私はこれらを MS Word からそのままコピーして、自分のユーザー名に使用していました。英語の「a」をキリル文字の「a」に置き換えるだけで、これらを使用して他のメンバーを知覚的に偽装できることがわかりました。誰かが代替コードに精通していない場合、♥ が含まれるユーザー名を検索するのが難しい場合があります。これは心配する必要がありますか?これについてどう思いますか。

これについて私に洞察を与えることができる人に前もって感謝します。

4

2 に答える 2

4

このSQLインジェクションのチートシートには、開発中にテストできるMySQLクエリの例がいくつかあります。

これは、「許容できる」とは何かに関するいくつかの質問について学ぶための優れたリソースであり、「データの一部」のライフサイクル全体を考慮する必要があります。

通常、データの一部はHTMLフォームで始まり、PHPスクリプトにPOSTされます(したがって、ユーザーが望む場合は、フォームなしでデータを直接POSTできます)。次に、phpスクリプトが(うまくいけば)データをサニタイズし、それが保存されます

データベースにいる間、バックアップ操作を行ったり、SQLDumpに保存したり、その他の種類のメンテナンスを行っている可能性があります。

そうすれば、明らかにデータはある時点で読み取られ、マークダウン言語の場合はコンパイルされる可能性があり、最終的には誰かのブラウザに送信され、そこでおそらくhtmlに挿入されて表示されます

ご覧のとおり、データのライフサイクルには、問題が発生する可能性のある場所がたくさんあります。これらすべてを考慮しないと、データを保存/ロードするたびにバックスラッシュが積み重なるなどの一般的なエラーが発生する可能性があります。SQLエラー、攻撃に対して脆弱になるなど。

どのようなデータをサポートしたいですか?それはあなた次第です。正しく処理することを確認してください。

于 2012-06-20T06:50:17.950 に答える
2

最初に言っておきますが、私はあなたのスタイルがとても好きです。ほとんどの人は、これらのことを熟考するのに時間をかけず、データのサニタイズをまったく行わずにクエリをまとめただけのようです。勤勉であることを祝福します。:)

とはいえ、PDO を使用すれば、引用符がクエリを台無しにすることを心配する必要はありません。特に、変数をbindParamでバインドすると、厳密なパラメーター制御が可能になります。これで、変数の型と長さをキャストできます。また、PDO も特殊文字をエスケープするため、特殊文字によってクエリが台無しになることはありません。そのため、心配する必要はありません。

HTML を実際の HTML ではなくテキストとして表示する場合、非常に便利な関数はhtmlspecialchars()です。これは、html コードを文字コードに変換します。この関数は、オプションの ENT_QUOTES フラグと一緒に使用することもできます。これにより、 this が this に変わり"ます"。htmlspecialchars() には、出力を選択したエンコーディングに設定するオプションもあります。

于 2012-06-20T06:29:41.007 に答える