2012-06-20 14 views
5

ここでPHP/MySQLの初心者のビットと表示名/ユーザー名/パスワードのための安全な文字...PHP/MySQLの - PDO

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

私はエスケープ、準備された声明など、そして "bobby"のようなSQLインジェクションを防ぐ方法を学んでいました。

私は、PDOプリペアドステートメントを使用してフォームにユーザー入力を取得し、DBに登録します。しかし、私はいくつかのことを知っている必要があります:私は @、#などの特殊文字を許可するために、私はプリペアドステートメントを使用しておりますので

  1. を、表示名、ユーザ名、 パスワードなどのために、それは大丈夫です、 $、あるいは '一重引用符'や '二重引用符?スペースについては、 の国際文字、アクセント付きの文字、または♥ のようなものはどうですか?これらの文字を許可するのが「大丈夫」かどうかを尋ねると、 セキュリティリスクがさらに発生する可能性がありますか? 人々のユーザー名に引用符や括弧を使用できないようにします 太字または斜体のhtmlタグですか?

  2. 最も特殊文字を許可しても大丈夫であれば、なく一部:(MySQLの範囲の)任意の特定の「危険」の文字は、私は絶対に違法にする必要があり がありますか? 、

  3. を私は典型的な「英数字 とアンダースコア」範囲外の文字を許可した場合(私は引用符は、この議題 に合うかもしれないが、私はその上で混合された信号を取得しています。のように感じる)任意の落とし穴私はそこにあります後で (MySQL、SQL、またはPHPで)が奇妙な文字を許可しないことがありますか?私は 人のユーザ名を表示すると、何とか実際の タグではなく、htmlタグを文字列として表示する必要がありますか?または、私がそれらと照会したいときはいつでも、人々のユーザー名の中で 引用符をエスケープする必要がありますか? PDOで準備済みの文 を使用しているので、この問題はありませんか?

  4. 私は はまだ、これらのアルファベットは私のウェブサイト上でレンダリングすることができます確認しながら は、表示名とユーザ名の最も広い範囲を受け入れることができますか?それを作るには、UTF8またはどこかで来るUTF16のような文字セットを実行しますか。

  5. 私は 英語のものと同じに見えるいくつかのキリル文字があることを知っています。私はMS Wordからこれらをまっすぐにコピーし、私のユーザー名に を使用しました。キリル文字 "a"の場合は 英語の "a"をスワップアウトするだけで、これらの文字を他のメンバーに知覚的に偽装するのに、 することができます。誰かがalt-codeに精通していないかどうかを調べるには、♥のユーザー名が難しいかもしれません。 この を気にする必要がありますか?これについてあなたの意見は何ですか?

私はこれについていくつかの洞察を与えることができます誰にも先生に感謝します。

+0

あなたの投稿を一度に1つの質問に限定してください。 –

答えて

2

まず、あなたのスタイルが本当に好きだと言いましょう。ほとんどの人は、これらのことを考える時間を取らず、データの完全性検査を行わずにクエリをまとめるだけです。だから勤勉であることをお祝いします。 :)

つまり、PDOを使用すると、クエリを誤ってしまうことを心配する必要はありません。特に、変数をbindParamにバインドすると、厳密なパラメータ制御が可能になります。これで、変数の型と長さをキャストすることができます。また、PDOがそれらをエスケープするので、特殊文字はクエリを混乱させません。だからこそ心配する必要はありません。

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

+0

でも、「htmlspecialchars」を信頼するだけで危険です。http://blog.astrumfutura.com/2012/03/a-hitchhikers-guide-to-cross -site-scripting-xss-in-php-part-1-how-not-use-htmlspecialchars-for-output-escaping/ –

+0

ありがとうございました。これは私の「全体的な」質問に非常によく答えます。 :) – Jackson

4

このSQL Injection Cheat Sheetには、開発中にテストできるMySQLクエリのいくつかの例があります。

"受け入れられる"ものについてのあなたの質問のいくつかについて学ぶための素晴らしいリソースであり、 "データの一部"のライフサイクル全体を考慮する必要があります。

通常、データの一部は、HTMLフォームで開始し、(そう、ユーザーが望むならば、彼らはただフォームせずに直接データを投稿することができます)あなたのPHPスクリプトにPOSTさを取得する可能性があります。 あなたのPHPスクリプト(うまくいけば)のデータをsanitizes 保存です。

データベースに、あなたはバックアップ操作をやっているかもしれませんが、SQLDump、またはメンテナンスの他のいくつかの並べ替えに保存します。

はその後、明らかデータは、マークダウン言語だ場合、それはをコンパイルしてしまうかもしれません、そして最終的にはそれはそれはおそらくをHTMLに注入だとを表示誰かのブラウザに送信され、いくつかの点で読むになります。

わかりますように、データのライフサイクルには多くの場所があり、問題が発生する可能性があります。これらのすべてを考慮しなければ、データを保存/ロードするたびにバックスラッシュなどの一般的なエラーが表示されることがあります。SQLエラー、攻撃の脆弱性などになります。

どのような種類のデータあなたはサポートしますか?それはあなた次第です。それを正しく扱うようにしてください。

+0

リンクありがとうございました。そのページは脅迫的に見えますが、私のプロジェクトに役立つセキュリティリソースのようにも見えます。私はデータのライフサイクルの概要も高く評価しています。私は(ややゆるやかに)現在それを理解しているので、「大きな絵」のあまりあいまいな考えを私に与えてくれる:P – Jackson