mysql - 为公众提供一种在数据库上运行 SELECT 查询的方法有多危险?

标签 mysql sql database security

<分区>

假设我执行以下操作:

  • 我创建了一个 MySQL 数据库,并用一些数据填充它。
  • 我创建了一个 MySQL 用户,该用户只能访问该数据库,并且只有 SELECT 权限。
  • 我创建了一个网页,用户(任何用户,无需密码)可以通过该网页输入任意 SQL,并且在提交表单时,脚本会尝试以我创建的 MySQL 用户身份运行 SQL;生成的任何结果集都会显示给用户;生成的任何错误消息都会显示给用户。
  • 假设数据库不包含存储过程等,只包含表和 View ,并且我很高兴任何人都能看到该特定数据库的任何内容。

我们假设该设置将被恶意用户探测。可能发生的最坏情况是什么?

一些想法:

  • MySQL 提供了各种语句,如 SHOW 等,用户甚至只有 SELECT 权限也可以使用这些语句来收集有关数据库服务器或我的数据库的信息。可以从错误消息中获取其他信息。虽然这些信息可能不足以获得不当访问权限,但肯定会有所帮助。
  • 数据库软件、我的脚本或脚本语言本身可能存在缺陷,可能允许访问者通过此界面执行他们不应执行的操作。
  • 这样做可能会违反服务条款协议(protocol),尤其是在我使用共享主机的情况下。

最佳答案

嗯。聪明的用户可能会通过如下语法进行攻击:

select some_function_that_updates() from some_table;

还有一个 denial of service可能破坏内存的攻击,例如:

select * from some_massive_table cross join some_other_massive_table;

坦率地说,对于有经验的程序员来说,编写表现良好的查询已经够难了……即使他们尝试编写一个好的查询,一个糟糕的用户有什么机会

关于mysql - 为公众提供一种在数据库上运行 SELECT 查询的方法有多危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6264815/

相关文章:

mysql - SQL 有效地选择该值在另一个表中具有记录的值

MySQL : Left join with group by records

sql - 如果作者写了不止一篇文章,为什么这个SQL查询将文章的作者名返回NULL?

mysql - 如何从mysql数据库中获取随机行数?

html - 供学生使用的基于 Web 的数据库模拟器

php - 无法连接到数据库

javascript - 将 jQuery 实时搜索结果显示为表格上的 <tr> 元素

python - SQL 查询从 wordpress.org MySQL 获取帖子名称和链接

php - 选择某个月份位于两个日期字段之间的 MySQL 行

java - 合并2个具有相同结构的数据库