RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1610619
Accepted
Alexandr_TT
Alexandr_TT
Asked:2025-04-21 12:42:09 +0000 UTC2025-04-21 12:42:09 +0000 UTC 2025-04-21 12:42:09 +0000 UTC

什么是 SQL 注入?

  • 772

我在 EnSO 版主Dharman的个人资料中看到了以下警告:

在此处输入图片描述

免费翻译:

警告:

您对 SQL 注入的威胁非常大,应该使用参数化的准备好的语句,而不是手动构建查询。它们由 PDO 或 MySQLi 提供。永远不要相信任何输入数据!即使您的请求仅由受信任的用户提出,您仍然有可能损坏您的数据。屏蔽还不够!

如果版主认为在他的个人资料中发布这个警告很重要,以便尽可能多的人可以看到它,那么我自然会对SQL 注入到底是什么样的怪物以及与之相关的一切问题感兴趣:

来自MySQLi标签描述

PHP 编程语言中使用的关系数据库驱动程序的扩展,用于提供对 MySQL 数据库的访问。 MySQLi 是 PHP MySQL 驱动程序的更新版本,并在数据库处理方面提供了各种改进。

我希望得到更详细的答复。

如何实施保护,最好有例子并附上简短的解释性评论。

база-данных
  • 1 1 个回答
  • 108 Views

1 个回答

  • Voted
  1. Best Answer
    kattyflanker
    2025-04-21T14:09:37Z2025-04-21T14:09:37Z

    SQL 注入是一种常见的黑客技术,黑客只需输入一个棘手的字符串而不是正常文本,就可以将任何内容插入到数据库中。
    当您信任用户输入并将其直接粘贴到数据库查询中时,就会发生这种情况。这可能导致数据丢失,甚至被黑客完全控制。
    为了保护自己,您需要使用准备好的查询:这是一种告诉数据库的方法:“这是查询的结构,这是单独的数据。”这样,即使有人试图输入一些有害的内容,它也会被视为普通文本,而不是整个命令。手动屏蔽在这里没有帮助,因为这就像用胶带封住门而不是锁上它。

    让我以 Minecraft 服务器为例进行解释:
    假设我有一个用于存储有关玩家信息的数据库。当玩家登录服务器时,他们的姓名和其他数据会保存在数据库中。如果我只是获取一个球员的名字并将其放入查询中而不进行检查,那么黑客就可以使用 SQL 注入。
    例如,如果我将玩家的名字直接粘贴到查询中,如下所示:

    "INSERT INTO players (name) VALUES ('игрок');"
    

    黑客可能会在他的名字中输入如下内容:

    "игрок'); DROP TABLE players; --"
    

    那么查询将变成:

    "INSERT INTO players (name) VALUES ('игрок'); DROP TABLE players; --');"
    

    此查询将首先插入名称,然后执行命令:

    DROP TABLE players;
    

    ,这将删除包含玩家的表格,从而导致数据丢失。

    为了避免这种情况,我使用准备好的语句。这意味着我首先创建一个具有数据空格的查询,然后单独插入数据。这样,数据库就会明白这只是数据,而不是查询的一部分。
    我的服务器上准备好查询的完整示例:

    // Получаем имя игрока
    String playerName = getPlayerNameFromInput();  
    
    // Запрос с подготовленным местом для данных
    String query = "INSERT INTO players (name) VALUES (?)";
    
    // Создаём подготовленный запрос
    PreparedStatement stmt = connection.prepareStatement(query);
    
    // Вставляем данные безопасно
    stmt.setString(1, playerName);  
    
    // Выполняем запрос
    stmt.executeUpdate();
    

    因此,即使有人试图通过昵称、密码等插入恶意代码,它也会被视为纯文本,不会发生任何事情。

    • 4

相关问题

  • 如何禁用 postgresql 服务器的自动启动

  • DB2 分层路径

  • 使用 peewee 更新列中所需的数组

  • 从 .dump 文件恢复数据库

  • 数据库架构是否有效?

  • 类型不兼容错误 (SQLSTATE 42P08)

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5