web-dev-qa-db-ja.com

究極のクリーン/セキュア機能

_$_GET_および_$_POST_から多くのユーザー入力があります...現時点では、常にmysql_real_escape_string($_GET['var']) ..

_$_GET_/_$_POST_配列をすぐに保護、エスケープ、消去する関数を作成できるかどうかを知りたいので、ユーザーを操作するたびに処理する必要はありません入力など。

例えばcleanMe($input)などの関数を考えていましたが、その内部では_mysql_real_escape_string_、htmlspecialchars、_strip_tags_、stripslashes(Iそれがきれいで安全なものになると思います)、_$input_を返します。

これは可能ですか?すべての_$_GET_および_$_POST_で機能する関数を作成するため、これのみを実行します。

_$_GET  = cleanMe($_GET);
$_POST = cleanMe($_POST);
_

では、後のコードで、例えば_$_GET['blabla']_または_$_POST['haha']_を操作するとき、それらは保護されたり、取り除かれたりしますか?

少し試してみました:

_function cleanMe($input) {
   $input = mysql_real_escape_string($input);
   $input = htmlspecialchars($input, ENT_IGNORE, 'utf-8');
   $input = strip_tags($input);
   $input = stripslashes($input);
   return $input;
}
_
56
Karem

一般的な衛生機能の概念は壊れた概念です。

oneあらゆる目的のための正しい衛生方法があります。それらをすべて文字列で無差別に実行すると、多くの場合それが壊れます-SQLクエリのHTMLコードの一部をエスケープすると、Webページで使用するために壊れます。衛生は、データを使用して直前に適用する必要があります。

「すべてに合う」サイズの衛生機能を使用することは、定義上1種類のバグしか含まない5種類の毒性の高い殺虫剤を植物に使用するようなものです。殺虫剤の働き。

データを関数に渡す前に、常に正しい方法を使用してください。 Never必要でない限り、メソッドを混在させないでください。

125
Pekka 웃

これらのすべての関数に入力を渡すだけでは意味がありません。これらの機能はすべて異なる意味を持っています。より多くのエスケープ関数を呼び出しても、データは「クリーン」になりません。

ユーザー入力をMySQLに保存する場合は、mysql_real_escape_stringのみを使用する必要があります。その後、完全にエスケープされて、データベースに安全に保存されます。

[〜#〜] edit [〜#〜]

また、他の機能を使用すると発生する問題にも注意してください。クライアントがたとえばサーバーにユーザー名を送信し、ユーザー名にアンパサンド(&)が含まれている場合、データベースに保存する前にhtmlentitiesを呼び出したくないデータベースには&が含まれます。

7
Tomas

探しているのは filter_input_array() です。ただし、これはビジネススタイルの検証/サニタイズにのみ使用し、SQL入力フィルタリングには使用しないことをお勧めします。

SQLインジェクションから保護するには、 mysqli または [〜#〜] pdo [〜#〜] でパラメーター化されたクエリを使用します。

6
Alan Pearce

問題は、ある用途ではクリーンまたは安全なものであっても、別の用途ではありません:パスの一部、mysqlクエリの一部、html出力(html、またはjavascriptまたは入力値)のクリーニング、 for xmlは矛盾するさまざまなものを必要とする場合があります。

しかし、いくつかのグローバルなことができます。 filter_input を使用して、ユーザーの入力を取得してください。また、SQLクエリには 準備済みステートメント を使用します。

ただし、do-it-all関数の代わりに、入力を管理するクラスを作成できます。そんな感じ :

class inputManager{
  static function toHTML($field){
    $data = filter_input(INPUT_GET, $field, FILTER_SANITIZE_SPECIAL_CHARS);
    return $data;
  }
  static function toSQL($field, $dbType = 'mysql'){
    $data = filter_input(INPUT_GET, $field);
    if($dbType == 'mysql'){
      return mysql_real_escape_string($data);
    }
  }
}

この種のことで、コードに$ _POST、$ GET、$ _ REQUEST、または$ _COOKIEが表示された場合、変更する必要があることがわかります。また、ある日、入力のフィルタリング方法を変更する必要がある場合は、作成したクラスを変更するだけです。

3
Arkh

Apacheを使用していて、サーバーに完全にアクセスできる場合は、「mod_security」をインストールすることをお勧めしますか?!
それは私の問題のほとんどを解決しました。ただし、1つまたは2つのソリューションに頼るのではなく、常に安全なコードを記述してください;)
更新 これを見つけたPHP IDS(http://php-ids.org/);ニースらしい:)

1
<?php
function sanitizeString($var)
{
    $var = stripslashes($var);
    $var = strip_tags($var);
    $var = htmlentities($var);
    return $var;
}

function sanitizeMySQL($connection, $var)
{
    $var = $connection->real_escape_string($var);
    $var = sanitizeString($var);
    return $var;
}
?>
0
vuchkov