我让用户提交表单,如果我的垃圾邮件过滤器捕获它,我将用户重定向()到验证码页面以确保它不是机器人(reCaptcha似乎还没有被破坏)。
我的问题是如何处理返回原始页面?
我在想我可以生成一个随机数(检查当前会话标记是否有该数字),将所有POST数据推送到一个对象中,将该对象放入ses [randomId] = obj;将ID附加到GET数据中(?sesTag = randId),然后在用户正确传递验证码时从ses中获取get数据。这是一个好的解决方案吗?将对象放入会话有问题吗?
如何将帖子数据推送到字典中?我可以编写一个foreach循环来将所有数据推送到dict中吗?还是我会得到足够的物品来吃掉记忆? (我正在推动有许多键的HttpContext.Current.Request.Params)
答案 0 :(得分:1)
你永远不应该存储或处理任意参数。接收用户发布数据的页面应准确知道要预期的参数以及可能的格式。
首先验证每个预期参数,如果验证通过 - 除了spambot标准 - 使用验证参数填充对象并将该对象保存在会话中。如果验证码成功,您可以将其取回。
修改
回应您的评论:从安全POV,您正试图在太高的水平上设计您的功能。没有“本地知识”,你别无选择,只能打开自己的安全问题。考虑如何在较低级别引入方法调用。
这是一个松散的例子:
让每个页面/控制器/动作/任何事先验证自己的数据(只有本地代码知道如何验证它自己的数据),然后让每个动作调用你的spambot过滤器/重定向组件/方法,传递经过验证的表单数据它希望与需要进行垃圾邮件检查的字段名一起保留。
您的方法可以垃圾邮件检查潜在的问题字段,保留数据并重定向到重新验证码。
在伪代码中,需要进行垃圾邮件检查的每个网络操作都可以执行以下操作。它只需要一个方法调用 例如
void someAction( untrustedData ) {
trustedData = object;
trustedData.id = makeInt( badData.id );
trustedData.name = safeCharsOnly( untrustedData.name );
trustedData.message = safeCharsOnly( untrustedData.message ); # <-- spam-check this
fieldsToSpamCheck = ['message'];
successUrlBase = '/myapp/sandwiches/postMessage';
if (!spamChecker.check( trustedData, fieldsToSpamCheck, successUrlBase )) {
// spamChecker will check specified params
// if not spam, it returns true
// if spam it sets a http redirect and returns false
return;
}
processData( trustedData );
}
答案 1 :(得分:0)
我不确定这是一个很好的解决方案,但是如果你必须使用它(或者直到有人发布更好的替代方案),你可以将Request.Params
存储到会话中。
Request.Params
(或Request.Form
)是NameValueCollection
,它是可序列化的,因此即使您使用的是进程外会话状态,也应该没有问题将其存储在Session中。 IOW,您不需要将数据提取到单独的字典中。
答案 2 :(得分:0)
为什么不将验证码放在原始页面上并为自己保留一些悲伤?