したがって、通常はフォームからデータを収集し、データベースに挿入します。
脅威を排除するために使用されることは知っていmysql_real_escape_string()
ますが、$_POST を受け取り、それを処理してデータベースを安全に使用できるようにするメカニズムを提供したいと考えています。
これを達成するための理想的でエレガントな方法は何でしょうか? 配列を安全にするのに十分な投稿配列を単にリーフするだけですか?
したがって、通常はフォームからデータを収集し、データベースに挿入します。
脅威を排除するために使用されることは知っていmysql_real_escape_string()
ますが、$_POST を受け取り、それを処理してデータベースを安全に使用できるようにするメカニズムを提供したいと考えています。
これを達成するための理想的でエレガントな方法は何でしょうか? 配列を安全にするのに十分な投稿配列を単にリーフするだけですか?
何かが文字列でなければならないことがわかっている場合もあれば、整数でなければならないことがわかっている場合もあります。メールアドレスでなければならないことがわかっている場合もあれば、4 文字の長さの文字列でなければならないことがわかっている場合もあります。
もちろん、mysql 拡張機能は非推奨であり、しばらく前から使用されていました。PHPのドキュメントには次のように書かれています:
この拡張機能は、新しいコードの作成にはお勧めできません。代わりに、mysqli または PDO_MySQL 拡張機能を使用する必要があります。MySQL API を選択する際のさらなるヘルプについては、MySQL API の概要も参照してください。
PDO は、PHP で MYSQL を使用する「正しい」方法です。何らかの理由でそれがうまくいかない場合は、mysqli を使用してください。ただし、PDO を使用してください。
ドキュメントから:
<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
FROM fruit
WHERE calories < :calories AND colour = :colour');
$sth->bindValue(':calories', $calories, PDO::PARAM_INT);
$sth->bindValue(':colour', $colour, PDO::PARAM_STR);
$sth->execute();
?>
カロリーは整数で、色は文字列であることに注意してください。これは、物事を処理するためのはるかに優れた方法です。
これと組み合わせてfilter_var
、物事の安全を確保できます。
http://www.php.net/manual/en/filter.filters.sanitize.phpおよびhttp://www.php.net/manual/en/filter.filters.validate.phpでは、利用可能なさまざまなフィルターについて説明しています。
mysqli_real_escape_string と array_map を使用する
$_POST = array_map('mysqli_real_escape_string', $_POST);
すべてのクエリ文字列変数に対して同じことをしたい場合は、次のようにします。
$_GET = array_map('mysqli_real_escape_string', $_GET);
私はこの2つの機能を使用します:
function getMySQLString($string) {
global $link;
/* Si esta activaldo el magic quotes, saco los caracteres de escape */
if (get_magic_quotes_gpc()) {
$string = stripslashes($string);
}
/* Armo el string. */
return mysqli_real_escape_string($link, $string);
}
function toSecureArray($array) {
$result = Array();
/* Recorro todas las llaves del campo */
$keys = array_keys($array);
foreach ($keys as $key_id => $value) {
if (!is_array($array[$value]))
$result[$value] = getMySQLString($array[$value]);
}
return $result;
}
「toSecureArray」は再帰的ではありません。改善できます。:)