Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 右单引号(Unicode:(U+;2019)扩展Ascii 146)通过MySqlParameter导致SQL注入_C#_Mysql_Asp.net_Unicode_Extended Ascii - Fatal编程技术网

C# 右单引号(Unicode:(U+;2019)扩展Ascii 146)通过MySqlParameter导致SQL注入

C# 右单引号(Unicode:(U+;2019)扩展Ascii 146)通过MySqlParameter导致SQL注入,c#,mysql,asp.net,unicode,extended-ascii,C#,Mysql,Asp.net,Unicode,Extended Ascii,我遇到了一个相当奇怪的问题 我们的C#/Asp.Net web应用程序背后运行着一个MySql数据库 我们为每个查询使用参数以防止SQL注入攻击 然而,我们最近从一个客户那里得到了奇怪的SQL错误 经调查,我们发现该客户一直在将包含“右单引号”(')字符的地址粘贴到我们网站的字段中 令人惊讶的是,这似乎通过了我们代码的参数化部分,并被插入到查询中,于是我们的MySQL服务器将其解释为一个未替换的引号 这意味着我们的客户正在不知不觉地对我们的服务器执行SQL注入攻击 关于这一点,我有两个问题: 1

我遇到了一个相当奇怪的问题

我们的C#/Asp.Net web应用程序背后运行着一个MySql数据库

我们为每个查询使用参数以防止SQL注入攻击

然而,我们最近从一个客户那里得到了奇怪的SQL错误

经调查,我们发现该客户一直在将包含“右单引号”(')字符的地址粘贴到我们网站的字段中

令人惊讶的是,这似乎通过了我们代码的参数化部分,并被插入到查询中,于是我们的MySQL服务器将其解释为一个未替换的引号

这意味着我们的客户正在不知不觉地对我们的服务器执行SQL注入攻击

关于这一点,我有两个问题:

1) 这不是难以置信的不安全吗?如果这对我们不利,是否还有其他公司可能受到同样的安全漏洞的影响

2) 我该如何解决这个问题?在参数化用户输入之前,是否有任何方法可以在不运行正则表达式或字符串替换的情况下清理此输入?(考虑到代码库的大小和我们拥有的编码器数量,这可能需要一个月的工作)

我们一直认为参数化可以防止任何不那么集中的恶意攻击。不是这样吗

规格: MySQLServer 5.6
MySql.Net连接器1.0.10.0
Asp.NET4.5.1


非常感谢您的帮助或建议……

我认为问题在于SQL Server默认情况下将命令视为unicode,因此当您的MySQL数据库使用ASCII时,ASP.NET不会费心清理unicode字符

根据,应该可以使用以下命令更改表格以允许正确的单引号:

ALTER TABLE [Table] COLLATE='utf8_unicode_ci';
从MySQL文档来看,您可以在运行时为整个服务器设置字符集和排序模式。要测试它是否修复了您的问题,请尝试如下启动MySQL:

mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci

您可以在测试用例中手动复制吗?是的,可以在本地系统上复制。实际上能够使用这个字符执行SQL注入。我需要更多的时间来看看我是否可以在新安装的MySql上执行此操作。请提供一个测试用例。嗨,Tim。感谢您的回复,我认为您可能正确地确定了此问题的原因。但是,无论是更改受影响表的字符集,还是更改每列的字符集,都不能纠正此问题。SQL server仍在将Unicode字符解释为未替换的引号。是否有我可能缺少的全局数据库设置导致了这种情况?如果是这样的话,每个数据库/表/列有不同的字符集有什么共同点吗。。。我不确定在编辑方面通知是如何工作的,但为了防止您没有收到通知,我已经更新了我的答案,以包含在服务器范围内设置字符模式的代码。我不认为在不同的表中使用不同的字符集会有任何冲突,但我不是MySQL方面的专家,所以我将把这一点交给任何有更多知识的人。