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

时间:2014-03-07 15:18:19

标签: c# nvarchar

我想对我们的应用进行安全测试。列和用户输入文本字段的最大长度设置为500。

目前我创建这样一个字符串的尝试是catalog.Reward_desc=Enumerable.Range(1,500).Select (e =>"ﻷ").Delimit(string.Empty);

看看我是否可以通过linqpad让我在一般的c#意义上搜索问题。

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

修改 - 添加信息

这是示例代码,我尝试查看是否在SQL_Latin1_General_CP1_CI_AS整理列中找到了无法正确存储的字符:

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();
}

2 个答案:

答案 0 :(得分:1)

写一个字符串,然后将其读回并比较值。如果您使用非ansi字母,则readed字符串很可能无效(例如,扩展字母将返回?

您选择的角色看起来很合适,但是,它取决于实际数据库的8位编码。

答案 1 :(得分:0)

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

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