C# 如何创建一个不能存储在varchar(500)中但却是合法的nvarchar(500)的字符串?

C# 如何创建一个不能存储在varchar(500)中但却是合法的nvarchar(500)的字符串?,c#,nvarchar,C#,Nvarchar,我想测试我们的应用程序的安全性。列和用户输入文本字段设置为maxlength 500 目前,我尝试创建这样一个字符串是catalog.Reward_desc=Enumerable.range1500.Select e=>ﻷ.字符串。空 看看是否可以让linqpad让我在一般c意义上搜索问题 如何使用c创建一个字符串以传递到DAL中,或者使用粘贴到html页面上的输入元素中的字符串,以确保从前面到中间以及在DAL中正确地处理这个问题 编辑-添加信息 下面是示例代码,我尝试查看是否在SQL\u La

我想测试我们的应用程序的安全性。列和用户输入文本字段设置为maxlength 500

目前,我尝试创建这样一个字符串是catalog.Reward_desc=Enumerable.range1500.Select e=>ﻷ.字符串。空

看看是否可以让linqpad让我在一般c意义上搜索问题

如何使用c创建一个字符串以传递到DAL中,或者使用粘贴到html页面上的输入元素中的字符串,以确保从前面到中间以及在DAL中正确地处理这个问题

编辑-添加信息

下面是示例代码,我尝试查看是否在SQL\u Latin1\u General\u CP1\u CI\u AS collated列中遇到了无法正确存储的字符:

var catalog= new Catalog() { Add_dt=DateTime.Now, Update_dt=DateTime.Now, Reward_name=string.Empty, Reward_image=string.Empty,Add_by=string.Empty,Update_by=string.Empty, Redemption_type_id=1 };

using(var db = new UserQuery(this.Connection)){
db.Catalogs.Max (c => c.Reward_desc.Length).Dump();
this.Connection.Open();
using(var tran = new TransactionScope())
{
    var source=Enumerable.Range(1,500).Select (e =>"€").Delimit(string.Empty);
    catalog.Reward_desc=source;
    catalog.Reward_desc.Length.Dump();
    db.Catalogs.InsertOnSubmit(catalog);


    db.SubmitChanges();
    db.Catalogs.Max (c => c.Reward_desc.Length).Dump();
    var desc=db.Catalogs.Where(c=>c.Reward_catalog_id == catalog.Reward_catalog_id).Select (c => c.Reward_desc).First().Dump();
    (desc==source).Dump();
}
    db.Catalogs.Max (c => c.Reward_desc.Length).Dump();
}

写一个字符串,然后读回并比较值。如果使用非ansi字母,读取的字符串很可能无效,例如,扩展字母将返回为

您选择的字符看起来是一个很好的候选字符,但是,它取决于实际数据库的8位编码

var source=Enumerable.Range(1,500).Select (e =>'\u0FFE'.ToString()).Delimit(string.Empty);

是一个合法的varchar500,但当存储在db中并被拉出时,其高位会被截断。所以没有例外,但是,如果浏览器以这种方式提交截断,而c将它运行到通过大多数验证的数据库,则截断听起来是危险的,因为它不包含任何被c检查列入黑名单的内容。

选择一个编码中不可表示的字符,该编码与您为该列选择的排序规则相匹配。使用var成功地使其跳闸source=Enumerable.Range1,1.Select e=>'\uFFFE'.ToString.DifferenceString.Empty;db返回的是字符63,而不是给定的值。不知道在浏览器中复制/粘贴是否会成功地获得相同的结果。什么是\uFFFE,什么是.diffine。。。?执行?“\uFFFE”是最高级别的操作,这是我在修改数据以生成结果后尝试将其放回的操作。我可以用“\u0FFF”分隔符来复制它,这是一种简单的扩展方法。Aggregates1,s2=>s1+分隔符+s2。此外,根据win 8.1的字符映射,它是一个感叹号。如果我读对了,另一方面,0FFF是拉丁字母小写字母,并添加了有关实际编码的注释。当你说写一个字符串然后再读回时,你是指数据库?转换成一个用相同编码标记的c字符串?你能提供更多的细节吗?从数据库读回一个c字符串。我试过了,也用了欧元,但两个字符都没有在输入和输出时出现错误,也没有任何其他看起来像我发现了一个没有正确存储在该列编码中的字符。查看隐藏在引擎盖下的sql,似乎c并没有涉及太多,db在获得参数化sql时做了它最擅长的事情:DECLARE@p4 VarChar1000=N࿾'这是c中作为字符的int 4094,我检查了值,输入和c之间没有丢失任何东西,至少使用linqpad作为DAL,而不是通过集成测试。