2016-07-16 10 views
1

htmlspecialchars()関数を使用してPHP PDOを使用してフォーム検証とデータベースクエリで特殊文字をHTMLエンティティに変換することは本当に必要ですか?PDOでのhtmlspecialchars関数の準備と実行

例えば、私は、多かれ少なかれのような単純なログインシステムでウェブサイトを持っている:私も疑問に機能のほかに型キャストを使用し

$username = (string) htmlspecialchars($_POST['user']); 
$password = (string) htmlspecialchars($_POST['pass']); 

$query = $dbh->prepare("select id where username = ? and password = ?") 
$query->execute($username, $password); 

注意を...だから、それは必要なのか?または、安全に$username = $_POST['user'];を使用できますか?

答えて

1

書籍やインターネット上のphp.netの情報や例が誤解を招く、あいまいであるため、あなたの混乱はかなり一般的です。 Webアプリケーションを開発するときに学ぶことができる最も重要なことはfilter input, escape outputです。

フィルタ入力 これは、任意のデータ入力用フォーム上のユーザーによって提供されるか、または他のソースからファイルが提供するかどうか、属していないものを除外することを意味します。たとえば、数値が必要な場合は、数値以外の文字を除外します。別の例は、データの最大長を制限/保証することです。しかし、これで夢中になる必要はありません。たとえば、文字通り任意の文字の組み合わせを含むことができるテキスト行が必要な場合、フィルタを使用しようとすると、おそらくユーザーを苛立たせるだけです。

したがって、通常は入力データを必要に応じてフィルタリングしてデータベースに格納します。 エスケープ出力によって意味される何

エスケープ出力 は、適切に与えられたメディアのための安全なデータを作ることです。ほとんどの場合、このメディアはWebページ(html)です。しかし、それはプレーンテキスト、xml、pdf、イメージなどであってもかまいません。htmlの場合、これはhtmlspecialchars()またはhtmlentities()を使用することを意味します(hereの違いを読むことができます)。他のメディアタイプの場合は、必要に応じてエスケープ/変換します(または、必要であれば、まったく変換しないでください)。

今、あなたの質問には、SQLクエリパラメータとして使用される入力データにhtmlspecialchars()を使用する必要があるかどうかではありません。答えはいいえだ。どのような方法でもデータを変更しないでください。

はい、$ _POSTに含まれるデータは、危険なものとみなす必要があります。。 1)あなたがしているように、準備されたステートメントとバインドされたパラメータを使用してSQLインジェクションを防ぎ、2)htmlに置くと$ _POSTにあるデータを適切にエスケープ/変換する必要があります。

はあなたのためにこれらの詳細を扱うPHPのための多くのフレームワークがあり、私はあなたが選んで、1を使用することを推奨します。ただし、そうしないと、安全で安全なアプリケーションを構築できます。フレームワークを使用するかどうかにかかわらず、I 強くは、OWASPが推奨する推奨事項を読むことをお勧めします。そうしなければ、あなたのWebアプリケーションのセキュリティ上の悪夢に陥るだけです。

0

プレーンテキスト(ユーザー入力または以前にデータベースに格納してSELECTで取り出したユーザー入力、またはサードパーティからHTTP経由で取得したテキストなど)がある場合は、htmlspecialcharsを使用する必要があります。等)、あなたはをHTML文書に挿入します。これはXSSからあなたを守ります。

一般に、データをデータベースに挿入するときは使用しないでください(データベースはHTMLドキュメントではありません)。 HTML以外の形式で後で使用したいかもしれません。

+0

ユーザーがログインフォームに記入し、ユーザー名/パスワードが実際に有効になった後、実際に、いくつかのセッション変数が作成されます。そのうちの1つは '$ _SESSION ['user'] = $ username'で、ナビゲーションバーに表示されます。だからこの場合、 'htmlspecialchars'を使うべきでしょうか? – GPraz

+0

@GPraz - どこからでも(セッションスーパーグローバルを含む)ユーザー名(プレーンテキストとして表示)を取得し、それをHTML文書に入れるときは、 'htmlspecialchars'を使うべきです。 – Quentin

-3

私の意見では、ユーザーはpassword.Andのような任意の文字を追加する権利があり、制限する必要はありません。

はhtmlspecialchars()に関するご質問への答え:プリペアドステートメントに

パラメータは引用符で囲む必要はありません。ドライバは自動的にこれを処理します。アプリケーションがプリペアドステートメントを排他的に使用する場合、開発者はSQLインジェクションが発生しないことを確認できます(ただし、エスケープされていない入力でクエリの他の部分が構築されている場合は、SQLインジェクションは可能です)。

Prepared statements and stored procedures

希望は助けました。 Good Luck

+0

PDOに関する実務経験はありますか?コードはまれであるように見えます。 –

+0

@あなたの常識あなたに根拠がないという強力な議論をしてください。そこにいるなら正解を加えます。 –

+1

申し訳ありませんが、あなたが何を意味しているのかよくわかりません。 –

関連する問題