Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >开发人员应该如何处理与路由变量冲突的表单POST变量?

开发人员应该如何处理与路由变量冲突的表单POST变量?
EN

Security用户
提问于 2013-11-25 16:26:03
回答 2查看 2K关注 0票数 1

在ASP.NET MVC中,当我向/controller/action/UserID执行HTTP时.

并有一个相应的路线/controller/action/{UserID} ..。

如果我做了表单发布,POSTed data UserID会覆盖路由最初说的任何内容。(至少在ASP.NET MVC4中是这样的)

对我来说,这说明了几点:

  • 别相信网址..。因为POSTed数据可能隐藏真实发生的事情。
  • 任何能够猜出ASP.NET MVC中路由变量名的人都可以将意外的数据放入控制器中。
  • .?

问题

  • 这种行为在其他MVC框架(Rails等)之间是否一致?
  • 有什么方法可以防止这种意想不到的结果呢?每个帖子应该与URL参数交叉检查吗?
EN

回答 2

Security用户

发布于 2013-11-27 02:41:18

别相信网址..。因为POSTed数据可能隐藏真实发生的事情。

URL应该被视为客户端的值,而且无论如何都不应该被信任。任何人都可以轻松地更改URL,并且可以轻松地为任何UserID创建一个帖子。

任何能够猜出ASP.NET MVC中路由变量名的人都可以将意外的数据放入控制器中。

无论如何,这都可以通过参数篡改来实现。在本指南中有一些有用的提示:http://msdn.microsoft.com/en-us/magazine/hh580736.aspx

具体来说

那是什么?参数篡改是一种攻击,其中参数被修改,以改变应用程序的预期功能。参数可能位于表单、查询字符串、cookie、数据库等上。我将讨论涉及基于Web的参数的攻击。它是如何被利用的?攻击者更改参数以欺骗应用程序执行它不打算执行的操作。假设您通过从查询字符串读取用户ID来保存用户的记录。这安全吗?不是的。攻击者可以篡改应用程序中的URL

在MVC中,这可以通过模型绑定实现:

模型绑定是(MVC)的一个重要特性,它有助于参数检查,因为Order对象上的属性将根据表单信息自动填充并转换为其定义的类型。..。只是要小心限制允许填充哪些属性,同样,对于重要项,不要信任页面数据。..。请注意,我在这里使用约束(排除) attrib来限制MVC绑定到我的模型中的内容,以便控制我所做或不信任的事情。这确保了UserId不会来自表单数据,因此不会被篡改。

因此,您还应该注意,您的视图中不存在的表单参数不能被恶意用户篡改和添加。您可以通过添加Exclude属性来做到这一点:

public ActionResult Edit([Bind(Exclude="UserId")] Order order)

这种行为在其他MVC框架(Rails等)之间是否一致?

不确定,但我不认为这是一个缺陷,因为权限检查应该进行的帖子和你的得到。您的应用程序不应该仅仅因为一个错误的断言,即必须首先加载了带有POSTed窗体的URL,就假定一个被称为的URL具有这样做的权限。

有什么方法可以防止这种意想不到的结果呢?每个帖子应该与URL参数交叉检查吗?

您的代码应该决定使用路由变量或POST变量(如果它是从MVC提供给您的,作为一个名为UserID的方法变量,那么为什么不使用它,如果它来自POST数据或URL,只要您是一致的),然后根据它做出所有逻辑决策。这包括最初的授权,以及处理和业务逻辑--它们都应该使用价值的相同来源,以确保只有在授权时才能执行操作。

票数 2
EN

Security用户

发布于 2015-03-16 22:53:16

如果要分离或区分GET/POST操作,则应使用AcceptVerbs属性。例如,若要强制某个操作仅响应POST请求,请向其添加以下属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[AcceptVerbs(HttpVerbs.Post)]

并将以下内容添加到GET 1中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[AcceptVerbs(HttpVerbs.Get)]

通过这样做,可以确保只有理想的请求类型(GET、POST、.)可以触摸动作的方法。

关于您问题的另一面,有一个与所有MVC框架相关的web攻击称为Over Posting,如果您完全依赖于模型绑定器,就会发生这种攻击。为了防止这种攻击,你有两种方法:

  • 使用视图模型
  • 使用Bind属性

我想第一个问题很清楚。大约第二步,您可以强化一个POST操作方法,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[AcceptVerbs(HttpVerbs.Get)]     
public ActionResult AddComment([Bind(Include = "Name, Email, CommentText")] Comment model)

此外,还可以将Bind属性添加到模型定义本身。

票数 0
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/46048

复制
相关文章
通过 JavaScrpit 传递 Post 变量
使用 Get 方式方式传递变量会把 URL 搞得很长,而且 IE 会对长度有限制,所以最好的方式还是通过 Post 方式来传递变量。但是通过 Post 来传递变量的时候一定要有个表单,很多时候页面上并没有表单,所以这个时候可以隐藏表单,然后通过 JavaScript 来提交表单。下面是个隐藏表单的例子:
Denis
2023/04/13
6930
类变量与对象变量
# 类变量与对象变量 # 代码 # coding=UTF-8,类变量与对象变量 class Robot: """表示有一个带有名字的机器人。""" # 一个类变量,用来计数机器人的数量 population = 0 # 这是一个类变量,属于Robot类 def __init__(self, name): # name变量属于一个对象(通过self分配),因此它是一个对象变量 """初始化数据""" self.name = name
benym
2022/07/14
9280
批处理变量详谈
他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值, 不需要我们来给他赋值,我们只需要调用而以!
HUC思梦
2020/09/03
8610
测试人员该如何平衡与开发人员之间的冲突?
为什么两者之间会产生冲突? 因为开发与测试在某个程度上来说是两个行为相反的职位。开发代表着创造,而测试代表着摧毁。因为测试的目的就是以各种方式不断地从开发出来的软件中发现大大小小的各种缺陷,所以很多开发人员心里都感觉测试人员是在故意找茬,让自己难堪,证明自己做的东西不好,所以两者的矛盾必然会慢慢地产生。 职位的优越感。很多开发人员都认为测试的比自己低一等,因为开发自己是创造东西,而测试只是拿着自己做的东西在工作。所以很多开发人员对测试人员的脸色都不怎么好。 失败的沟通。在需求的理解或者说是测试发现问题时,测
软件测试君
2021/07/09
1.7K0
python的全局变量与局部变量
自定义函数里面的a要想变成全局变量,可以使用global,同时外面也需要定义一下a;
bye
2020/10/29
6910
静态变量与动态变量
1)静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。静态变量,全局动态变量都是静态存储
全栈程序员站长
2022/09/01
1.5K0
静态变量与动态变量
Lua⭐️全局变量与局部变量的使用、多变量同时赋值
星河造梦坊官方
2024/08/14
1210
如何理解变量?
看起来,它并不是一件需要特别的知识铺垫才能正确理解的东西。但是,也许正因为如此,我们总是并没有很好地厘清这个概念的内涵。它和数学中的变量是一个概念吗?
高一峰
2020/09/22
1.5K0
如何理解变量?
[C语言] 常量与变量
说明:系统会在字符串尾部添加一个字符串作为结束字符"\0",那么如图所示的长度实际上是6的原因! 
謓泽
2022/12/12
7200
[C语言] 常量与变量
Windows10 环境变量_环境变量与用户变量
大家好,又见面了,我是你们的朋友全栈君。 Windows 10 环境变量 (用户变量与系统变量)
全栈程序员站长
2022/10/01
2.2K0
Windows10 环境变量_环境变量与用户变量
Python 局部变量与全局变量
局部变量与全局变量 全局变量 在python脚本最上层代码块的变量 全局变量可以在函数内被读取使用 局部变量 在函数体内定义的变量 局部变量无法在自身函数以外使用 global 将全局变量可以在函数体内进行修改 定义一个全局变量 定义函数 global + 全局变量名 函数体内给全局变量重新赋值 工作中, 不建议使用global对全局变量进行修改 仅支持 数字 字符串 空类型 布尔类型 的声明 列表和字典的全局变量不需要global进行声明 代码 # coding:utf-8 name = 'dewe
Zkeq
2022/05/18
3520
static–静态变量与普通变量的区别
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
全栈程序员站长
2022/08/18
7600
static–静态变量与普通变量的区别
Python 再谈变量作用域与变量引用
var = 'global var in ClassOne' # 类中的全局变量
授客
2019/09/11
9290
Python 再谈变量作用域与变量引用
JavaScript全局变量与局部变量
在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它。(该变量的作用域是局部的)。
HaC
2020/12/30
7100
常量与变量
常量 简介: 常量代表是程序运行过程中,不能再次改变的值 作用: 1.固定的值,代表计算过程中经常用到的值,便于程序计算   如:圆周率 3.1415926..... 2.用来代表一个含义   如:
小沐沐吖
2022/09/09
3180
npm与nvm的冲突处理
node本身包含一个npm,后来本人通过它安装nvm来管理npm版本,长期以来一直相安无事,再后来在终端使用中莫名其妙出现一个奇怪问题——无论在独立终端,还是vscode的集成终端,输入以下命令都能打印一样结果:
IT晴天
2019/05/14
1.3K0
gccc如何处理static变量初始化
局部变量在C++中的使用要频繁的多,并且功能也强大的多,但是这些强大功能的背后无疑会引入问题的复杂性,不想让马儿吃草只想让马儿跑的事大家表乱想。这些初始化的实现就需要C++的库执行更多的动作来完成,虽然各种编译器都是像如今开展的“学雷锋”活动一样干了很多好事都没有留名,但是作为一个程序员,还是要对别人的贡献进行表彰。 我们看一下下面的一段代码,本文将会围绕这个代码进行展开,可以看到这个简单的程序,让C++生成了非常多的代码让人应接不暇
thierryzhou
2022/12/01
7600
es6中的let声明变量与es5中的var声明变量的区别,局部变量与全局变量
自己通过看typescript官方文档里的let声明,与阮一峰老师翻译的的es6学习文档,总结以下三点 1、var声明可以多次重复声明同一个变量,let不行 2、let变量只在块级作用域里面有效果,var 变量不存在块级作用域(块级作用域指用{}包装的代码块,个人理解) 3、let变量不会声明提前,var变量会 以下是具体例子 for(var i=0;i<10;i++){ setTimeout(function(){console.log(i)},1000); } 由于var声明的变量会声明提升var i
windseek
2018/06/14
1.3K0
ubuntu环境变量配置文件_环境变量与用户变量
Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量。系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效。
全栈程序员站长
2022/09/29
1K0
用Groovy处理JMeter变量
本来没打算写这个系列的,又看了看JMeter的文档,发现Groovy在JMeter中能发挥很多非常有趣的功能,虽然语法和API比较隐晦,但好得不多。
FunTester
2020/03/05
1.1K0
用Groovy处理JMeter变量

相似问题

隐藏算法与变量

10

如何决定SAML设置应该使用HTTP还是POST?

10

如何利用变量的值

10

路由协议如何处理恶意或错误路由器?

10

环境变量与秘密管理器

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文