Building block 개발자용 보안 API
Blackboard는 OWASP(Open Web Application Security Project)의 ESAPI(Enterprise Security API) 모범 사례 오픈 소스 보안 라이브러리와 통합되었습니다. 이 보안 라이브러리는 기본적으로 "ESAPI 보안 모듈"이라는 빌딩 블록을 통해 Blackboard에 설치되어 시스템 작동에 필수적입니다. Blackboard는 모든 빌딩 블록 개발자에게 OWASP Java용 ESAPI 및 JavaScript용 ESAPI를 기반으로 한 이 새로운 보안 API 활용을 강력히 권장합니다. 보안 API 변경 사항에는 모범 사례 구현뿐만 아니라 일관된 명명법을 통한 메서드 사용 편의성 향상이 포함됩니다.
참고
다음 릴리즈에서는 ESAPI 보안 모듈 빌딩 블록 API가 Blackboard 핵심 코드에 포함되어 기본적으로 사용 가능합니다.
사용자 입력이 신뢰할 수 있는지 여부와 상관없이, 서버 측에서는 처리하기 전에 입력 유효성 검사를 하고 표시하기 전에 출력 유효성 검사나 이스케이프를 해야 합니다. 시스템의 복원력을 보장하며 교차 사이트 스크립팅과 같은 보안 문제를 방지할 수 있습니다.
입력 유효성 검사
입력을 받을 때마다 유효성을 확인하고 서버 측에서도 항상 유효성을 검사해야 합니다. 블랙보드는 검증이 필요한 몇 가지 인기 있는 사용 사례를 구현하였습니다. 아래에 몇 가지 예시가 제공됩니다.
blackboard.platform.security.ValidationUtility.isValidDirectoryPath(문자열)
blackboard.platform.security.ValidationUtility.isValidGuid(문자열)
blackboard.platform.security.ValidationUtility.isValidEnumeratedType(열거형, 문자열)
출력 유효성 검사·인코딩·이스케이프
항상 입력이 적절한 맥락 안에서 표시되는지 확인하세요.
오버로딩에 대해 배우는 중
blackboard.platform.security.EscapeUtility.escapeForHTML(문자열)
blackboard.platform.security.EscapeUtility.escapeForHTMLAttribute(문자열)
blackboard.platform.security.EscapeUtility.escapeForJavascript(문자열)
blackboard.platform.security.EscapeUtility.escapeForUrl(문자열)
blackboard.platform.security.EscapeUtility.escapeForCSS(문자열)
blackboard.platform.security.EscapeUtility.escapeForXML(문자열)
blackboard.platform.security.EscapeUtility.escapeForXMLAttribute(문자열)
JSP 메서드
${bbNG:EscapeForHTML( String )}
${bbNG:EscapeForJavascript( String )}
${bbNG:EscapeForURL( String )}
${bbNG:EscapeForCSS( String )}
${bbNG:EscapeForXML( String )}
${bbNG:EscapeForXMLAttribute( String )}
JavaScript 메서드
ESAPI for JavaScript의 모든 메서드를 사용할 수 있습니다. 일반적으로 사용되는 메서드 목록:
$ESAPI.encoder().canonicalize( String )
$ESAPI.encoder().encodeForHTML( String )
$ESAPI.encoder().encodeForHTMLAttribute( String )
$ESAPI.encoder().encodeForCSS( String )
$ESAPI.encoder().encodeForJavaScript( String )
$ESAPI.encoder().encodeForURL( String )
암호화된 텍스트 해독 중
암호화된 맥락 해석
데이터를 컨텍스트 전달 중에 암호화하려면 Blackboard 및 외부 URL이 동일한 컨텍스트 암호화 키에 접근할 수 있어야 합니다. 관리자는 관리자 패널에서 사용 가능한 컨텍스트 암호화 키 관리 기능을 통해 생성해야 합니다. 키 생성 후 해당 맥락을 인정하는 외부 서버로 다운로드하여 배포해야 합니다.
코드 예제
암호화된 데이터를 수신할 URL에서 사용할 수 있도록 컨텍스트 암호화 키를 다운로드한 후 컨텍스트 전달을 통해 설정해야 합니다. 외부 URL에서 전송된 암호화된 컨텍스트 데이터를 프로그래밍적으로 해독하는 방법을 보여주는 아래 코드 예제입니다.
대상 URL(이 경우 index.jsp)로 표시된 객체는 다음과 같이 맥락을 해독할 수 있습니다(blackboard.client.decryption.* 가져오기).
String context = request.getParameter("context");//if isEncryptionEnabled = false, base 64 encoding will be used instead //of encryptionboolean isEncryptionEnabled = true;ContextDecryptor bfd = ContextDecryptorFactory.getContextDecryptor(isEncryptionEnabled ); // retrieve the Blackboard encryption key as a File or InputStream File key = new File( strKeyLocation ); // or InputStream key = // implementation detail...// to simply decrypt the context string String decryptedContext = bfd.decrypt( context, key );// or, to get a HashMap of all key-value pairsHashMap map = bfd.parseEncryptedContext( context, key );// then search the HashMap for an expected value, and continue.if (map.containsKey( "user" ){ // execute...}
여러 키 해석
위 코드 예제는 외부 URL과 Blackboard 사이에 일대일 관계가 있을 때 유용하다. Blackboard의 다양한 인스턴스에서 사용되는 빌딩 블록을 지원하는 경우, 인스턴스의 호스트 이름을 사용하여 여러 키를 관리할 수 있습니다.
아래 예시에서 키는 Blackboard 인스턴스 또는 가상 설치의 호스트 이름과 연결하여 찾을 수 있습니다. 이 경우 호스트 이름은 physics.your교육기관.com입니다. 클라이언트 암호 해독 코드는 ContextDecryptor 객체에 암호 해독 키를 전달하는 기능을 포함하고 있으므로, 클라이언트 서버는 호스트 이름을 적절한 키와 매핑할 수 있어야 한다(이는 일반적으로 파일로 접근되지만 입력 스트림일 수도 있다).
빌딩 블록 서버 개발자는 다음과 같은 간단한 래퍼를 작성할 수 있습니다.
호스트 이름을 요청에서 추출합니다.
hostname-encryptionKey 맵에서 암호화 키 파일을 조회합니다.
암호화 키를
decrypt()메서드로 전달합니다.
클라이언트 서버 유틸리티 객체가 구현한 의사 코드 래퍼:
/**
* 유틸리티 의사코드
*/
decryptByHostname(HttpServletRequest요청)
{
맥락 매개변수를 요청에서 가져오기
문자열 맥락 = request.getParameter("context");
컨텍스트가 암호화되었는지 확인하십시오.
문자열 strEncryptInd = request.getParameter("암호화");
if ( (strEncryptInd != null) && (strEncryptInd.equalsIgnoreCase("y")) )
{
isEncrypted = 참;
}
isEncrypted인 경우, 키를 조회합니다.
키 = null;
if (isEncrypted)
{
HttpUtils.getRequestURL().getHost()에서 호스트 이름을 가져오는 중입니다.
속성 파일 형식으로 저장될 수 있는 키 맵을 가져옵니다.
// physics.yourinstitution.com= /key/file/location/physics_yourinstitution_com/key.sec
암호화 키를 맵에서 파일이나 스트림으로 가져옵니다.
클라이언트 구현 세부사항에 따라, 키가 다음 경우에 null로 전달됩니다.
isEncrypted=false, 대신 Base64 인코딩이 사용됩니다)
}
맥락암호 해독기 =
ContextDecryptorFactory.getContextDecryptor(맥락);
그런 다음 맥락에 전달된 값을 다음 중 하나로 반환하십시오.
HashMap의 키-값 쌍
HashMap 값 = decryptor.parseEncryptedContext(맥락, 키);
또는 문자열
문자열 값 = decryptor.decrypt(맥락, 키);
반환 값:
}