【问题标题】:mysql_real_escape_string during retrieval [duplicate]检索期间的mysql_real_escape_string [重复]
【发布时间】:2013-01-22 08:43:21
【问题描述】:

我在将数据插入数据库时​​使用mysql_real_escape_string() 对数据进行清理,从数据库中检索数据时是否可以再次使用它?

【问题讨论】:

  • 如果您尝试反转转义以进行显示,请尝试stripslashes()
  • 这是否意味着如果我存储类似 //name> 的内容,它将作为名称返回?
  • @showdev stripslashes() 仅在您无法在 PHP 实例中关闭魔术引号时才需要用于表单的输入数据。
  • 你做错了!你不应该使用ext/mysql。而是使用 PDO 或 mysqli。
  • @staticsan 不完全正确——还有其他用途。我过去曾使用 stripslashes() (使用旧的 mysql_* 代码)来删除从数据库中提取的数据中的转义。否则可以用斜线显示。

标签: php mysql


【解决方案1】:

任何时候都不能使用。 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>

【讨论】:

  • Arrrggghhh stripslashes() 的建议让我的眼睛受伤了!
  • 哇,有用的信息谢谢,它确实有帮助
  • 好建议,菲尔。我的建议假设(正如 OP 建议的那样)mysql_real_escape_string() 已经被使用。 stripslashes 不折旧...
  • @showdev 我从未说过 stripslashes() 已被弃用。在任何情况下,它的唯一用途是撤消魔术引号(无论如何都不应该启用)或反转addslashes()。根本不应该在查询参数周围使用它
  • @Phil 我相信 OP 是在询问从数据库中转义数据的问题。使用哪个函数进行转义是次要问题。
【解决方案2】:

mysql_real_escape_string()(它是更现代的版本mysqli::real_escape_string())不应用于从数据库检索的数据。

insertion 的数据转义到数据库中的唯一原因是因为您将其组装为另一种语言的字符串数据:SQL。这就是逃跑的目的。如果有一个 API 调用,您将所有元素作为离散参数提供,则不需要转义数据。但这不是 SQL 的工作原理。

(同样,stripslashes() 仅在您无法在 PHP 实例中关闭魔术引号时才需要。)

【讨论】:

  • 如果您无法关闭魔术引号,请将您的应用程序托管在其他地方。戴上它是疯了。
【解决方案3】:

总是这样。

    $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 检索以获取另一个用户的数据。并在管理员的程序中结束。

【讨论】:

  • mysql_* 函数不应以任何理由在任何新代码中使用。
  • md5'd 密码不应以任何理由在任何新代码中使用。
  • @showdev,不,bcrypt 由crypt$2y$ 模式下提供,成本很高。
  • @user1938257,没有。验证和过滤输入。插入时的 SQL 转义。输出上的可选转义取决于您如何进行过滤。 See previous answer.
  • 你对 anyall 的事情执行 SQL escaping 进入查询。您对 HTML 上下文中呈现的任何内容进行 HTML 转义。您不要使用 SQL 转义函数,除非您将数据放入数据库。时期。您在此处使用 stripslashes 表明此代码仅适用于鲁莽错误配置的 PHP 环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
  • 2013-01-24
相关资源
最近更新 更多