MySQL8中创建函数报错的解决

在MySQL8.x中遇到创建函数时由于安全性增强导致的1418错误,可以尝试设置全局环境变量log_bin_trust_function_creators为TRUE或修改my.cnf配置文件添加相应设置。这种方法允许不安全的函数创建,但需谨慎操作,因为可能影响二进制日志的安全性。

一 问题描述

在使用MySQL8.x版本的数据库创建函数时, 报出一下错误

HY000][1418] This function has none of DETERMINISTIC, 
NO SQL, or READS SQL DATA in its declaration and binary logging is enabled 
you might want to use the less safe log_bin_trust_function_creators variable

简单翻译一下 , 函数定义不明确 , 没有SQl语句 , 或者只是读取数据不会执行 , 并且已经启用了二进制文件记录, 你可能需要使用不太安全的 log_bin_trust_function_creators 变量;

说人话 : MySQL5.x 中 可以直接创建函数 , 在MySQL8.x 中, 不能直接创建函数 , 需要首先设置 log_bin_trust_function_creators=true , 才可以;

二 解决方案

方案一 : 设置全局环境变量

特点 : 不需要重启服务器, 在服务器的一次运行中始终有效 , 重启MySQL服务之后会失效!

show variables like '%log_bin_trust_function_creators%'; # 查看默认值
set GLOBAL log_bin_trust_function_creators=TRUE; # 修改默认值为true

方案二 : 修改系统配置文件

特点 : 需要重启服务器, 终身有效 !
找到my.cnf配置文件中添加:

log_bin_trust_function_creators=1

修改完成以后, 记得重启一下服务哦 ! 如果不想重启服务 , 也可以将方案一二结合使用 , 即修改全局环境变量 , 又修改系统配置文件 !

### MySQL 中可用于触发报错函数 在 SQL 注入测试中,攻击者通常利用数据库错误信息来获取敏感信息或验证注入点。MySQL 提供了多个函数和操作,可以被用于构造触发错误的查询语句。这些函数在特定上下文中执行时可能导致语法错误、类型不匹配或约束冲突,从而返回详细的错误信息[^2]。 #### 1. `extractvalue()` 函数函数用于解析 XML 文档并提取指定节点内容。当传入非法 XML 或不存在的节点路径时,可能会触发错误,并将部分查询内容暴露给攻击者。此函数常用于报错注入攻击中,例如: ```sql AND extractvalue(1, concat(0x5e, (SELECT database()), 0x5e)) ``` 此查询会尝试从数据库中提取当前数据库名称,并将其拼接进 `extractvalue()` 的第二个参数中。由于格式不符合 XML 规范,因此会触发错误并返回包含数据库名的信息[^3]。 #### 2. `updatexml()` 函数 与 `extractvalue()` 类似,`updatexml()` 用于修改 XML 文档中的节点。如果传入无效的 XML 路径或内容,会导致错误并可能泄露数据。示例用法如下: ```sql AND updatexml(1, concat(0x5e, (SELECT user()), 0x5e), 1) ``` 此语句尝试更新 XML 内容,但由于构造的字符串并非合法 XML,因此会引发错误并返回用户信息。 #### 3. `floor()` + `rand()` 组合 虽然 `floor()` 和 `rand()` 本身不会直接导致错误,但当它们与聚合函数(如 `COUNT()`)结合使用时,在某些情况下会导致重复键冲突并抛出错误。这在盲注场景中特别有用,例如: ```sql AND SELECT 1 FROM information_schema.tables GROUP BY CONCAT(version(), FLOOR(RAND(0)*2)) ``` 上述语句通过 `GROUP BY` 和随机值生成器制造键冲突,从而触发错误并显示数据库版本信息。 #### 4. `exp()` 函数 `exp()` 计算自然指数 e 的幂次方,若输入值过大可能导致溢出错误。攻击者可利用此特性构造恶意查询以触发异常: ```sql AND exp(SELECT ASCII(SUBSTR((SELECT database()),1,1))) ``` 此语句尝试对数据库名的第一个字符进行指数运算,若结果超出浮点数表示范围,则可能引发错误并反馈相关信息。 #### 5. `polygon()` 函数函数用于创建多边形几何对象,若输入参数格式不正确则会抛出错误。攻击者可通过构造非法 WKT(Well-Known Text)格式来触发错误并获取信息: ```sql AND polygon((SELECT * FROM (SELECT CONCAT(0x7e, version(), 0x7e))x)) ``` 此语句试图将数据库版本号嵌入到 `polygon()` 参数中,由于参数不是有效的 WKT 表达式,因此会触发错误并返回版本信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真香IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值