web-dev-qa-db-ja.com

GETでユーザーのデータをPHP

PHPの$ _GET変数のデータをどのようにサニタイズしますか?

strip_tagsでGETの変数を1つだけサニタイズします。前回Postgresにデータを入力したとき、問題はpg_prepareを使用することで最も簡単に解決されたため、すべてをサニタイズする必要があるかどうかはわかりません。

出力のサニタイズについて話している場合、データベースにコンテンツを完全なエスケープされていない形式で保存し、データをエコーアウトするときにそれをエスケープすることをお勧めします( htmlspecialchars または何か)出力にはさらにオプションがあります。データベースコンテンツのサニタイズ/エスケープについては this questionをご覧ください。

Postgresへの保存に関しては、クエリ内の各変数で pg_escape_string を使用して、引用符をエスケープし、一般的にSQLインジェクションから保護します。

編集:

データベースにデータを保存してから取得するための私の通常の手順は次のとおりです。

  1. データベースデータエスケープ関数(pg_escape_string、mysql_escape_stringなど)を呼び出して、クエリで使用される各着信$ _GET変数をエスケープします。 addslashesの代わりにこれらの関数を使用すると、データベースに保存されるときにテキストに余分なスラッシュが含まれないことに注意してください。

  2. データベースからデータを取り戻す場合、余分なスラッシュはないはずなので、出力されたデータにhtmlspecialcharsを使用するだけで、ストリップスラッシュを使用する必要はありません。

5
Kazar

POST= GETとしてだけでなく、すべてのリクエストをサニタイズする必要があります。

関数 htmlentities() 、regexを使用した関数preg_replace()、またはキャストによるフィルターを使用できます。

<?
$id = (int)$_GET['id'];
?>

[]の

3
fvox

入力に応じて入力をサニタイズします。

  • (ページ上または入力フィールドの値として)表示する場合は、htmlspecialcharsおよび/または_str_replace_を使用します。
  • 別のタイプとして使用する場合は、キャストしてください。
  • SQLクエリに含める場合は、適切な関数を使用してエスケープします。HTMLタグを完全に削除する場合は、HTMLタグを削除します(エスケープとは異なります)。

POSTまたはDBのデータでさえも同じです。DB内のデータは一般にエスケープされるべきではないためです。

確認すべき2つのこと:

  1. 入力とあなたのPHPスクリプト/出力/ DBテーブルのエンコード
  2. _[magic_quotes_gpc][1]_が有効になっている場合は、無効にするか(可能な場合)またはstripslashes() GET、POSTおよびCOOKIE値。_magic_quotes_gpc_は非推奨です。そのデータのseに応じて、操作するデータをサニタイズする必要があります。
2
instanceof me