JSON을 반환하는 GET 요청은 기본적으로 허용되지 않는 이유는 무엇입니까?
ASP의 일부로서NET MVC 2 베타 2 업데이트, JSON GET 요청은 기본적으로 허용되지 않습니다.를 설정할 필요가 있는 것 같습니다.JsonRequestBehavior
까지 수비하다.JsonRequestBehavior.AllowGet
반환하기 전에JsonResult
컨트롤러에서 오브젝트를 가져옵니다.
public JsonResult IsEmailValid(...)
{
JsonResult result = new JsonResult();
result.Data = ..... ;
result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
return result;
}
이 배경에는 어떤 이유가 있을까요?JSON GET을 사용하여 원격 검증을 시도할 경우 다른 기술을 사용해야 합니까?
DenyGet 기본값의 이유는 MSDN에서 Phil Hack의 블로그에 대한 링크를 통해 자세한 내용을 보기 위해서입니다.사이트 간 스크립팅 취약성인 것 같습니다.
HTTP GET은 ASP의 일부로서 디폴트로 디세블로 되어 있습니다.NET의 사이트 간 요구 위조(CSRF/XSRF) 보호.웹 서비스가 GET 요청을 수락하는 경우 웹 서비스는 다음을 통해 요청을 수행하는 서드파티 사이트에 취약해질 수 있습니다.<script />
태그를 지정하고 JavaScript setter를 수정하여 응답을 수집할 수 있습니다.
단, GET 요구를 디세블로 하는 것만으로는 CSRF 공격을 막을 수 없습니다.또, 상기의 공격 타입으로부터 서비스를 보호하는 유일한 방법은 아닙니다.다양한 공격 벡터의 적절한 분석과 그에 대한 보호 방법에 대해서는 "사이트 간 요청 위조를 위한 견고한 방어"를 참조하십시오.
Visual Studio 2008에서 Visual Studio 2010으로 MVC 웹사이트를 이행할 때도 문제가 있었습니다.
메인 aspx에는 ViewData["Categories"]를 SelectList 컬렉션으로 채우기 위해 카테고리 컨트롤러를 호출하는 ViewData가 있습니다.서브카테고리 컨트롤러를 호출하여 두 번째 콤보를 Javascript로 채우는 스크립트도 있습니다.이제 이 두 번째 컨트롤러에서 AlloGet 속성을 추가하여 수정할 수 있었습니다.
여기 aspx와 javascript가 있습니다.
<head>
<script type="text/javascript" src="../../Scripts/jquery-1.4.1.min.js"></script>
<script type="text/javascript">
$(document).ready(function () {
$("#CategoryId").change(function () {
var categoryId = $(this)[0].value;
$("#ctl00_MainContent_SubcategoryId").empty();
$("#ctl00_MainContent_SubcategoryId").append("<option value=''>-- select a category --</option>");
var url = "/Subcategory/Subcategories/" + categoryId;
$.getJSON(url, { "selectedItem": "" }, function (data) {
$.each(data, function (index, optionData) {
$("#ctl00_MainContent_SubcategoryId").append("<option value='" + optionData.SubcategoryId + "'>" + optionData.SubcategoryName + "</option>");
});
//feed our hidden html field
var selected = $("#chosenSubcategory") ? $("#chosenSubcategory").val() : '';
$("#ctl00_MainContent_SubcategoryId").val(selected);
});
}).change();
});
</script>
<body>
<% using (Html.BeginForm()) {%>
<label for="CategoryId">Category:</label></td>
<%= Html.DropDownList("CategoryId", (SelectList)ViewData["Categories"], "--categories--") %>
<%= Html.ValidationMessage("category","*") %>
<br/>
<label class="formlabel" for="SubcategoryId">Subcategory:</label><div id="subcategoryDiv"></div>
<%=Html.Hidden("chosenSubcategory", TempData["subcategory"])%>
<select id="SubcategoryId" runat="server">
</select><%= Html.ValidationMessage("subcategory", "*")%>
<input type="submit" value="Save" />
<%}%>
서브 카테고리용 컨트롤러입니다.
public class SubcategoryController : Controller
{
private MyEntities db = new MyEntities();
public int SubcategoryId { get; set; }
public int SubcategoryName { get; set; }
public JsonResult Subcategories(int? categoryId)
{
try
{
if (!categoryId.HasValue)
categoryId = Convert.ToInt32(RouteData.Values["id"]);
var subcategories = (from c in db.Subcategories.Include("Categories")
where c.Categories.CategoryId == categoryId && c.Active && !c.Deleted
&& c.Categories.Active && !c.Categories.Deleted
orderby c.SubcategoryName
select new { SubcategoryId = c.SubcategoryId, SubcategoryName = c.SubcategoryName }
);
//just added the allow get attribute
return this.Json(subcategories, JsonRequestBehavior.AllowGet);
}
catch { return this.Json(null); }
}
이것이 디폴트 변경을 선택한 이유인지는 모르겠지만, 다음과 같은 경험이 있습니다.
일부 브라우저는 GET을 보면 결과를 캐시할 수 있다고 생각합니다.AJAX는 보통 서버에서 최신 정보를 가져오는 작은 요청에 사용되므로 이러한 결과를 캐싱하면 예기치 않은 동작이 발생합니다.특정 입력이 매번 같은 결과를 반환한다는 것을 알고 있는 경우(예를 들어 "비밀번호"를 비밀번호로 사용할 수 없습니다), GET은 문제 없습니다.또, 같은 입력을 여러 번 검증하려고 하는 경우 브라우저 캐싱은 실제로 성능을 향상시킬 수 있습니다.한편 서버측 데이터의 현재 상태에 따라 다른 답변이 필요한 경우(「myfavoriteusername」은 2분 전에 입수할 수 있었지만, 그 후에 취득한 것입니다), POST를 사용하여 브라우저가 최초의 응답이 아직 올바른 응답이라고 생각하지 않도록 해야 합니다.
언급URL : https://stackoverflow.com/questions/1625671/why-are-get-requests-returning-json-disallowed-by-default
'programing' 카테고리의 다른 글
Spring/Spring Boot pom.xml에서 Java 버전을 지정하는 방법 (0) | 2023.03.15 |
---|---|
Swagger JSON을 RAML/YAML로 변환 (0) | 2023.03.15 |
MongoDB 데이터베이스에 이미지 저장 (0) | 2023.03.15 |
XHR에서 응답 Content-Type 헤더를 가져옵니다. (0) | 2023.03.15 |
Oracle SQL Developer에서 쿼리 결과를 csv로 내보내는 방법 (0) | 2023.03.15 |