Laravel异常:1366 不正确的字符串值:列'user_agent'的'\xC0\xA7\xC0\xA2%2...'



偶尔我会从Laravel那里得到以下异常:

"class": "Illuminate\Database\QueryException",
"message": "SQLSTATE[HY000]: General error: 1366 Incorrect string value: '\xC0\xA7\xC0\xA2%2...' for column 'user_agent' at row 1 (SQL: update `sessions` set `payload` = testpayload, `last_activity` = 1663058232, `user_id` = ?, `ip_address` = ipAddress, `user_agent` = 1 ����%2527%2522 where `id` = blahblah)"

从我所读到的内容来看,很可能是我的表没有使用正确的编码,并且可能正在查看该网站的人在user_agent中使用特殊字符(例如Ö),因此它抛出错误。

但是检查一下,我假设如果我有默认的Laravel设置,其他人如何没有遇到同样的问题。检查我的设置:

config/database.php

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

^ 并在数据库本身中确认,这就是我正在使用的。

然后我怀疑也许当我从 Laravel 5.x 升级到 7.x>时,迁移发生了变化或其他什么,我应该使用不同的字符集。但是检查迁移以及版本 7 的数据库配置,没有任何变化。

拉拉维尔版本:7.30.4

Mysql 版本:5.7.33-log

有人以前见过这个或指出我正确的方向吗?

该垃圾字符串不是合法的用户代理; 看起来它甚至不是有效的 UTF-8,而是某种转义形式的超长编码,这是无效的:

select convert(x'C0A7C0A2' using utf8);
(null)

同时,%2527%2522部分是%27%22的双重URL编码版本,它是""的URL编码版本。它也是垃圾。

来自您的示例的请求可能来自一些试图查找漏洞的机器人或渗透测试工具,例如sqlmap,它可以使用这些技巧(这里,这里)来尝试避免过滤器。它不是来自一个人。如果您有其他具有相同问题的请求,或者具有不同外观奇怪的用户代理,则这些可能是同一工具的其他尝试。

您可能只想完全阻止来自此 IP 的请求。

最新更新