伪造的POST请求可以由不受信任的网站构建,方法是创建表单并将其发布到目标站点。但是,此POST的原始内容将由浏览器编码为以下格式:
param1=value1¶m2=value2
不受信任的网站是否可以构建包含任意原始内容的伪造POST - 例如字符串化的JSON?
{param1: value1, param2: value2}
换句话说:网站是否会导致浏览器将任意内容发布到第三方域?
答案 0 :(得分:9)
HTML表单请求的POST正文始终为application/x-www-form-urlencoded,multipart/form-data或text/plain,因为它们反映了enctype
attribute的有效值。特别是text/plain
one can be used to form valid JSON data。因此,可以在此处使用基于表单的CSRF,但是,它要求服务器将其作为text/plain
接受。
此外,基于XHR的CSRF可用作XMLHttpRequest API allows so send arbitrary POST data。与此相关的唯一障碍是同源策略:只有当两者具有相同的来源或时,您的服务器才支持Cross-Origin Request Sharing并允许资源共享,这样的有效POST请求才能被伪造。 / p>
答案 1 :(得分:1)
是的!,POST请求只不过是具有发送到Web服务器的特定格式的文本。您可以使用IE或Chrome开发人员工具查看每个请求的外观。
所以是的,您可以创建伪造的POST请求并更改您想要的任何内容,但是如果请求格式不正确,大多数Web服务器都会拒绝它。
答案 2 :(得分:1)
网站的客户端代码很难伪造这样的请求,但服务器端代码可以很容易地做到这一点。
由于您的网站无法判断该请求是来自浏览器还是与浏览器一样的服务器,因此浏览器中的限制无法保护。
答案 3 :(得分:1)
您可以通过常规表单帖子创建有效的JSON。这只是创造性地命名表单参数的问题。特别是,参数名称可以包含引号。
http://blog.opensecurityresearch.com/2012/02/json-csrf-with-parameter-padding.html
答案 4 :(得分:0)
对于纯HTML表单,是的,它始终会根据spec进行编码。但是有other encoding schemes,例如MIME multipart。还有Javascript和XMLHttpRequest的问题。仅在一种情况下具体提到编码。这强烈暗示在其他情况下不应用编码。