KSK의 IT 블로그

[C#] __RequestVerificationToken 에 path 지정 AntiForgeryToken 커스텀 함수

web/ASP.NET MVC
1. 목적

__RequestVerificationToken 의 쿠키의 경우 기본 path 가 '/' 잡혀 request 마다 따라 다니게 되는데 실제로 폼 인증에 1회성으로 밖에 사용하지 않는데도 무신경하게 놔두는데 불필요하게 request 트래픽만 잡아 먹고 있으니 필요한 곳에서만 쓰게 제한할 필요가 있다.

2. 구현

이미 기본형을 구현해 놓은 링크가 있어서 최근 버전에 맞게 수정했다.

원문 : https://colinnewell.wordpress.com/2009/01/28/tweaking-the-antiforgerytoken-on-aspnet-mvc/


수정 소스

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web; using System.Web.Mvc; namespace Ksk.Security { public static class KskAntiForgeryExtentions { public static MvcHtmlString KrAntiForgeryToken(this HtmlHelper helper, string path = null) { HttpContextBase context = helper.ViewContext.HttpContext; context.Request.Cookies.Remove("__RequestVerificationToken"); MvcHtmlString fragment = helper.AntiForgeryToken(); HttpCookie cookie = context.Response.Cookies["__RequestVerificationToken"]; cookie.Path = string.IsNullOrEmpty(path) ? context.Request.ApplicationPath : path; return fragment; } } }


3. 어느게 더 편한가?

        //
        // Summary:
        //     Generates a hidden form field (anti-forgery token) that is validated when the
        //     form is submitted.
        //
        // Returns:
        //     The generated form field (anti-forgery token).
        public MvcHtmlString AntiForgeryToken();
        //
        // Summary:
        //     Generates a hidden form field (anti-forgery token) that is validated when the
        //     form is submitted. The field value is generated using the specified salt value.
        //
        // Parameters:
        //   salt:
        //     The salt value, which can be any non-empty string.
        //
        // Returns:
        //     The generated form field (anti-forgery token).
        [EditorBrowsable(EditorBrowsableState.Never)]
        [Obsolete("This method is deprecated. Use the AntiForgeryToken() method instead. To specify custom data to be embedded within the token, use the static AntiForgeryConfig.AdditionalDataProvider property.", true)]
        public MvcHtmlString AntiForgeryToken(string salt);
        //
        // Summary:
        //     Generates a hidden form field (anti-forgery token) that is validated when the
        //     form is submitted. The field value is generated using the specified salt value,
        //     domain, and path.
        //
        // Parameters:
        //   salt:
        //     The salt value, which can be any non-empty string.
        //
        //   domain:
        //     The application domain.
        //
        //   path:
        //     The virtual path.
        //
        // Returns:
        //     The generated form field (anti-forgery token).
        [EditorBrowsable(EditorBrowsableState.Never)]
        [Obsolete("This method is deprecated. Use the AntiForgeryToken() method instead. To specify a custom domain for the generated cookie, use the <httpCookies> configuration element. To specify custom data to be embedded within the token, use the static AntiForgeryConfig.AdditionalDataProvider property.", true)]
        public MvcHtmlString AntiForgeryToken(string salt, string domain, string path);


[mssql] 구성 요소 'Ole Automation Procedures'이(가) SQL Server 보안 구성의 일부로 해제되었으므로 이 구성 요소의 프로시저 'sys.sp_OACreate'에 대한 액세스가 차단되었습니다. 시스템 관리자는 sp_configure..

DB/mssql

구성 요소 'Ole Automation Procedures'이(가) SQL Server 보안 구성의 일부로 해제되었으므로 이 구성 요소의 프로시저 'sys.sp_OACreate'에 대한 액세스가 차단되었습니다. 

시스템 관리자는 sp_configure를 사용하여 'Ole Automation Procedures'의 사용을 활성화할 수 있습니다. 

'Ole Automation Procedures' 활성화 방법은 SQL Server 온라인 설명서의 "노출 영역 구성"을 참조하십시오.


관련 문서 

https://docs.microsoft.com/ko-kr/sql/relational-databases/system-stored-procedures/ole-automation-stored-procedures-transact-sql

Ole Automation Procedures 대상 spsp_OACreate	
sp_OAMethod
sp_OADestroy	
sp_OASetProperty
sp_OAGetErrorInfo	
sp_OAStop
sp_OAGetProperty



1. 쿼리에서 설정/해제 방법


관련문서

https://docs.microsoft.com/ko-kr/sql/database-engine/configure-windows/ole-automation-procedures-server-configuration-option


1-1. 고급옵션 상태보기

EXEC sp_configure 'show advanced options'; 
GO



1-2. Ole Automation Procedures 상태보기

-- Show Ole Automation Procedures, 0 = disabled, 1 = enabled 
EXEC sp_configure 'Ole Automation Procedures'; 
GO

활성화 되지 않는 상태에서는 "구성 옵션 'Ole Automation Procedures'이(가) 없거나 고급 옵션입니다." 오류 발생합니다.


1-3. 고급옵션 활성화

sp_configure 'show advanced options', 1; 
GO
--> 구성 옵션 'show advanced options'이(가) 0에서 1(으)로 변경되었습니다. RECONFIGURE 문을 실행하여 설치하십시오.
RECONFIGURE; 
GO
--> 명령이 완료되었습니다.


1-4. Ole Automation Procedures 활성화

-- Enable the Ole Automation Procedures 
sp_configure 'Ole Automation Procedures', 1; 
GO 
--> 구성 옵션 'Ole Automation Procedures'이(가) 0에서 1(으)로 변경되었습니다. RECONFIGURE 문을 실행하여 설치하십시오.
RECONFIGURE; 
GO 
--> 명령이 완료되었습니다.


1-5. 고급옵션 비활성화

sp_configure 'show advanced options', 0; 
GO 
--> 구성 옵션 'show advanced options'이(가) 1에서 0(으)로 변경되었습니다. RECONFIGURE 문을 실행하여 설치하십시오.
RECONFIGURE; 
GO
--> 명령이 완료되었습니다.


1-6. Ole Automation Procedures 비활성화

-- Disable the Ole Automation Procedures 
sp_configure 'Ole Automation Procedures', 0; 
GO 
--> 구성 옵션 'Ole Automation Procedures'이(가) 1에서 0(으)로 변경되었습니다. RECONFIGURE 문을 실행하여 설치하십시오.
RECONFIGURE; 
GO
--> 명령이 완료되었습니다.



1-7. 활성화 순서


1-3 -> 1-4


Ole Automation Procedures 상태보기는 활성화 상태에서만 가능


1-8. 비활성화 순서


1-5 -> 1-6


2. Sql Server Management Studio (SSMS) 에서 설정/해제 하는 방법

관련문서

https://docs.microsoft.com/ko-kr/sql/relational-databases/security/surface-area-configuration

- 위의 쿼리에서 복잡하게 했던 작업을 SSMS 에서는 true / false 변경으로 손쉽게 합니다.

개체 탐색기 (우클릭) > 패싯


OleAutomationEnabled - True/False > 확인


[javascript] 모달 사용시 콜백 예제

js/jQuery

  모달 라이브러리를 사용할 일이 많은데 보통 모달창을 열고 닫거나 확인 할때 함수를 실행해야합니다. 콜백 함수를 open 에 넣어주는데 없을때 간단하게 구현해주는 예제입니다.


1. 모달 js


// modal javascript
var _data = { a : null , b : null };
_data.isCallbackExists = false;

var _callback = {};

//modal open
_data.open = function (callback) {
    $("{{Modal DIV}}").modal();

    if (callback) {
        _data.isCallbackExists = true;

        _callback.run = function (data) {
            var runCallback = function (data) {
                callback(data);
            }
            runCallback(_data);
        }.bind(this);
    } 
}

//modal save
_data.save = function(){
  _data.a = 'Y';
  _data.b = 'Y';
  
  if(isCallbackExists)
    _callback.run(_data);
  }
}


2. 호출 js


//외부 javascript
var _popup = { a : null, b : null };
_popup.run = function(data){
  console.log('data : ' + JSON.stringify(data));
}

_data.open(_popup.run);