关于MYSQL长字符截断的实现介绍

149 篇文章 2 订阅
文章讲述了MySQL中长字符截断的实现,当sql_mode未开启严格模式时,插入超长字符会导致截断,可能引发安全漏洞,如通过注入攻击绕过权限检查。
摘要由CSDN通过智能技术生成

 

本文主要介绍了MySQL长字符截断的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着微点阅读小编来一起学习学习吧

MySQL超长字符截断又名"SQL-Column-Truncation",是安全研究者Stefan Esser在2008 年8月提出的。

在MySQL中的一个设置里有一个sql_mode选项,当sql_mode设置为default时,即没有开启STRICT_ALL_TABLES选项时(MySQLsql_mode默认即default),MySQL对插入超长的值只会提示warning,而不是error,这样就可能会导致一些截断问题。

新建一张表测试,表结构如下(MySQL5.1):

1

2

3

4

5

CREATE TABLE USERS(

id int(11) NOT NULL, //长度为7

username varchar(7)NOT NULL,

password varchar(12)NOT NULL ,

)

分别插入以下SQL语句(注入提示消息)。

①插入正常的SQL语句。

1

2

3

mysql> insert into users(id,username,password)values(1,'admin','admin');//成功插入,无警告,无错误

  

Query OK,1 row affected(0.00 sec)

②插入错误的SQL语句,此时的"admin "右面有三个空格,长度为8,已经超过了原有的规定长度。

1

2

3

mysql> insert into users(id,username,password)values(2,'admin       ','admin');

//成功插入,一个警告

Query OK,1 row affected,1 warning(0.00 sec)

③插入错误的SQL语句,长度已经超过原有的规定长度。

1

2

3

mysql> insert into users(id,username,password) values(3,'admin    x','admin');

//成功插入,一个警告

Query OK,1 row affected,1 warning(0.00 sec)

MySQL提示三条语句都已经插入到数据库,只不过后面两条语句产生了警告。那么最终有没有插入到数据库呢?执行SQL语句查看一下就知道了。

1

mysql> select username from users;

可以看到,三条数据都被插入到数据库,但值发生了变化,此时在通过length来取得长度,判断值的长度。

1

mysql> select length(username)from users where id =1 ;

可以发现,第二条与第三条数据的长度为7,也就是列的规定长度,由此可知,在默认情况下,如果数据超出列默认长度,MySQL会将其截断。

但这样何来攻击一说呢?

面查询用户名为'admin'的用户就知道了。

1

mysql> select username from users where username='admin';

只查询用户名为admin的用户,但是另外两个长度不一致的admin用户也被查询出,这样就会造成一些安全问题,比如,有一处管理员登录是这样判断的,语句如下:

1

$sql = "select count(*) from users where username='admin' and password='*******;

假设这条SQL语句没有任何注入漏洞,攻击者也可能登录到管理页面。假设管理员登录的用户名为 admin,那么攻击者仅需要注册一个"admin”用户即可轻易进入后台管理页面,像著名的WordPress就被这样的方式攻击过。

到此这篇关于MySQL长字符截断的实现示例的文章就介绍到这了,希望可以帮到你!

来源:微点阅读     https://www.weidianyuedu.com

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下SQL语句将MySQL表中的一个号码列改为文本格式: ``` ALTER TABLE table_name MODIFY COLUMN column_name VARCHAR(20); ``` 其中,`table_name` 为表名,`column_name` 为要修改的列名,`VARCHAR(20)` 表示将列类型修改为最大度为20的文本类型,可以根据实际情况进行调整。请注意,在修改列类型后,原有的数据可能会出现截断或转换错误的情况,需要谨慎操作。 ### 回答2: 在MySQL中,我们可以使用ALTER TABLE语句来修改表中的列。 要将表中的号码列改为文本格式,可以执行以下步骤: 1. 首先,我们需要登录到MySQL数据库。 2. 选择你要修改的数据库,使用以下命令:`USE database_name;` (将 database_name 替换为实际的数据库名称)。 3. 使用DESCRIBE语句来查看表的结构,确定要修改的列名。例如,假设要修改的表名为table_name,列名为phone_number,可以使用以下命令:`DESCRIBE table_name;` 4. 使用ALTER TABLE语句来修改列的数据类型和格式。例如,假设我们要将phone_number列改为文本格式,可以使用以下命令:`ALTER TABLE table_name MODIFY COLUMN phone_number VARCHAR(20);` (将 table_name 替换为实际的表名,VARCHAR(20)表示要改为的文本格式,可以根据实际情况调整度)。 5. 执行上述语句后,表中的phone_number列的数据类型将被修改为文本格式。 需要注意的是,修改列的数据类型可能会导致数据丢失或格式错误。在执行ALTER TABLE语句之前,建议先备份表的数据,以防万一。 另外,如果表中有大量的数据,修改列的数据类型可能需要花费较的时间。在执行ALTER TABLE语句时,请确保数据库服务器处于空闲状态,并考虑执行在非高峰期执行。 ### 回答3: 在MySQL中,可以使用ALTER TABLE语句将表中的号码列改为文本格式。 具体的步骤如下: 1. 打开MySQL命令行或MySQL可视化工具,连接到MySQL数据库。 2. 选择要修改的数据库,可以使用USE语句切换到目标数据库,例如:USE your_database; 3. 使用ALTER TABLE语句修改表结构。假设要将表名为your_table的号码列名为phone_number改为文本格式,可以使用以下语句: ALTER TABLE your_table MODIFY COLUMN phone_number VARCHAR(255); 其中,VARCHAR(255)表示将该列的数据类型修改为可变字符型,最大度为255。你也可以根据实际需求调整数据类型和度。 4. 执行以上ALTER TABLE语句后,号码列的数据类型会被修改为文本格式。 请注意,在执行ALTER TABLE语句前,最好先备份数据,以防发生意外情况。此外,修改表结构可能会导致表中已有的数据丢失或出现错误,所以请谨慎操作,确认无误后再进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值