2

mysql_real_escape_string()データベースに挿入するときにデータをサニタイズするために使用しましたが、データベースからデータを取得するときに再度使用しても大丈夫ですか?

4

3 に答える 3

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>
于 2013-02-06T23:54:21.223 に答える
2

いいえmysql_real_escape_string()(より新しいバージョンです) は、データベースから取得mysqli::real_escape_string()したデータには使用しないでください。

データベースに挿入するためにデータをエスケープする唯一の理由は、別の言語である SQL で文字列データとしてアセンブルしているためです。それが逃げる目的です。すべての要素を個別のパラメーターとして提供する API 呼び出しがあった場合、データをエスケープする必要はありません。しかし、それは SQL の仕組みではありません。

(同様に、stripslashes()PHP インスタンスでマジック クォートをオフにできない場合にのみ必要です。)

于 2013-02-07T00:06:02.503 に答える
-2

はい、いつも。

    $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 取得をブラウザーに送信して、別のユーザーのデータを取得しました。そして、管理者のプログラムの中に巻き込まれました。

于 2013-02-06T23:59:47.570 に答える