我有两个网站A和B都是用ASP.NET MVC 3编写的。在网站A中有一个表格需要通过POST方法提交给网站B.用户可以选择直接发布或在加密值后发布。
当我提交没有加密的表单时,它是简单的form.submit(),我可以使用FormCollection对象获取网站B中的值。但是当用户选择加密后提交时,我会重定向到网站A本身发生加密的另一个操作,然后将此加密数据放在相应视图中的隐藏文本框中,然后使用jQuery在页面加载时自动提交到网站B.但是现在我无法在网站B上的FormCollection对象中获取任何值。
问题是什么?这是否因为任何安全功能而发生,以防止XSS或类似的东西?
答案 0 :(得分:2)
它的XSS保护令人怀疑 - 在这种情况下你会看到一个例外。 加载fiddler并确保在表单中的某个元素中看到此数据,该数据将发布到网站b。如果它以提交的形式存在 - 它应该可用。
答案 1 :(得分:1)
没有使用HTTPS并直接将表单提交到网站B的任何原因?
<form action="https://siteb/someaction" method="POST">
<input type="text" name="key1" value="value1" />
<input type="text" name="key2" value="value2" />
<input type="text" name="key3" value="value3" />
<input type="submit" value="Go ahead" />
</form>
如果您有任何理由将值加密为单个隐藏输入并使用javascript提交包含此隐藏字段的表单,则只有隐藏字段的值将发送到站点B.例如,如果你有以下形式:
<form action="http://siteb/someaction" method="POST">
<input type="hidden" name="encrypted" value="some encrypted value" />
</form>
在网站B上你会像这样获取加密值(不要使用FormCollection,它与视图模型相比有点难看):
[HttpPost]
public ActionResult SomeAction(string encrypted)
{
// TODO: decrypt the encrypted value here to get the orginal string
...
}
更优雅的方法是在站点B上定义一个视图模型,并为此模型定制一个模型绑定器,它将执行解密,以便操作看起来像这样:
[HttpPost]
public ActionResult SomeAction(SomeViewModel model)
{
// Directly use the model with all the fields in it.
// The custom model binder will take care of the creating it
// from the encrypted request string
...
}