什么是SQL注入?
SQL(结构化查询语言)注入,通常称为 SQLi,是对 Web 应用程序数据库服务器的攻击,会导致执行恶意查询。当 Web 应用程序使用未经正确验证的用户输入与数据库通信时,攻击者有可能窃取、删除或更改私人和客户数据,并攻击 Web 应用程序的身份验证方法以获取私有信息或客户区。这就是为什么 SQLi 不仅是最古老的 Web 应用程序漏洞之一,而且也是最具破坏性的
什么是数据库?
如果您不习惯使用数据库或利用它们,可能需要习惯一些新术语,所以让我们从一些关于数据库的结构和工作方式的基础知识开始
数据库是以有组织的方式以电子方式存储数据集合的一种方式。数据库由 DBMS
控制,它是 Database Management System
的首字母缩写,DBMS 分为关系型或非关系型两个阵营,这个房间的重点将放在关系型数据库上,您会遇到的一些常见数据库是 MySQL、Microsoft SQL Server、Access、PostgreSQL 和 SQLite
在 DBMS 中,您可以有多个数据库,每个数据库都包含自己的一组相关数据。例如,您可能有一个名为“ shop ”
的数据库。在此数据库中,您希望存储有关可供购买的产品的信息、已注册到您的在线商店的用户以及有关您收到的订单的信息。您将使用称为表的东西将此信息单独存储在数据库中,每个表都用唯一的名称标识。您可以在下图中看到这种结构,但您还可以看到企业如何使用其他单独的数据库来存储员工信息或客户团队
什么是表(table)?
表格由列和行组成,一种有用的方式是将表格想象成一个网格,列从左到右穿过顶部,包含单元格的名称,行从上到下,每一行都有实际数据
列(columns)
每个列,更好地称为字段,每个表都有一个唯一的名称。创建列时,您还可以设置它将包含的数据类型,常见的有整数(数字)、字符串(标准文本)或日期。一些数据库可以包含更复杂的数据,例如包含位置信息的地理空间数据。设置数据类型还可以确保不会存储不正确的信息,例如字符串“hello world”存储在用于日期的列中。如果发生这种情况,数据库服务器通常会产生一条错误消息。包含整数的列也可以启用自动递增功能;这为每一行数据提供了一个唯一的数字,该数字随着每一行的后续行而增长(递增),这样做会创建所谓的键字段,对于可用于在 SQL 查询中查找确切行的每一行数据,关键字段必须是唯一的
行(Rows)
行或记录是包含各个数据行的内容。当您向表中添加数据时,会创建新的行/记录,而当您删除数据时,会删除行/记录
关系数据库与非关系数据库:
关系数据库
将信息存储在表中,并且表之间通常共享信息,它们使用列来指定和定义要存储的数据,并使用行来实际存储数据。这些表通常包含一个具有唯一 ID(主键)的列,然后在其他表中使用该 ID 来引用它并在表之间建立关系,因此称为关系数据库
另一方面,有时称为 NoSQL 的非关系数据库是任何一种不使用表、列和行来存储数据的数据库,不需要构建特定的数据库布局,因此每一行数据都可以包含不同的可以提供比关系数据库更大灵活性的信息。这种类型的一些流行数据库是 MongoDB、Cassandra 和ElasticSearch
什么是 SQL?
SQL(结构化查询语言-Structured Query Language)是一种用于查询数据库的功能丰富的语言,这些 SQL 查询称为语句
我们将在此任务中介绍的最简单的命令用于检索(选择)、更新、插入和删除数据。尽管有些相似,但一些数据库服务器有自己的语法并且在工作方式上有细微的变化。所有这些示例都基于 MySQL 数据库,值得注意的是,SQL 语法不区分大小写
SELECT
我们将学习的第一种查询类型是用于从数据库中检索数据的 SELECT 查询
select * from users;
id | username | password |
---|---|---|
1 | jon | pass123 |
2 | admin | p4ssword |
3 | martin | secret123 |
第一个单词 SELECT
告诉数据库我们想要检索一些数据,*
告诉数据库我们想要从表中接收回所有列。例如,该表可能包含三列(id、username和password
)。“from users”
告诉数据库我们要从名为 users
的表中检索数据。最后,末尾的分号
告诉数据库查询到此结束
下一个查询与上面类似,但是这次,我们不使用 *
返回数据库表中的所有列,而是只请求用username
和password
字段
select username,password from users;
username | password |
---|---|
jon | pass123 |
admin | p4ssword |
martin | secret123 |
以下查询与第一个查询一样,使用 *
选择器返回所有列,然后“LIMIT 1”
子句强制数据库仅返回一行数据。将查询更改为“LIMIT 1,1”会强制查询跳过第一个结果,然后“LIMIT 2,1”会跳过前两个结果,依此类推。您需要记住第一个数字告诉数据库您希望跳过多少结果,第二个数字告诉数据库要返回多少行
select * from users LIMIT 1;
id | username | password |
---|---|---|
1 | john | pass123 |
最后,我们将使用 where 子句;这就是我们如何通过返回与我们的特定子句匹配的数据来精细地挑选出我们需要的确切数据
select * from users where username='admin';
id | username | password |
---|---|---|
2 | admin | p4ssword |