我到处读(并在实践中看到)用户名不应该是可更改的.当我问为什么时,'安全'是一个理由.
我一直在寻找一个明确的答案,为什么更改用户名是不安全的,但我似乎无法找到答案.
这里有经验丰富的安全人员可以回答这个问题吗?
注意:如果您不知道答案,请不要猜测.我自己想到了很多原因,但我不知道实际答案,因此问题.
更新:
1:通过userId我的意思是引用某种唯一标识符,无论是数据库记录ID还是其他一些唯一ID.我多次被告知,即使用户名不是系统本身的主要/唯一标识符,更改用户名也不利于安全性.
2:我允许用户更改他们的"公共名称".这是用于向其他(非特权)用户标识用户的名称.例如:
userId: 1234
username: john02
public name: John Jameson
email: j.jameson@dev.null
3:正如Jason和The Rook所指出的,一致性似乎是唯一的好理由.我觉得这种"最佳实践"可能是过去某个地方的剩余部分,当用户名在系统中实际用于唯一识别用户时.
我知道有几个帖子已经涉及演员和as运营商之间的区别.他们都大多重申相同的事实:
as运营商将不会抛出,但返回null如果转换失败as运算符仅适用于引用类型as操作者将不使用用户定义的转换运算符然后,答案倾向于无休止地讨论如何使用或不使用其中一个或每个的利弊,甚至是他们的表现(我根本不感兴趣).
但是这里还有更多工作要做.考虑:
static void MyGenericMethod<T>(T foo)
{
var myBar1 = foo as Bar; // compiles
var myBar2 = (Bar)foo; // does not compile ('Cannot cast expression of
// type 'T' to type 'Bar')
}
Run Code Online (Sandbox Code Playgroud)
请不要介意这个明显懊悔的例子是否是好的做法.我在这里关注的是两者之间非常有趣的差异,因为演员阵容不会编译,而不是as.我真的想知道是否有人可以对此有所了解.
正如人们常说的那样,as运营商忽视了用户定义的转换,但在上面的例子中,显然两者的能力更强.请注意,as就编译器而言,类型T和Bar之间(编译时未知)之间没有已知的连接.演员阵容完全是"运行时".我们是否应该怀疑演员阵容在编译时是全部还是部分解决而as操作员不是?
顺便说一下,添加类型约束毫不奇怪地修复了强制转换,因此:
static void MyGenericMethod<T>(T foo) where T : Bar
{
var myBar1 = foo as Bar; // compiles
var myBar2 = (Bar)foo; …Run Code Online (Sandbox Code Playgroud) 在使用#region(在C#和VB.NET中)维护大量代码之后,在我看来,这个构造只是程序员的一堆"make work".将dang事物放入代码中是有用的,然后他们使搜索和阅读代码非常烦人.
有什么好处?为什么编码人员会把这个放在他们的代码中.
让我成为一个信徒!
abstract class CAbstract
{
private string mParam1;
public CAbstract(string param1)
{
mParam1 = param1;
}
}
class CBase : CAbstract
{
}
Run Code Online (Sandbox Code Playgroud)
对于类CBase,应该通过提供参数来初始化它,那么如何禁用CBase类的无参数构造函数?
我正在创建自己的字典,但我无法实现TryGetValue函数.当找不到密钥时,我没有任何东西要分配给out参数,所以我保持原样.这会导致以下错误:"必须在控制离开当前方法之前将out参数'value'分配给"
所以,基本上,我需要一种方法来获取默认值(0,false或nullptr取决于类型).我的代码类似于以下内容:
class MyEmptyDictionary<K, V> : IDictionary<K, V>
{
bool IDictionary<K, V>.TryGetValue (K key, out V value)
{
return false;
}
....
}
Run Code Online (Sandbox Code Playgroud) 我已经编程了10年,主要是在vba和vb.net,但我知道c#足以编写我通常做的事情.我昨天申请了一个高级c#职位,我在感应测试中做得很差,这不好笑:)
我总是发现,对我而言,学习和回忆的最佳方式是通过问答(多选和简答).也就是说,提出了一个问题,在我回答之后,我会给出关于我是选择对错的原因以及原因.
因此,我想知道是否有人知道或可以推荐一个C#测验网站.有点像每日c#测验,以保持我的大脑最新和新鲜,如果我不总是编程.也不是什么懦弱的东西.能做到一切的东西.支付不是一个障碍,我更喜欢支付一个好的资源而不是捣蛋.
谢谢
我正在尝试编写一个通用的Parse方法,该方法转换并返回NamedValueCollection中的强类型值.我尝试了两种方法,但这两种方法都通过装箱和拆箱来获得价值.有谁知道避免拳击的方法?如果你在生产中看到这个你会不喜欢它,它的性能有多糟糕?
Usuage:
var id = Request.QueryString.Parse<int>("id");
Run Code Online (Sandbox Code Playgroud)
尝试#1:
public static T Parse<T>(this NameValueCollection col, string key)
{
string value = col[key];
if (string.IsNullOrEmpty(value))
return default(T);
if (typeof(T) == typeof(int))
{
//return int.Parse(value); // cannot convert int to T
//return (T)int.Parse(value); // cannot convert int to T
return (T)(object)int.Parse(value); // works but boxes
}
if (typeof(T) == typeof(long))
{
return (T)(object)long.Parse(value); // works but boxes
}
...
return default(T);
}
Run Code Online (Sandbox Code Playgroud)
尝试#2(使用反射):
public static T Parse<T>(this NameValueCollection col, string key)
{
string value …Run Code Online (Sandbox Code Playgroud) 我理解使用标准MS事件处理程序委托签名的好处,因为它允许您轻松扩展通过事件传递的信息,而不会破坏任何基于旧委托签名的旧关系.
我想知道在实践中人们经常遵循这条规则吗?说我有一个像这样的简单事件
public event NameChangedHandler NameChanged;
public delegate void NameChangedHandler(Object sender, string oldName, string newName);
Run Code Online (Sandbox Code Playgroud)
这是一个简单的事件,我几乎肯定我从NameChanged事件中需要知道的唯一参数是名称已更改的对象,旧名称和新名称.那么创建一个单独的NameChangedEventArgs类是否值得,或者像这样的简单事件是否可以直接通过委托参数返回参数?
我有一个大约10,000个工作人员的列表,List<T>我有一个ListBox包含这些工作人员的子集,具体取决于文本框中的搜索词.
假设某个Staff对象具有以下公开公开的属性:
string FirstName
string LastName
string MiddleName
int StaffID
int CostCentre
Run Code Online (Sandbox Code Playgroud)
我可以写一个这样的函数:
bool staffMatchesSearch(Staff stf)
{
if (tbSrch.Text.Trim() == string.Empty)
return true; // No search = match always.
string s = tbSrch.Text.Trim().ToLower();
// Do the checks in the order most likely to return soonest:
if (stf.LastName.ToLower().Contains(s))
return true;
if (stf.FirstName.ToLower().Contains(s))
return true;
if (stf.MiddleName.ToLower().Contains(s))
return true;
if (stf.CostCentre.ToString().Contains(s))
return true; // Yes, we want partial matches on CostCentre
if (stf.StaffID.ToString().Contains(s))
return true; // …Run Code Online (Sandbox Code Playgroud) 人们在他们的Greasemonkey脚本中使用了哪些鲜为人知但有用的功能和技术?
(请注意,每个答案只有一个功能.)
类似主题:
c# ×7
.net ×2
generics ×2
c ×1
clr ×1
coding-style ×1
constructor ×1
eventargs ×1
events ×1
greasemonkey ×1
inheritance ×1
javascript ×1
reflection ×1
search ×1
security ×1
string ×1