IS NULL, IS NOT NULL

NULL
– DB에서 NULL이 일반적인 값과는 다르게 취급된다.
– 아직 정의되지 않은 값.
– 0(숫자) 또는 공백(문자)과 다르다.
– 테이블을 생성할 때 NOT NULL 또는 PRIMARY KEY로 정의되지 않은 모든 데이터 유형은 널 값을 포함할 수 있다.
– NULL 값을 포함하는 연산의 경우 결과 값도 NULL이다. 모르는 데이터에 숫자를 더하거나 빼도 결과는 마찬가지로 모르는 데이터인 것과 같다.
– 결과값을 NULL이 아닌 다른 값을 얻고자 할 때 NVL/ISNULL 함수를 사용한다.
– NULL 값의 대상이 숫자 유형 데이터인 경우는 주로 0(Zero)으로, 문자 유형 데이터인 경우에는 블랭크보다는 ‘x’ 같은 해당 시스템에서 의미없는 문자로 바꾸는 경우가 많다.

IS NULL

-- NULL인 데이터
SELECT *
FROM test
WHERE score IS NULL;

IS NOT NULL

-- NULL이 아닌 데이터
SELECT *
FROM test
WHERE score IS NOT NULL;

IFNULL

-- NULL이면 0으로 치환.
SELECT IFNULL(score, 0) FROM test;

COALESCE

-- NULL이면 0으로 치환.
SELECT COALESCE(score, 0) FROM test;
IFNULL과 COALESCE 차이.
COALESCE() is in all the major databases, while IFNULL() isn't in SQL Server which uses ISNULL()instead. Performance should be no different. –  Hart CO Nov 12 '14 at 18:56
결과는 같지만. COALESCE가 모든 데이터베이스에서 사용가능하니 COALESCE를 권장한다. 

XSS

XSS란?

웹 상에서 가장 기초적인 취약점 공격 방법의 일종으로, 악의적인 사용자가 공격하려는 사이트에 스크립트를 넣는 기법을 말한다. 공격에 성공하면 사이트에 접속한 사용자는 삽입된 코드를 실행하게 되며, 보통 의도치 않은 행동을 수행시키거나 쿠키나 세션 토큰 등의 민감한 정보를 탈취한다. xss는 크로스 사이트 스크립팅이라고도 부르며 일반적으로 자바스크립트에서 발생하지만, VB 스크립트, ActiveX 등 클라이언트에서 실행되는 동적 데이터를 생성하는 모든 언어에서 발생이 가능하다.

XSS 취약점을 이용한 공격 방법.

1. 저장 XSS 공격
접속자가 많은 웹 사이트를 대상으로 공격자가 XSS 취약점이 있는 웹 서버에 공격용 스크립트를 입력시켜 놓으면, 방문자가 악성 스크립트가 삽입되어있는 페이지를 읽는 순간 방문자의 브라우저를 공격하는 방식.
가장 일반적인 방법은 게시판 같은 곳에 HTML 문서에 과 같은 태그를 포함한다. 이 경우에 게시판에는 태그가 나타나지 않으며 사용자는 확인할 수가 없다.

2. 반사 XSS 공격
악성 스크립트가 포함된 URL을 사용자가 클릭하도록 유도하여 URL을 클릭하면 클라이언트를 공격하는 방식.
반사식 XSS 공격은 웹 애플리케이션의 지정된 변수를 이용할 때 발생하는 취약점을 이용하는 것으로, 검색 결과, 에러 메시지 등 서버가 외부에서 입력 받은 값을 받아 브라우저에게 응답할 때 전송하는 과정에서 입력되는 변수의 위험한 문자를 사용자에게 그대로 돌려주면서 발생한다. 일반적으로 서버에 검색 내용을 입력하면, 검색 결과가 있는 경우에는 결과 값을 사용자에게 전달하지만, 서버에서 정확한 결과가 없는 경우 서버는 브라우저에 입력한 값을 그대로 HTML 문서에 포함하여 응답한다. 이 경우 HTML 페이지에 포함된 악성 스크립트가 브라우저에서 실행이 된다.

3. DOM기반 XSS 공격
악성 URL을 통해 사용자의 브라우저를 공격하는 방식.
피해자의 브라우저가 HTML 페이지를 구문 분석할 때마다 공격스크립트가 DOM 생성의 일부로 실행되면서 공격한다. 페이지 자체는 변하지 않으나, 페이지에 포함되어 있는 브라우저측 코드가 DOM 환경에서 악성코드로 실행된다.
앞에서 다룬 저장 XSS 및 반사 XSS 공격의 악성 페이로드가 서버 측 애플리케이션 취약점으로 인해, 응답 페이지에 악성 스크립트가 포함되어 브라우저로 전달되면서 공격하는 것인 반면, DOM 기반 XSS는 서버와 관계없이 브라우저에서 발생하는 것이 차이점이다.

XSS 방어기법

1. 입・출력 값 검증 및 무효화
XSS 취약점을 근본적으로 제거하기 위해서는 스크립트 등 해킹에 사용될 수 있는 코딩에 사용되는 입력 및 출력 값에 대해서 검증하고 무효화시켜야 한다. 입력 값에 대한 유효성 검사는 데이터가 입력되기 전에 가능하면, 입력 데이터에 대한 길이, 문자, 형식 및 사업적 규칙 유효성을 검사해야 한다. 출력 값을 무효화하기 위해서는 XSS 공격은 기본적으로 HTML “<”로 변경한다. HTML 엔터티는 대부분의 인터프리터(특히, 브라우저)에서 특수한 FOCUS 의미를 가지지 않으며, 단순한 문자로 처리된다. 이렇게 인코딩하면 사용자는 <script>가 <script>로 보이지만 HTML 문서에서는 &lt;script&gt;로 나타나서 브라우저에서 일반 문자로 인식하고 스크립트로 해석되어 실행되지는 않는다.

2. 보안 라이브러리
1) AntiXSS AntiXSS 라이브러리
마이크로소프트사에서 개발한 공개용 XSS 취약점 예방 라이브러리이다.
AntiXSS 라이브러리는 ASP.net 애플리케이션 개발환경에서 사용되며, 현재 ASP.net 4.5 이후 버전에만 사용이 가능하다.
이 라이브러리는 입력 값을 검증하여 서버로 악성 스크립트로 입력되지 못하는 기능과 위험한 문자를 인코딩하는 함수를 제공한다.

2) OWASP ESAPI 라이브러리 OWASP
포괄적인 애플리케이션 보안을 위해 웹 응용 취약점을 대응할 수 있는 오픈소스 ESAPI 라이브러리를 개발하여 제공하고 있다.
ESAPI에는 총 14개의 API가 있으며, 이 중 XSS 취약점을 예방하기 위해 API는 validator와 encoder가 있다.
validator는 입력 값을 필터링하는 기능을 하고 있으며, encoder는 출력 값을 인코딩 및 디코딩 기능을 가지고 있다.
이 라이브러리는 자바, PHP, .NET, ASP, 자바스크립트 및 파이썬 등 다양한 애플리케이션 개발 언어를 지원하고 있다.

3) NAVER Lucy
NAVER에서 개발한 라이브러리이며, 파라미터로 받은 문자열을 단순히 escape 하는 XssPreventer와 xml기반의 화이트리스트 필터링 방식을 사용하며, 화이트리스트 상위설정 파일에 대해 상속 오버라이딩이 가능하다. 또한, 상속받아서 적용할 수 있고 서비스에 따라 변경이 불가피한 필터링 규칙은 하위 파일에서 재정의 할 수 있어 서비스에 맞게 수정가능한 XSS Filter, Xss-servlet-Filter이 있다.

Purchases.subscriptions in Google Play Developer API

SubscriptionPurchase은 사용자의 구독결제상태를 가리킨다.

{
  "kind": "androidpublisher#subscriptionPurchase",
  "startTimeMillis": long,
  "expiryTimeMillis": long,
  "autoRenewing": boolean,
  "priceCurrencyCode": string,
  "priceAmountMicros": long,
  "countryCode": string,
  "developerPayload": string,
  "paymentState": integer,
  "cancelReason": integer,
  "userCancellationTimeMillis": long
}
properties name value description
autoRenewing boolean 구독만료일시가 되었을때, 구독여부를 자동으로 갱신할 것인지 여부.
cancelReason integer 구독이 취소된 이유 혹은 자동 갱신이 안 된 이유.
0. 사용자가 구독을 취소.
1. 결제시스템 문제로 구독 취소. (ex. 청구서 문제로 인한.)
countryCode string ISO 3166-1 alpha-2 구독이 승인된 시간의 사용자의 국가/지역 코드.
developerPayload string 개발자가 명시한 내용으로 오더에 대한 추가적인 정보를 포함.
expiryTimeMillis long 구독이 만료되는 시간(단위 : 밀리 초)
kind string This kind represents a subscriptionPurchase object in the androidpublisher service.
paymentState integer 구독료의 지불상태.
0. 결제 대기중.
1. 결제 완료.
2. 무료체험판.
priceAmountMicros long tax가 포함되지 않은 구독료.
가격은 마이크로 단위로 표시되며, 여기서 1,000,000 마이크로 단위는 통화 단위 1 개를 나타냄.
(예를 들어 구독 가격이 1.99 유로 인 경우 price_amount_micros는 1990000)
priceCurrencyCode string ISO 4217 currency code
구독료에 대한 통화코드. (예를 들어 가격이 영국 파운드로 지정된 경우 price_currency_code는 “GBP”)
startTimeMillis long 밀리 초 단위로 구독이 허가 된 시간.
userCancellationTimeMillis long 사용자가 구독을 취소 한 시간 (단위 : 밀리 초). cancelReason이 0 인 경우에만 표시.

참고 : https://developers.google.com/android-publisher/api-ref/purchases/subscriptions