我在将数据插入数据库时使用mysql_real_escape_string()
来清理数据,从数据库中检索数据时是否可以再次使用它?
答案 0 :(得分: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>
答案 1 :(得分:2)
否,mysql_real_escape_string()
(并且它更现代的版本mysqli::real_escape_string()
)不应该用于数据库中检索的数据。
将插入的数据转义到数据库中的唯一原因是因为您将其组装为另一种语言的字符串数据:SQL。这是逃避的目的。如果存在API调用,其中您将所有元素作为离散参数提供,则无需转义数据。但这不是SQL的工作原理。
(同样,只有在PHP实例中无法关闭魔术引号时才需要stripslashes()
。)
答案 2 :(得分:-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)
{ // ...
您希望对检索进行清理的原因是大多数注射都发生在这里。例如Facebook一年前来自用户的黑客攻击 - 他向浏览器提交了一个mysql_query检索以获取另一个用户数据。然后在管理员的程序中结束。