【问题标题】:When should you escape strings used in MySQL什么时候应该转义 MySQL 中使用的字符串
【发布时间】:2014-06-10 11:54:32
【问题描述】:

我对 PHP 还很陌生,但对 StackOverflow 已经熟悉了一段时间。

我最近一直在阅读有关使用 mysql_real_escape_string 的适当时间的信息,希望对以下内容提出任何建议。

在初始 $_POST 变量上使用一次 mysql_real_escape_string 是否足以通过脚本保护字符串?

例如:

$username = mysql_real_escape_string($_POST["username"]);
$password = mysql_real_escape_string($_POST["password"]);
$email = mysql_real_escape_string($_POST["email"]);
$repeat_password = mysql_real_escape_string($_POST["repeat_password"]);

我在运行一堆 if 语句之前声明这些值,最后在 if 语句完成后,我将 INSERT 插入到 mysql 数据库中:

mysql_query("INSERT INTO users (username, password, email, signup_date) VALUES ('$username', '$password', '$email', CURDATE())") or die(mysql_error());

mysql_real_escape_string 在 if 语句的其他任何地方都没有使用 - 这对于新手来说是否足够安全,同时仍然保持一些注入保护?

【问题讨论】:

  • mysql_real_escape_string 用于转义文本字符串
  • 你应该切换到 pdo
  • 嗯。我的印象是我对它的作用有一个不错的了解——我想我需要继续我的学业!
  • 您不应该存储密码。如果无法避免,请使用大的随机盐对其进行加盐,然后使用没有大彩虹表可用的体面算法对其进行散列。
  • 很好,您知道注射。但是为什么canonical question 不回答您的问题?

标签: php mysql mysql-real-escape-string


【解决方案1】:

虽然 mysql_real_escape_string() 可能(当前)保护您免受 SQL 注入,但它已弃用,所以无论如何您都不应该使用 mysql_* 函数,但在未来的 PHP 版本中,它将被删除,从而使您的代码无用。

既然你有一辆闪亮的新兰博基尼的钥匙,为什么还要开一辆破旧的福特嘉年华?

Don't use mysql_* functions in new code。它们不再维护and are officially deprecated。看到red box?改为了解 prepared statements,并使用 PDOMySQLi - this article 将帮助您决定哪个。如果你选择 PDO,here is a good tutorial

【讨论】:

【解决方案2】:

尝试准备好的语句:

$stmt = $con->prepare("INSERT INTO users (`username`, `password`, `email`, `signup_date`) VALUES (?, ?, ?, ?)");
$stmt->bind_param($username,$password,$email,CURDATE());
$stmt->execute();
$stmt->close();

【讨论】:

  • 注意 $con 需要是一个字符串来连接你的 mysql 服务器。
【解决方案3】:

不,这不安全。你应该切换到prepared statements

【讨论】:

  • 虽然我同意准备好的陈述更好,但你能举一个例子说明他的例子可能会失败吗?
  • 除了 mysqli / pdo 背书,@user3570991 不应以纯文本形式存储密码。
  • 我知道密码加密 - 在我继续了解有关 php 的更多信息之前,我只是想了解这个基本脚本的更深入的保护
猜你喜欢
  • 2013-04-24
  • 2012-08-20
  • 1970-01-01
  • 2023-04-02
  • 2011-04-15
  • 2017-04-10
  • 2012-03-19
  • 2018-05-12
  • 2018-12-11
相关资源
最近更新 更多