【问题标题】:How does SQL-injection work and how do I protect against it [duplicate]SQL注入如何工作以及如何防止它[重复]
【发布时间】:2011-08-08 23:18:36
【问题描述】:

可能重复:
What is SQL injection?

我看到很多 php 代码在 stackoverflow 上浮动,并且(也)很少有字符串转义。

任何人都可以

  1. 解释什么是 SQL 注入;
  2. 解释它可以对您的服务器、数据和代码做什么;
  3. 举例说明如何执行 SQL 注入
  4. 给出php示例代码如何防止SQL注入

【问题讨论】:

标签: php mysql sql-injection protection


【解决方案1】:

我忍不住发布这个。

1- 一个 cartoon 比大多数其他文档更好地解释了 Sql Injection。

2- 大多数情况下,它对服务器没有多大作用,而仅对底层数据有作用。结果包括删除、插入、选择记录、删除、创建表。 (基于权限等)

3-Examples.

4- 抱歉,我不懂 PHP。但只要您可以从 View 中抽象出您的 DB 层,就应该没问题。

【讨论】:

  • 对不起,如果答案过于简洁..
【解决方案2】:

SQL 注入是一种恶意形成的 SQL 查询,用于“混淆”SQL 数据库,使其提供不应提供的信息。例如,考虑以下查询

"SELECT * FROM `users` WHERE `username` = '$name'";

在正常情况下,这将起作用。如果我们向此提交“Jack”,它将返回所有名为 Jack 的用户。但是,如果用户输入“' OR 1=1”,则结果查询将是

"SELECT * FROM `users` WHERE `username` = '' OR 1=1";

由于 1 始终等于 1,并且组合子句为 OR,这将在每一行上返回 true,进而将每一行显示给恶意用户。使用这种技术,某人可以查看您的整个数据库。还要考虑是否有人提交类似 "'; DROP TABLE users";-- 的内容,这会导致

"SELECT * FROM `users` WHERE `username` = ''; DROP TABLE `users`";--";

这是两个查询,一个什么都不做,第二个将删除整个用户数据库,导致您的数据丢失。

防止 SQL 注入的最佳方法是使用预准备语句。使用这些,您可以向 SQL 数据库发送一个查询,内容类似于

"SELECT * FROM `users` WHERE `username` = '?'";

这让数据库知道查询的格式(WHERE 用户名等于某个值),因此在给定纯文本查询时不会混淆。然后数据库知道期望一个值,以及把它放在哪里。然后将该值传递给可用于搜索的数据库。这也更好,因为数据库可以优化查询以加快搜索速度。

阅读准备好的陈述,这将更详细地解释这一点。

【讨论】:

  • 只有你的回答让我清楚地了解了SQL注入。谢谢!
【解决方案3】:

很多关于这个主题的信息(以及这里的其他地方),所以不要以任何方式将此答案作为完整列表,并继续自行研究...

  1. 解释什么是 SQL 注入;
  2. 解释它可以对您的服务器、数据和代码做什么;
  3. 举例说明如何执行 SQL 注入
  4. 给出php示例代码如何防止SQL注入
  1. SQL 注入是攻击者发现提供给您的应用程序的输入值被直接发送到数据库并意识到他们可以将该输入作为自定义 SQL 命令的地方。可能很简单,例如在文本字段中输入特殊字符(例如 %)并收到奇怪的响应。

  2. 它可以执行您的数据库允许该命令执行的任何操作。例如,如果您的 Web 应用程序对应用程序的数据库具有 DB 所有者权限,那么攻击可能会删除表甚至删除整个数据库。或者,即使是普通的应用程序权限,攻击也可以覆盖数据或读取敏感数据(例如,如果您有纯文本密码)。

  3. 例如,如果应用程序有一个文本字段,您可以在其中输入用户名。如果该字段对 SQL 注入开放,则攻击者可以输入如下内容:MyName';DROP TABLE Users;-- 在此示例中,攻击者手动完成使用右单引号和分号的查询,然后添加另一个查询,然后再删除任何内容。如果没有对此进行保护,数据库可能会同时运行这两个查询。

  4. 这个我不知道更新了足够的信息,但是那里有 很多 :)

【讨论】:

    【解决方案4】:

    我也无法抗拒。

    SQL 注入是“一种利用应用程序数据库层中出现的安全漏洞的代码注入技术”。换句话说,它是在查询中作为用户输入注入的 SQL 代码。

    SQL 注入可以操纵数据(删除、更新、添加 ecc...)并破坏或删除数据库的表。不过,我不知道 SQL 注入会操纵脚本。

    假设在您的 PHP 脚本中,您期望(作为用户输入)登录表单中的用户名和密码,稍后在查询中使用,例如:

    SELECT Id FROM Users WHERE Name = $name AND Password = $password;
    

    用户可以在$name$password 中插入他喜欢的任何内容(例如通过<input>)。假设他添加了一个名称,例如“1 OR 1 = 1; --”,查询现在看起来像:

    SELECT Id FROM Users WHERE Name = 1 OR 1 = 1; -- AND Password = $password;
    

    然后,在; 之后,我可以添加另一个查询或让脚本认为用户名和密码确实存在。

    请注意,-- AND Password = $password; 是一条 SQL 注释,因此将被忽略。

    如果您使用的是 PHP mysql_real_escape_string() 并在将其嵌入查询之前使用它来转义用户输入。

    如果您使用的是 PHP5+,则应使用 PDOmysqli 扩展名,这可以通过准备好的语句来防止此问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-07
      • 2021-12-02
      • 2017-11-22
      • 2011-06-21
      • 2011-10-02
      • 2012-03-07
      相关资源
      最近更新 更多