programing

JSON을 반환하는 GET 요청은 기본적으로 허용되지 않는 이유는 무엇입니까?

stoneblock 2023. 3. 15. 17:47

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