HTB-sql基本知识-mysql
sql-插入-insert
用于向给定表添加新记录
一、
语法
INSERT INTO table_name VALUES (column1_value, column2_value, column3_value, ...);
上面的语法要求用户填写表中所有列的值。
例子:如何向登录表添加新登录名,并为每列添加适当的值。
mysql> INSERT INTO logins VALUES(1, 'admin', 'p@ssw0rd', '2020-07-02');
Query OK, 1 row affected (0.00 sec)
二、
跳过使用默认值填充列
INSERT INTO table_name(column2, column3, ...) VALUES (column2_value, column3_value, ...);
例子:
mysql> INSERT INTO logins(username, password) VALUES('administrator', 'adm1n_p@ss');
Query OK, 1 row affected (0.00 sec)
跳过了id和date_of_joining列
三、
一次插入多条记录
mysql> INSERT INTO logins(username, password) VALUES ('john', 'john123!'), ('tom', 'tom123!');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
sql-选择-select
用于检索数据
一、
语法
SELECT * FROM table_name;
星号 (*) 充当通配符并选择所有列。 FROM
关键字用于表示要从中选择的表。
二、
查询特定列中的数据
SELECT * column1, column2 FROM table_name
三、
实例
mysql> SELECT * FROM logins;
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 1 | admin | p@ssw0rd | 2020-07-02 00:00:00 |
| 2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
| 3 | john | john123! | 2020-07-02 11:47:16 |
| 4 | tom | tom123! | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
4 rows in set (0.00 sec)
mysql> SELECT username,password FROM logins;
+---------------+------------+
| username | password |
+---------------+------------+
| admin | p@ssw0rd |
| administrator | adm1n_p@ss |
| john | john123! |
| tom | tom123! |
+---------------+------------+
4 rows in set (0.00 sec)
第一种是查看logins表中所有数据,第二种则是查询username列和password列
sql-删除-drop
用于删除表和数据库
实例
mysql> DROP TABLE logins;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW TABLES;
Empty set (0.00 sec)
注意,drop语句永久完全删除表且无需确认
sql-更改-alter
用于更改任何表及其任何字段的名称,或者删除现有表或向现有表添加新列
一、
使用ADD将新列newColumn添加到logins表:
mysql> ALTER TABLE logins ADD newColumn INT;
Query OK, 0 rows affected (0.01 sec)
二、
重命名列
mysql> ALTER TABLE logins RENAME COLUMN newColumn TO oldColumn;
Query OK, 0 rows affected (0.01 sec)
三、
使用MODIFY更改列的数据类型
mysql> ALTER TABLE logins MODIFY oldColumn DATE;
Query OK, 0 rows affected (0.01 sec)
四、
使用drop删除一列
mysql> ALTER TABLE logins DROP oldColumn;
Query OK, 0 rows affected (0.01 sec)
sql-更新-update
用于根据某些条件更新表中的特定记录
一、
语法
update table_name set column1=newvalue1, column2=newvalue2, ... where <condition>;
二、
查询更新了 id 大于 1 的所有记录中的所有密码
mysql> UPDATE logins SET password = 'change_password' WHERE id > 1;
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> SELECT * FROM logins;
+----+---------------+-----------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+-----------------+---------------------+
| 1 | admin | p@ssw0rd | 2020-07-02 00:00:00 |
| 2 | administrator | change_password | 2020-07-02 11:30:50 |
| 3 | john | change_password | 2020-07-02 11:47:16 |
| 4 | tom | change_password | 2020-07-02 11:47:16 |
+----+---------------+-----------------+---------------------+
4 rows in set (0.00 sec)
sql-排序-order by
一、
对任何查询的结果进行排序并指定排序依据的列
mysql> SELECT * FROM logins ORDER BY password;
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
| 3 | john | john123! | 2020-07-02 11:47:16 |
| 1 | admin | p@ssw0rd | 2020-07-02 00:00:00 |
| 4 | tom | tom123! | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
4 rows in set (0.00 sec)
二、
默认情况下,排序是按升序进行的,但我们也可以按ASC
或DESC
对结果进行排序:
mysql> SELECT * FROM logins ORDER BY password DESC;
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 4 | tom | tom123! | 2020-07-02 11:47:16 |
| 1 | admin | p@ssw0rd | 2020-07-02 00:00:00 |
| 3 | john | john123! | 2020-07-02 11:47:16 |
| 2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
+----+---------------+------------+---------------------+
4 rows in set (0.00 sec)
三、
还可以按多列排序,对一列中的重复值进行二次排序:
mysql> SELECT * FROM logins ORDER BY password DESC, id ASC;
+----+---------------+-----------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+-----------------+---------------------+
| 1 | admin | p@ssw0rd | 2020-07-02 00:00:00 |
| 2 | administrator | change_password | 2020-07-02 11:30:50 |
| 3 | john | change_password | 2020-07-02 11:47:16 |
| 4 | tom | change_password | 2020-07-02 11:50:20 |
+----+---------------+-----------------+---------------------+
4 rows in set (0.00 sec)
sql-限制-limit
一、
当我们的查询返回大量的记录,用于限制结果为我们想要的
mysql> SELECT * FROM logins LIMIT 2;
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 1 | admin | p@ssw0rd | 2020-07-02 00:00:00 |
| 2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)
二、
如果我们想用偏移量限制结果,我们可以在 LIMIT 计数之前指定偏移量:
mysql> SELECT * FROM logins LIMIT 1, 2;
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
| 3 | john | john123! | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)
注意:偏移量标记了要包含的第一条记录的顺序,从0开始。对于上面的情况,它从第二条记录开始并包含,并返回两个值。
sql-子句-where
一、
要过滤或搜索特定数据,我们可以使用带有WHERE子句的SELECT
语句的条件来微调结果:
SELECT * FROM table_name WHERE <condition>;
上面的查询将返回满足给定条件的所有记录。
二、
mysql> SELECT * FROM logins WHERE id > 1;
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
| 3 | john | john123! | 2020-07-02 11:47:16 |
| 4 | tom | tom123! | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
3 rows in set (0.00 sec)
上面的示例选择id
值大于1
所有记录。正如我们所看到的, id
为 1 的第一行已从输出中跳过。
三、
我们可以对用户名做类似的事情:
mysql> SELECT * FROM logins where username = 'admin';
+----+----------+----------+---------------------+
| id | username | password | date_of_joining |
+----+----------+----------+---------------------+
| 1 | admin | p@ssw0rd | 2020-07-02 00:00:00 |
+----+----------+----------+---------------------+
1 row in set (0.00 sec)
上面的查询选择用户名是admin
记录
注意:字符串和日期数据类型应该用单引号(')或双引号(")括起来,而数字可以直接使用。
sql-子句-like
一、
它允许通过匹配特定模式来选择记录
查询检索用户名以admin开头的所有记录:
mysql> SELECT * FROM logins WHERE username LIKE 'admin%';
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 1 | admin | p@ssw0rd | 2020-07-02 00:00:00 |
| 4 | administrator | adm1n_p@ss | 2020-07-02 15:19:02 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)
%
符号充当通配符,匹配admin
之后的所有字符。它用于匹配零个或多个字符。类似地, _
符号用于精确匹配一个字符。下面的查询匹配所有包含三个字符的用户名,在本例中是tom
:
mysql> SELECT * FROM logins WHERE username like '___';
+----+----------+----------+---------------------+
| id | username | password | date_of_joining |
+----+----------+----------+---------------------+
| 3 | tom | tom123! | 2020-07-02 15:18:56 |
+----+----------+----------+---------------------+
1 row in set (0.01 sec)
sql-与运算符-and
一、
AND
运算符接受两个条件并根据它们的评估返回true
或false
:
condition1 AND condition2
当且仅当condition1
和condition2
计算结果都为true
时, AND
运算的结果才为true
mysql> SELECT 1 = 1 AND 'test' = 'test';
+---------------------------+
| 1 = 1 AND 'test' = 'test' |
+---------------------------+
| 1 |
+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT 1 = 1 AND 'test' = 'abc';
+--------------------------+
| 1 = 1 AND 'test' = 'abc' |
+--------------------------+
| 0 |
+--------------------------+
1 row in set (0.00 sec)
补充:在 MySQL 术语中,任何non-zero
值都被视为true
,并且它通常返回值1
来表示true
。 0
被认为是false
。正如我们在上面的示例中看到的,第一个查询返回true
因为两个表达式都被评估为true
。但是,第二个查询返回false
因为第二个条件'test' = 'abc'
为false
。
sql-或运算符-or
一、
OR
运算符也接受两个表达式,并在其中至少一个表达式为true
时返回true
:
mysql> SELECT 1 = 1 OR 'test' = 'abc';
+-------------------------+
| 1 = 1 OR 'test' = 'abc' |
+-------------------------+
| 1 |
+-------------------------+
1 row in set (0.00 sec)
mysql> SELECT 1 = 2 OR 'test' = 'abc';
+-------------------------+
| 1 = 2 OR 'test' = 'abc' |
+-------------------------+
| 0 |
+-------------------------+
1 row in set (0.00 sec)
第一个查询的计算结果为true
因为条件1 = 1
为true
。第二个查询有两个false
条件,导致false
输出。
sql-非运算符-not
一、
NOT
运算符只是切换一个boolean
值“即true
转换为false
,反之亦然”:
mysql> SELECT NOT 1 = 1;
+-----------+
| NOT 1 = 1 |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
mysql> SELECT NOT 1 = 2;
+-----------+
| NOT 1 = 2 |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
如上面的示例所示,第一个查询结果为false
因为它是1 = 1
计算的倒数,即true
,因此其倒数为false
。另一方面,第二个查询返回true
,因为1 = 2
'which is false
' 的反义词是true
。
sql-符号运算符
一、
AND
、 OR
和NOT
运算符也可以表示为&&
、 ||
和!
, 分别。以下是使用符号运算符的相同先前示例:
mysql> SELECT 1 = 1 && 'test' = 'abc';
+-------------------------+
| 1 = 1 && 'test' = 'abc' |
+-------------------------+
| 0 |
+-------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT 1 = 1 || 'test' = 'abc';
+-------------------------+
| 1 = 1 || 'test' = 'abc' |
+-------------------------+
| 1 |
+-------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> SELECT 1 != 1;
+--------+
| 1 != 1 |
+--------+
| 0 |
+--------+
1 row in set (0.00 sec)
查询中的运算符
一、
在查询中使用这些运算符。以下查询列出了username
不是john
所有记录:
mysql> SELECT * FROM logins WHERE username != 'john';
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 1 | admin | p@ssw0rd | 2020-07-02 00:00:00 |
| 2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
| 4 | tom | tom123! | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
3 rows in set (0.00 sec)
二、
查询选择id
大于1
并且username
不等于john
用户:
mysql> SELECT * FROM logins WHERE username != 'john' AND id > 1;
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 2 | administrator | adm1n_p@ss | 2020-07-02 11:30:50 |
| 4 | tom | tom123! | 2020-07-02 11:47:16 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)
sql-多个运算符优先级
SQL 支持各种其他运算,例如加法、除法以及按位运算。因此,一个查询可以同时具有多个具有多个操作的表达式。这些操作的顺序由运算符优先级决定。
一、
以下列表显示了 SQL 运算符的优先级。列表中首先出现的运算符具有更高的优先级。一起列出的运算符具有相同的优先级。
- 除法 (
/
)、乘法 (*
) 和模 (%
) - 加法 (
+
) 和减法 (-
) - 比较(
=
、>
、<
、<=
、>=
、!=
、LIKE
) - NOT (
!
) - AND (
&&
) - OR (
||
)
二、
实例:
SELECT * FROM logins WHERE username != 'tom' AND id > 3 - 2;
该查询有四个操作: != 、 AND 、 >和- 。从运算符优先级来看,我们知道减法优先,因此它首先将3 - 2计算为1 :
SELECT * FROM logins WHERE username != 'tom' AND id > 1;
接下来,我们有两个比较操作, >和!= 。两者具有相同的优先级,并且将一起评估。因此,它将返回 username 不是tom所有记录,以及id大于 1 的所有记录,然后应用AND返回满足这两个条件的所有记录:
mysql> select * from logins where username != 'tom' AND id > 3 - 2;
+----+---------------+------------+---------------------+
| id | username | password | date_of_joining |
+----+---------------+------------+---------------------+
| 2 | administrator | adm1n_p@ss | 2020-07-03 12:03:53 |
| 3 | john | john123! | 2020-07-03 12:03:57 |
+----+---------------+------------+---------------------+
2 rows in set (0.00 sec)
HTB-sql基本知识-sql注入
在web应用程序中使用sql
在PHP Web应用中,我们可以连接到数据库,并在php中通过MySQL语法使用数据库
看下面这串代码
$conn = new mysqli("localhost","root","password","users");
$query = "select * form logins";
$result = $conn->query($query);
$conn: 这是一个变量名,用于保存与数据库连接的对象。
new mysqli(): 使用 mysqli 构造函数创建一个新的数据库连接对象。
"localhost": 指定数据库服务器的位置(主机名)。在这个例子中,数据库服务器位于本地机器上。
"root": 指定用于连接数据库的用户名。
"password": 指定连接数据库时使用的密码。
"users": 指定要连接的数据库名称。
$query: 这是一个变量名,用于保存 SQL 查询语句。
"select * from logins": 这是一条 SQL 查询语句,用于从名为 logins 的表中选择所有列的所有记录。
$result: 这是一个变量名,用于保存查询结果。
$conn->query(): 使用 $conn 对象的 query() 方法执行 SQL 查询。
$query: 作为参数传递给 query() 方法,该参数包含了要执行的 SQL 查询语句。
然后,查询的输出将存储在$result
中,我们可以将其打印到页面或以任何其他方式使用它。下面的 PHP 代码将在新行中打印 SQL 查询的所有返回结果:
while($row = $result->fetch_assoc() ){
echo $row["name"]."<br>";
}
while($row = $result->fetch_assoc() ){:
$row: 这是一个变量,用于存储从数据库查询结果中获取的一行数据。
$result->fetch_assoc(): 使用 $result 对象的 fetch_assoc() 方法从查询结果中获取下一行数据,并将其作为一个关联数组返回。如果还有更多的行,fetch_assoc() 会返回这一行的数据;如果没有更多的行,它将返回 false。
while 循环: 这是一个循环结构,只要 $result->fetch_assoc() 返回的不是 false(即还有行可取),就会继续执行循环体内的代码。
echo $row["name"]."<br>";:
$row["name"]: 访问 $row 数组中的 "name" 键对应的值。这里的 "name" 应该是查询结果中的一列的名称。
."<br>": 在每个名字后面添加 HTML 的换行符 <br>,这样在网页上显示时每个名字会位于新的一行。
echo: 输出 $row["name"]."<br>" 的结果,即打印出 "name" 列的值,并在其后加上 <br>。
Web 应用程序在检索数据时通常也使用用户输入。例如,当用户使用搜索功能搜索其他用户时,他们的搜索输入将传递到 Web 应用程序,该应用程序使用该输入在数据库中进行搜索:
$searchInput = $_POST['findUser'];
$query = "select * from logins where username like '%$searchInput'";
$result = $conn->query($query);
所以sql注入就是这么来的,你输入的语句插入了后端设置的sql语句
sql注入
$searchInput = $_POST['findUser'];
$query = "select * from logins where username like '%$searchInput'";
$result = $conn->query($query);
上述代码对用户输入的内容没有进行任何的过滤,所以当用户在插入代码时,会从代码流的角度修改后端执行的sql语句,从而获取自己想要的结果
正常来说,我们会进入以下的sql查询
select * from logins where username like '%$searchInput'
如果我们输入admin,就会变成%admin。但是如果我们输入'这将结束用户输入字段,在它之后,我们可以编写实际的 SQL 代码
例如,我们输入1'; DROP TABLE users;
会进入以下的sql查询
'%1'; DROP TABLE users;'
即
select * from logins where username like '%1'; DROP TABLE users;'
注意:在上面的示例中,为了简单起见,我们在分号 (
标签:username,HTB,mysql,基本知识,查询,sql,password,id,SELECT From: https://www.cnblogs.com/schneider/p/18436223