我有一个购物车的结账流程,当前用户在完成购买后,会在会话中存储信用卡数据以供检索.设置购买过程,使得用户输入信用卡,查看确认页面,然后完成订单.确认和终止操作是需要访问信用卡数据的唯一两个操作,并且为了安全,所有其他操作都应该丢弃它.
如果没有在基本控制器中进行反射来检查用户正在调用的当前操作,我想不出一种优雅的方法来丢弃不允许的请求上的数据.此外,如果用户在输入数据后未能提出另一个请求,它将在会话中停留,直到他们回到网站 - 每当发生这种情况时.我提出的一个建议是将数据加密到隐藏字段并依赖SSL票证来防止缓存标记.这似乎是一种相当安全的方法,但我不太喜欢将信用卡数据放在用户可访问的位置加密或不加密的想法.存储在数据库中是因为客户端不希望保存信用卡数据.
在多个页面请求中临时保存信用卡信息等敏感数据的理想方法是什么?
也许有人可以告诉我这是否是一个充分的方法.我已经设置了存储在会话中的购物车,每次创建对象时都会生成一个唯一的Guid,并且Guid用作加密和解密我使用Rijndael算法序列化的信用卡数据的密钥.然后,加密的卡数据在隐藏字段中传递给用户,并在单击完成后反序列化.最终结果是一个像这样的字符串:
VREZ%2bWRPsfxhNuOMVUBnWpE%2f0AaX4hPgppO4hHpCvvwt%2fMQu0hxqA%2fCJO%2faOEi%2bX3n9%2fP923mVestb7r8%2bjkSVZDVccd2AJzCr6ak7bbZg8%3d
Run Code Online (Sandbox Code Playgroud)
public static string EncryptQueryString(object queryString, Guid encryptionKey)
{
try
{
byte[] key = Encoding.UTF8.GetBytes(ShortGuid.Encode(encryptionKey).Truncate(16));//must be 16 chars
var rijndael = new RijndaelManaged
{
BlockSize = 128,
IV = key,
KeySize = 128,
Key = key
};
ICryptoTransform transform = rijndael.CreateEncryptor();
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
{
byte[] buffer = Encoding.UTF8.GetBytes(queryString.ToString());
cs.Write(buffer, 0, buffer.Length);
cs.FlushFinalBlock();
cs.Close();
}
ms.Close();
return HttpUtility.UrlEncode(Convert.ToBase64String(ms.ToArray()));
}
} …Run Code Online (Sandbox Code Playgroud) 假设下面的方法被.net 4应用程序中的不同线程调用了几千次.处理这种情况的最佳方法是什么?了解磁盘是这里的瓶颈,但我希望WriteFile()方法快速返回.
数据可以高达几MB.我们在谈论线程池,TPL等吗?
public void WriteFile(string FileName, MemoryStream Data)
{
try
{
using (FileStream DiskFile = File.OpenWrite(FileName))
{
Data.WriteTo(DiskFile);
DiskFile.Flush();
DiskFile.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
Run Code Online (Sandbox Code Playgroud) 如果用户登录该网站,并说"记住我",我们会获得该用户的唯一标识符,使用密钥大小为256的RijndaelManaged加密,并将其放入一个设置过期的httponly cookie中.120天,每次成功请求刷新到服务器的到期时间.
可选地,我们基于用户代理和ipv4地址的一部分(最后两个八位字节)生成初始化向量.
显然,没有真正的到期系统,用户可以在技术上永远使用这个加密密钥(假设我们不更改服务器端密钥).
我考虑过这样一个事实,即允许这个功能,我需要允许用户绕过登录并给我他们唯一的ID(这是一个guid),我认为单独的guid很难猜到一个真正的用户guid,但是会让网站开放受到生成guid的botnots的攻击(我不知道他们找到一个合法的guid是多么现实)..所以这就是为什么服务器知道加密密钥的加密,以及可选的iv特定于浏览器和ip部分.
我是否应该考虑服务器发出与用户关联的票证的不同方法,并且这些票证将具有已知的到期日期,以便服务器保持对期满的控制权?我真的应该关心到期吗?还记得我记得我吗?
期待被贬低;),干杯.
我正在尝试获取ListView上显示的滚动条的高度和宽度.是否有捷径可寻?我做了一些google'ing,看起来它可能是一个系统设置.我只是不确定在哪里看.
public int this[int x, int y]
{
get { return (x + y); }
}
Run Code Online (Sandbox Code Playgroud) 我想将批处理脚本的标准输出设置为转到文件.如果可能的话,我想在脚本中执行此操作.
注:我不希望这样做:foo.bat > StdOut.txt
我想在脚本中做一些事情来将输出重定向到文件
例如:
foo.bat
:: Redirect standard output to StdOut.txt
:: Insert batch code to do what I want here.
Run Code Online (Sandbox Code Playgroud) 我正在尝试将ViewModel中的变量作为参数发送到命令.该命令如下所示:
public class EditPersonCommand : ICommand
{
private bool _CanExecute = false;
public bool CanExecute(object parameter)
{
PersonModel p = parameter as PersonModel;
CanExecuteProperty = (p != null) && (p.Age > 0);
return CanExecuteProperty;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter) { }
private bool CanExecuteProperty
{
get { return _CanExecute; }
set
{
if (_CanExecute != value)
{
_CanExecute = value;
EventHandler can_execute = CanExecuteChanged;
if (can_execute != null)
{
can_execute.Invoke(this, EventArgs.Empty);
}
}
}
}
} …Run Code Online (Sandbox Code Playgroud) 我遇到了ASP.NET 2.0应用程序的问题.我们的网络人员刚刚提高了我们的安全性,现在每当我尝试访问应用程序时,我都会遇到浮动错误:
"此实现不是Windows平台FIPS验证的加密算法的一部分."
我做了一些研究,听起来像ASP.NET使用RijndaelManaged AES加密算法来加密页面的ViewState ......而RijndaelManaged是在不符合FIPS的算法列表中.我们当然没有明确地调用任何加密算法......更不用说不合规列表上的任何内容了.
我猜这个ViewState业务对我来说很有意义.但是,我无法摆脱困境的是如何处理它.我发现了一篇知识库文章建议使用web.config设置指定一个不同的算法......但要么没有坚持,要么该算法不符合鼻烟.
所以:
1)RijndaelManaged/ViewState实际上是问题吗?还是我在错误的树上吠叫?
2)如何指定使用什么算法而不是RijndaelManaged?我有一份符合和不符合的算法列表; 我只是不确定在哪里插入这些信息.
谢谢!
理查德
我目前正在开发一个C#应用程序.
我需要使用带有组合框的枚举来获取所选月份.我有以下内容来创建枚举:
enum Months
{
January = 1,
February,
March,
April,
May,
June,
July,
August,
September,
October,
November,
December
};
Run Code Online (Sandbox Code Playgroud)
然后我使用以下内容初始化组合框:
cboMonthFrom.Items.AddRange(Enum.GetNames(typeof(Months)));
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,但问题是当我尝试获取所选月份的选定枚举值
要从组合框中获取枚举器的值,我使用了以下内容:
private void cboMonthFrom_SelectedIndexChanged(object sender, EventArgs)
{
Months selectedMonth = (Months)cboMonthFrom.SelectedItem;
Console.WriteLine("Selected Month: " + (int)selectedMonth);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试运行上面的代码时,会出现一个错误,指出System.InvalidCastException发生了类型的第一次机会异常.
我做错了什么.
感谢您的任何帮助,您可以提供
这是我班上的一个片段:
public bool start()
{
Thread startThread = new Thread(this.ThreadDealer);
startThread.Start();
return _start;
}
Run Code Online (Sandbox Code Playgroud)
在ThreadDealer()中,我将布尔变量"_start"设置为false或true.我现在需要但似乎无法弄清楚是一个事件来提醒start()在ThreadDealer() - Thread完成时执行它的return语句.
我尝试使用AutoResetEvent和.WaitOne(),但是因为我有一个只阻止所有内容的GUI,而它完成了我需要它做的事情(等待线程完成),如果它阻止我的GUI就没用了.
任何帮助将非常感激.