php - SQL注入(inject)保护

标签 php mysql sql sql-injection

我想我会就一个选项征求您的意见,我认为这会从根本上消除 SQL 注入(inject)的可能性(我认为)。

目前,我有我的管理员帐户,显然可以让我完全控制数据库(更改、删除等)。我有一个 PHP 使用的帐户,它只能访问 SELECT、UPDATE、DELETE、INSERT。为每个操作设置一个用户,然后只在 mysql_query 语句中引用连接 ID - 现在显然这会给服务器带来更多压力,基本上每个页面必须建立 4 个连接,但如果它安全重要的是,在我看来,这将是一个有效的选项,方法是将命令限制为您希望在这种情况下执行的 EXACT 功能。对此选项的可行性有何想法​​?

更新:正如我之前没有提到的,这不是防止 SQL 注入(inject)、mysql_real_escape_string()、准备好的语句等的唯一障碍。但我只是在想,如果通过某种方式,所有这些都失败了,会不会这至少限制了他们可以造成的破坏? (例如,在注册表单上,他们将无法选择哈希值或删除条目)。

最佳答案

不是 SQL 注入(inject)的全部内容。任何时候您在 SQL 查询中使用未经清理的参数,您都会让您的数据库对 SQL 注入(inject)开放,这不一定具有破坏数据的目标。也可能是窃取数据或获得未经授权的访问。

考虑一个非常受限的帐户,它所能做的就是SELECT。您编写一个身份验证查询:

$sql = "SELECT COUNT(*) AS count
          FROM users 
         WHERE user_id='{$_POST['user']}' AND pass='{$_POST['password'}'";

// check if returns a count of 1, if yes, log in

对于正常输入,您希望查询看起来像:

SELECT COUNT(*) AS count
  FROM users 
 WHERE user_id = 'username' AND pass='********'

如果用户名和通行证都匹配,应该返回 1 作为计数。现在攻击者试图以管理员身份登录。由于您还没有清理您的输入,他们发送 $_POST['user'] 作为:admin'; --。整个查询变为:

SELECT COUNT(*) AS count
  FROM users 
 WHERE user_id = 'admin'; -- AND pass='********'

-- 之后的所有内容都是注释,因此忽略其他条件并无论如何返回 1。好了,您刚刚授予了恶意用户管理员访问权限。这就是一些真正的攻击是如何进行的。您从一个低权限帐户开始,然后通过安全漏洞尝试获得更多权限。


长话短说,拥有一个权限受限的应用程序范围的帐户(例如:没有DROPALTER 等)很好。永远不要给任何人或任何应用程序超过他们需要的特权。但要防止 SQL 注入(inject),请使用 prepared statements .

关于php - SQL注入(inject)保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7343451/

相关文章:

php - 如何在 MySQL 的日期时间字段中存储 NULL 值?

php - 包括我自己的 mb_string 函数还是使用 PHP 的默认值?

php - 自动缩小和缓存CSS

Mysql查询连续数据

sql - 选择特定日期的行的方法?

php - 我可以在 PHP 中混合 MySQL API 吗?

mysql - 遍历 Nodejs MySQL 结果集中的字段

MySQL:将字段命名为 madeupfield 并在该字段上执行 WHERE

sql - 如何在一个 oracle 表中查找多个对

mysql - SQL 仅选择列上具有最大值的行