我曾经mysql_real_escape_string()
在将数据插入数据库时对其进行清理,从数据库中检索数据时可以再次使用它吗?
3 回答
任何时候都不好用。MySQL 扩展已被弃用。请改用 PDO 或 MySQLi。
在查询中使用数据时,出于清理目的使用参数绑定而不是字符串操作。
您无需在检索时清理数据。如果您在 HTML 页面中显示数据,请改用htmlspecialchars()
orhtmlentities()
函数。
更新
解释一下,您不应该在其中存储带有转义字符的数据。最好的方法是在不修改的情况下存储接收到的数据(这是在存储之前用于过滤输入的任何验证之外的)。
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)
{ // ...
您要在检索时进行消毒的原因是大多数注射都发生在这里。一年前 Facebook 的一个用户黑客攻击的一个例子——他向浏览器提交了一个 mysql_query 检索以获取另一个用户的数据。并在管理员的程序中结束。