2013-07-31 2 views
4

Apple은 모순 된 진술과 함께 영수증 유효성 확인에 관한 두 개의 문서를 제공합니다. "Verifying Store Receipts"에서인앱 구매 영수증 인증 모순

:

참고 : iOS의 경우 구입 영수증의 내용과 형식이 개인 및 변경 될 수 있습니다. 응용 프로그램에서 영수증 데이터를 직접 구문 분석하지 마십시오..

// Check the validity of the receipt. If it checks out then also ensure the transaction is something 
// we haven't seen before and then decode and save the purchaseInfo from the receipt for later receipt validation. 
- (BOOL)isTransactionAndItsReceiptValid:(SKPaymentTransaction *)transaction 
{ 
    if (!(transaction && transaction.transactionReceipt && [transaction.transactionReceipt length] > 0)) 
    { 
     // Transaction is not valid. 
     return NO; 
    } 

    // Pull the purchase-info out of the transaction receipt, decode it, and save it for later so 
    // it can be cross checked with the verifyReceipt. 
    NSDictionary *receiptDict  = [self dictionaryFromPlistData:transaction.transactionReceipt]; 
    NSString *transactionPurchaseInfo = [receiptDict objectForKey:@"purchase-info"]; 
    NSString *decodedPurchaseInfo = [self decodeBase64:transactionPurchaseInfo length:nil]; 
    NSDictionary *purchaseInfoDict = [self dictionaryFromPlistData:[decodedPurchaseInfo dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSString *transactionId   = [purchaseInfoDict objectForKey:@"transaction-id"]; 
    NSString *purchaseDateString = [purchaseInfoDict objectForKey:@"purchase-date"]; 
    NSString *signature    = [receiptDict objectForKey:@"signature"]; 

    // Convert the string into a date 
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
    [dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss z"]; 

    NSDate *purchaseDate = [dateFormat dateFromString:[purchaseDateString stringByReplacingOccurrencesOfString:@"Etc/" withString:@""]]; 


    if (![self isTransactionIdUnique:transactionId]) 
    { 
     // We've seen this transaction before. 
     // Had [transactionsReceiptStorageDictionary objectForKey:transactionId] 
     // Got purchaseInfoDict 
     return NO; 
    } 

    // Check the authenticity of the receipt response/signature etc. 

    BOOL result = checkReceiptSecurity(transactionPurchaseInfo, signature, 
             (__bridge CFDateRef)(purchaseDate)); 

    if (!result) 
    { 
     return NO; 
    } 

    // Ensure the transaction itself is legit 
    if (![self doTransactionDetailsMatchPurchaseInfo:transaction withPurchaseInfo:purchaseInfoDict]) 
    { 
     return NO; 
    } 

    // Make a note of the fact that we've seen the transaction id already 
    [self saveTransactionId:transactionId]; 

    // Save the transaction receipt's purchaseInfo in the transactionsReceiptStorageDictionary. 
    [transactionsReceiptStorageDictionary setObject:purchaseInfoDict forKey:transactionId]; 

    return YES; 
} 

내가 제대로 이해하고 "In-App Purchase Receipt Validation on iOS"샘플 코드 보안 취약점에 대한 "완화 전략"의 일환으로, 구입 영수증을 구문 분석하고 검증하는 제공 아직

, 영수증을 확인하면 Apple이 영수증 형식을 변경하기로 결정하면 내 앱이 작동을 멈출 수 있습니다.

영수증을 확인하지 않으면 Apple의 "완화 전략"을 따르지 않고 내 앱이 공격에 취약합니다.

저주받은 경우, 저주받은 경우 저주합니다. 내가 빠진 것이 있습니까?

답변

3

모든 버전의 iOS에서 App Store를 명확하고 안전하게 통과 할 수 있도록 인증을위한 중개인으로 자체 서버를 사용하는 것이 좋습니다. 어느 쪽이든 저주받지 않는 것이 가장 좋은 방법입니다.

장치에서 App Store로 직접 유효성 검사를 수행해야하는 경우 응용 프로그램이 5.1.x에서 실행되고 이하인 경우에만 완화 전략 을 사용합니다. iOS6 이상에서는 제공된 권장 수단을 사용하십시오.

영수증을 직접 구문 분석해서는 안되는 경우가 있었지만, 발견 된 취약점으로 인해 애플은 문제를 해결할 수있는 힘든 장소에 놓였으며 응용 프로그램 개발자가 점검을 수행하기로 결정했습니다. 즉, 사용자가 응용 프로그램을 업데이트하면 영수증이 이제 보안이 강화되어 (iOS 버전과 상관없이) 더 나은 수정 적용 범위를 제공합니다. 부작용으로, 평소에해야 할 일에서 벗어나야한다는 것을 의미합니다 (그러나 Apple은 귀하에게 그렇게하도록 허가했습니다).

본인은이 문서가 이에 대해 전반적으로 명확하지 않으며 약간 더 명확해질 수 있다는 데 동의합니다 (하단의 문서 페이지에서 의견을 제공해야합니다). Apple은 완화 전략을 발표했으며 취약점을 해결하기 위해 iOS 5.1.x 이하 버전에서 사용해야한다고 밝혔습니다. 그들이 IAP 영수증의 형식/내용을 변경하면 그에 대한 책임이 있습니다.

+0

감사합니다. 나는 그 질문을하기 전에 이미 그들에게 피드백을 보냈다. ;) 서버를 사용할 수없는 경우 iOS 5.1 이하 버전을 실행하는 장치에 대해서만 제공하는 코드를 실행하는 것이 가장 좋은 방법이라고 생각합니다. 그렇게하면 영수증을 변경하면 피해가 제한됩니다. – hpique

+0

그래, 그건 기본적으로 내 대답이야. Apple은 이전에는 권장하지 않았던이 작업을 허용했으며, 서버가 없다면 할 수있는 유일한 방법입니다 (Apple이 이해할 수있는 것처럼 보입니다). 개발자는 아니지만 iOS 5.1.x 및 그 이하의 호환성을 저해하지 않는 것은 Apple에 달려 있습니다.그들이 어떻게 할 수 있을지 모르겠다. 어쩌면 iOS 5가 더 이상 쓸모없는 제품 일 때 영수증 형식을 바꿀 수도있다 ... – WDUK

0

Apple에서는 현재 장치 수신 확인을 권장하고 있습니다. Validating receipts locally 및 WWDC 2013 talk Using receipts to protect your digital sales을 참조하십시오.

+4

미안하지만, Apple에서 만든 링크를 사용하여 영수증을 확인하는 방법을 이해하고있다. 막연한 왕은 크리켓을하는 두 마리의 원숭이를보고 뇌 수술을 이해하는 것과 같습니다. – SpaceDog

+0

예, 앱 구매에는 약간의 고통이 있습니다. 나는 이것을 1 개월 정도 해왔고 여전히 일하고 있습니다. 어떤 정보가 도움이 될까요? –

+1

모두. SSL, 인증서 등에 관한 제 지식은 제로입니다. 나는 그것을하는 방법에 대한 예를, 위에서 아래로 볼 필요가있다. 분명히 자동화 된 크래커를 막기 위해 몇 가지 방법을 변경해야한다는 것을 알고 있지만, 모든 것이 작동하는 것을 볼 수 있다면 행복 할 것입니다. – SpaceDog