Mysqlデータベースへの入力をサニタイズする汎用関数をまとめようとしています。これまでのところ、これは私が持っているものです:
_function sanitize($input){
if(get_magic_quotes_qpc($input)){
$input = trim($input); // get rid of white space left and right
$input = htmlentities($input); // convert symbols to html entities
return $input;
} else {
$input = htmlentities($input); // convert symbols to html entities
$input = addslashes($input); // server doesn't add slashes, so we will add them to escape ',",\,NULL
$input = mysql_real_escape_string($input); // escapes \x00, \n, \r, \, ', " and \x1a
return $input;
}
}
_
get_magic_quotes_qpc()
の定義を理解できたら。これはaddslashes()
を使用する必要がなく、自動的に文字をエスケープするようにphpサーバーによって設定されます。
addslashes()
とmysql_real_escape_string()
を一緒に正しく使用したことがありますか?サニタイズを向上させるために他に追加できることはありますか?.
ありがとう
sQLでデータを安全にするためにhtmlentities()は不要です。 XSSの脆弱性を回避するために、データ値をHTML出力にエコーするときに使用されます。これは、注意が必要な重要なセキュリティ問題でもありますが、SQLとは関係ありません。
addlashes()はmysql_real_escape_stringと冗長です。データベース内の文字列にリテラルバックスラッシュが含まれることになります。
マジッククオートを使用しないでください。この機能は長年にわたって非推奨になっています。 PHPコードをマジッククオートが有効になっている環境にデプロイしないでください。有効になっている場合はオフにしてください。ホストされている環境で、マジッククオートがオフにならない場合は、新しいコードを取得してください。ホスティングプロバイダー。
ext/mysql
は使用しないでください。クエリパラメータ、トランザクション、またはOOの使用法はサポートしていません。
[〜#〜] pdo [〜#〜] を使用し、 準備されたクエリ を使用してクエリをより安全にします。
安全なSQLの記述の詳細については、私のプレゼンテーション SQLインジェクションの神話と誤謬 を参照してください。
マジッククオートは 非推奨 です。可能であればオフにしてください:)。
2番目の部分addslashes
とmysql_real_escape_String
は、ほとんど同じ(類似した)ことを行います。ちょうど試して
addslashes( '\\')
// and
mysql_real_escape_string( '\\')
結果は\\
になるはずなので、使用する場合
mysql_real_escape_string( addslashes( '\\'))
\\
(または'\\\\'
を文字列として)を取得する必要があります。 mysql_real_escape_string
(より良い)OR addslashes
のみを使用し、両方は使用しないでください。
生の関数や手動エスケープの代わりに、 [〜#〜] pdo [〜#〜] を使用することをお勧めします。
データをデータベースに保存する前にHTMLエンティティを適用する理由は何ですか?データをブラウザに書き込む以外の目的で使用したい場合はどうでしょうか?たとえば、検索、データの分割、他のプログラミング言語でのデータの使用などのために...
本当に適用したいのは、mysql_real_escape_string(または [〜#〜] pdo [〜#〜] を使用すること)だけです。
私は通常、常にマジッククオートの効果を完全に取り消すことを好みます。マジッククオートは、扱いにくく、発明されるべきではありませんでした。マジッククオートを逆にする PHPマニュアル のスニペットを次に示します。
if (get_magic_quotes_gpc()) {
$process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
while (list($key, $val) = each($process)) {
foreach ($val as $k => $v) {
unset($process[$key][$k]);
if (is_array($v)) {
$process[$key][stripslashes($k)] = $v;
$process[] = &$process[$key][stripslashes($k)];
} else {
$process[$key][stripslashes($k)] = stripslashes($v);
}
}
}
unset($process);
}
スラッシュを追加する最悪の部分は、どの関数が使用されても、何も消毒しません。
そして、いかなる「消毒」の手段にも使用すべきではありません。
スラッシュはデータを「サニタイズ」しません。スラッシュはエスケープストリング区切り文字のみを実行します。したがって、あなたが話すことができる唯一のサニタイズは、エスケープと引用です。
それ以外の場合、「サニタイズされた」文字列を引用符で囲まないと、まったく保護されません。