_$_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;
}
_
一般的な衛生機能の概念は壊れた概念です。
oneあらゆる目的のための正しい衛生方法があります。それらをすべて文字列で無差別に実行すると、多くの場合それが壊れます-SQLクエリのHTMLコードの一部をエスケープすると、Webページで使用するために壊れます。衛生は、データを使用して直前に適用する必要があります。
データベースクエリを実行する前。適切な衛生方法は、使用するライブラリによって異なります。 PHPでSQLインジェクションを防ぐにはどうすればよいですか
htmlspecialchars()
安全なHTML出力用
preg_quote()
正規表現で使用するため
escapeshellarg()
/escapeshellcmd()
外部コマンドで使用するため
などなど.
「すべてに合う」サイズの衛生機能を使用することは、定義上1種類のバグしか含まない5種類の毒性の高い殺虫剤を植物に使用するようなものです。殺虫剤の働き。
データを関数に渡す前に、常に正しい方法を使用してください。 Never必要でない限り、メソッドを混在させないでください。
これらのすべての関数に入力を渡すだけでは意味がありません。これらの機能はすべて異なる意味を持っています。より多くのエスケープ関数を呼び出しても、データは「クリーン」になりません。
ユーザー入力をMySQLに保存する場合は、mysql_real_escape_string
のみを使用する必要があります。その後、完全にエスケープされて、データベースに安全に保存されます。
[〜#〜] edit [〜#〜]
また、他の機能を使用すると発生する問題にも注意してください。クライアントがたとえばサーバーにユーザー名を送信し、ユーザー名にアンパサンド(&
)が含まれている場合、データベースに保存する前にhtmlentities
を呼び出したくないデータベースには&
が含まれます。
探しているのは filter_input_array()
です。ただし、これはビジネススタイルの検証/サニタイズにのみ使用し、SQL入力フィルタリングには使用しないことをお勧めします。
SQLインジェクションから保護するには、 mysqli または [〜#〜] pdo [〜#〜] でパラメーター化されたクエリを使用します。
問題は、ある用途ではクリーンまたは安全なものであっても、別の用途ではありません:パスの一部、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が表示された場合、変更する必要があることがわかります。また、ある日、入力のフィルタリング方法を変更する必要がある場合は、作成したクラスを変更するだけです。
Apacheを使用していて、サーバーに完全にアクセスできる場合は、「mod_security」をインストールすることをお勧めしますか?!
それは私の問題のほとんどを解決しました。ただし、1つまたは2つのソリューションに頼るのではなく、常に安全なコードを記述してください;)
更新 これを見つけたPHP IDS(http://php-ids.org/);ニースらしい:)
<?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;
}
?>