mysql_real_escape_string()
データベースに挿入するときにデータをサニタイズするために使用しましたが、データベースからデータを取得するときに再度使用しても大丈夫ですか?
3 に答える
いつでも使えるわけではありません。MySQL 拡張機能は廃止されました。代わりに PDO または MySQLi を使用してください。
クエリでデータを使用する場合は、サニタイズのために文字列操作の代わりにパラメーター バインディングを使用します。
取得時にデータをサニタイズする必要はありません。HTML ページにデータを表示している場合は、代わりにhtmlspecialchars()
またはhtmlentities()
関数を使用します。
アップデート
説明すると、エスケープ文字を含むデータを保存するべきではありません。最善の方法は、データを変更せずに受信したまま保存することです (これは、保存する前に入力をフィルター処理するために使用する検証の外部にあります)。
PDO と MySQLi は両方とも、揮発性データを格納する最も安全な方法であるパラメータ バインディングをサポートします (PDO)。
$stmt = $pdo->prepare('INSERT INTO tableName VALUES (:param1, :param2)');
$stmt->bindParam('param1', $var1);
$stmt->bindParam('param2', $var2);
$stmt->execute();
取得すると、データが入ったままになるので、再度変更する必要はありません。
このデータを HTML ページに安全に表示するには、上記のエンコーディング関数のいずれかを使用します。
$stmt = $pdo->prepare('SELECT name FROM tableName');
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_ASSOC);
?>
<p>Hello, <?= htmlspecialchars($row['name']) ?></p>
いいえ、mysql_real_escape_string()
(より新しいバージョンです) は、データベースから取得mysqli::real_escape_string()
したデータには使用しないでください。
データベースに挿入するためにデータをエスケープする唯一の理由は、別の言語である SQL で文字列データとしてアセンブルしているためです。それが逃げる目的です。すべての要素を個別のパラメーターとして提供する API 呼び出しがあった場合、データをエスケープする必要はありません。しかし、それは SQL の仕組みではありません。
(同様に、stripslashes()
PHP インスタンスでマジック クォートをオフにできない場合にのみ必要です。)
はい、いつも。
$username = stripslashes($_POST['username']);
$username = mysql_real_escape_string($_POST['username']);
$password = mysql_real_escape_string(md5($_POST['password']));//with md5
And retrieve----
$req = mysql_query('select password,id from users where username="'.$username.'"');
$dn = mysql_fetch_array($req);
if($dn['password']==md5($password) and mysql_num_rows($req)>0)
{ // ...
検索時にサニタイズする理由は、ほとんどの注射がここで行われるからです。1 年前のユーザーからの Facebook のハッキングがその好例です。彼は mysql_query 取得をブラウザーに送信して、別のユーザーのデータを取得しました。そして、管理者のプログラムの中に巻き込まれました。