【问题标题】:How do i handle POST->Session->page? ASP.NET我如何处理 POST->Session->page? ASP.NET
【发布时间】:2010-11-08 07:36:44
【问题描述】:

我让用户提交了一个表单,如果我的垃圾邮件过滤器捕获到它,我会将用户重定向()到一个验证码页面,以确保它不是机器人(reCaptcha 似乎还没有被破坏)。

我的问题是如何处理返回到原始页面?

我在想我可以生成一个随机数(检查是否存在具有该数字的当前会话标签),将所有 POST 数据推送到一个对象中,将对象放入 ses[randomId]=obj;在 GET 数据 (?sesTag=randId) 中附加 ID,然后在用户正确通过验证码时从 ses 中提取数据。这是一个好的解决方案吗?将对象放入会话中是否有问题?

如何将帖子数据推送到字典中?我可以编写一个 foreach 循环将所有数据推送到字典中吗?或者我会得到足够的对象来吃掉内存吗? (我正在推送有很多键的 HttpContext.Current.Request.Params)

【问题讨论】:

    标签: c# asp.net security session post


    【解决方案1】:

    我不确定这是一个好的解决方案,但如果您必须使用它(或者直到有人发布更好的替代方案),您可以将 Request.Params 存储到会话中。

    Request.Params(或Request.Form)是可序列化的NameValueCollection,因此即使您使用进程外会话状态,将其存储在会话中也不会有问题。 IOW,您不需要将数据提取到单独的字典中。

    【讨论】:

    • 您不需要,但最好只在服务器端保存经过验证和预期的数据。恶意用户可以在帖子中发送兆字节(或更多)的数据。他还可以发送数百(或更多)不同的参数。该数据可能包含恶意字符串,旨在利用日志文件查看器、会话缓存引擎或任何东西中的漏洞。永远不要相信用户提供的数据并且未经测试就存储它。
    【解决方案2】:

    为什么不把验证码放在原始页面上,省点麻烦呢?

    【讨论】:

    • 因为验证码仅在用户被怀疑为垃圾邮件机器人时才会显示给用户。在这里拯救程序员的悲痛,只会将这种悲痛反映到每个用户身上。
    • 因此,如果您怀疑是垃圾邮件机器人,请仅将其添加到原始页面。您可以隐藏它,也可以在需要时动态添加它。
    • 克里斯是对的 - 我的意思是他描述的方式。仅显示可能的垃圾邮件候选者。
    【解决方案3】:

    您永远不应该存储或处理任意参数。接收用户发布数据的页面应该确切地知道期望哪些参数以及它们可能采用的格式。

    首先验证每个预期参数,如果验证通过(垃圾邮件机器人标准除外),则使用经过验证的参数填充对象并将该对象保存在会话中。如果验证码成功,您可以将其取回。

    编辑

    针对您的评论:从安全 POV 来看,您正试图在过高的级别上构建您的功能。由于没有“本地知识”,您别无选择,只能让自己面对安全问题。考虑一下如何在较低级别引入您的方法调用。

    这是一个松散的例子:

    让每个页面/控制器/动作/任何东西首先验证自己的数据(只有本地代码知道如何验证自己的数据),然后让每个动作调用你的垃圾邮件过滤器/重定向组件/方法,传递经过验证的表单数据它希望与需要进行垃圾邮件检查的字段名一起保留。

    您的方法可以对潜在问题字段进行垃圾邮件检查、持久化数据并重定向到重新验证码。

    在伪代码中,每个需要检查垃圾邮件的 Web 操作都可以执行以下操作。它只需要一个方法调用 例如

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

    }

    【讨论】:

    • 我阅读了您的评论stackoverflow.com/questions/1085764/… 这真的有问题吗?我想将此解决方案用作可以在任何页面/情况下使用的通用功能。
    • 有问题吗?好吧,如果您想让我将数百 GB 的数据放入您的会话存储并填满您的磁盘:不,这不是问题。如果您希望系统中存在的恶意数据稍后在您的代码发展时咬住您,并且您在 6 个月后开始以不同的方式处理请求:不,这不是问题。哦,你想让这段代码在很多地方使用——现在它的 n 次“不是问题”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多