检索过程中的mysql_real_sescape_string


mysql_real_escape_string during retrieval

我在将数据插入数据库时使用了mysql_real_escape_string()来清除数据,在从数据库检索数据时可以再次使用它吗?

在任何时候都不能使用它。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不是这样工作的。

(类似地,只有当您不能在PHP实例中关闭魔术引号时,才需要stripslashes()。)

始终是。

    $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)
{ // ...

你想在取回时消毒的原因是大多数注射都发生在这里。一年前一位用户对Facebook的黑客攻击就是一个很好的例子——他向浏览器提交了一个mysql_query检索,以获取其他用户的数据。最后进入了管理员的程序。