יישום נייד שמעבד תשלומים חייב לעמוד בתקן PCI DSS. סולקים דורשים אישור אבטחה, ולעתים קרובות הקוד מכיל פרצות: PAN בלוגים, היעדר הצמדת אישורים (certificate pinning), יכולת לצלם מסך עם כרטיס. הצוות שלנו עוזר להביא את היישום לגרסה העדכנית של התקן ולעבור ביקורת QSA עם עמידה מובטחת. עם ניסיון של למעלה מ-5 שנים ו-50+ פרויקטי אבטחה למובייל, אנו מבטיחים שהיישום שלך עומד בכל הדרישות.
למה PCI DSS קריטי ליישומי מובייל
מקור: PCI DSS הוא התקן של מועצת תקני האבטחה של תעשיית כרטיסי התשלום, חובה לכל תוכנה שמעבירה, מעבדת או מאחסנת נתוני כרטיסים. עבור יישומי מובייל, סעיף 6 (פיתוח מאובטח) וסעיף 4 (הצפנה בתעבורה) חשובים במיוחד. ללא עמידה בתקן, סולקים גדולים לא מאפשרים סליקה ישירה—רק פתרונות iFrame עם פונקציונליות מוגבלת.
הפרות נפוצות וכיצד לתקן אותן
אחסון PAN בלוגים
מפתח מוסיף Log.d("Payment", "Card: $cardNumber") לצורך ניפוי באגים. הנתונים מגיעים ל-logcat, קריא לכל יישום במכשיר אנדרואיד לא מאובטח. דרישת PCI DSS 3.3: PAN לא חייב להופיע בלוגים בטקסט רגיל. הפתרון הנכון הוא מיסוך PAN ורישום רק פעולות ללא נתוני כרטיס.
חוסר הגנה על המסך
אנדרואיד כברירת מחדל מאפשר צילומי מסך של כל Activity. במסך הזנת כרטיס, זו פרצה קריטית:
// Должно быть на любом экране с карточными данными
window.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE
)ב-iOS באופן דומה, יש לכסות את הממשק בעת כניסה לרקע:
func applicationWillResignActive(_ application: UIApplication) { coverSensitiveContent() } הצמדת אישורים לא מוגדרת
התעבורה לשרת התשלומים מיורטת על ידי Charles Proxy או mitmproxy ללא מכשולים. PCI DSS 6.5.4 דורש הגנה מפני התקפות man-in-the-middle. יישום ב-iOS:
class PinnedURLSessionDelegate: NSObject, URLSessionDelegate {
func urlSession(
_ session: URLSession,
didReceive challenge: URLAuthenticationChallenge,
completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void
) {
guard let serverTrust = challenge.protectionSpace.serverTrust,
let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0) else {
completionHandler(.cancelAuthenticationChallenge, nil)
return
}
let pinnedHash = "sha256/AbCdEfGhIjKlMnOpQrStUvWxYz123456789="
let serverHash = certificateHash(certificate)
if serverHash == pinnedHash {
completionHandler(.useCredential, URLCredential(trust: serverTrust))
} else {
completionHandler(.cancelAuthenticationChallenge, nil)
}
}
} זיהוי Root/Jailbreak
PCI DSS 6.4.3 ממליץ לזהות מכשירים שנפרצו. אנו משתמשים בשילוב: בדיקת // Должно быть на любом экране с карточными данными window.setFlags( WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE ) , Cydia, פקודת func applicationWillResignActive(_ application: UIApplication) { coverSensitiveContent() } , אי-התאמת חתימת תהליך. סולקים גדולים דורשים זאת דרך SDK.
למה טוקניזציה היא הכלי המרכזי ל-PCI DSS?
העיקרון המרכזי הוא לעולם לא לאחסן PAN. היישום עובד עם טוקן מספק התשלומים: Stripe class PinnedURLSessionDelegate: NSObject, URLSessionDelegate { func urlSession( _ session: URLSession, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void ) { guard let serverTrust = challenge.protectionSpace.serverTrust, let certificate = SecTrustGetCertificateAtIndex(serverTrust, 0) else { completionHandler(.cancelAuthenticationChallenge, nil) return } let pinnedHash = "sha256/AbCdEfGhIjKlMnOpQrStUvWxYz123456789=" let serverHash = certificateHash(certificate) if serverHash == pinnedHash { completionHandler(.useCredential, URLCredential(trust: serverTrust)) } else { completionHandler(.cancelAuthenticationChallenge, nil) } } } , CloudPayments /bin/bash, YooKassa su. טוקניזציה מצמצמת את היקף PCI DSS מ-SAQ D ל-SAQ A—זה פי 10 פשוט יותר ופי 20 פחות מאמץ ביקורת. קנסות על דליפת PAN יכולים להגיע ל-$500,000 לרבעון, וחיסכון בביקורת עקב היקף נכון יכול להגיע עד $3,000 (או יותר).
import StripePaymentSheet
var configuration = PaymentSheet.Configuration()
configuration.merchantDisplayName = "YourShop"
PaymentSheet.FlowController.create(
paymentIntentClientSecret: clientSecret,
configuration: configuration
) { [weak self] result in
switch result {
case .success(let flowController):
self?.paymentSheetFlowController = flowController
case .failure(let error):
// обрабатываем
}
}נתוני הכרטיס עוברים ישירות ל-Stripe SDK; היישום מקבל PaymentMethod. PAN אף פעם לא נוגע בשרת שלך.
מסלול ביקורת ורישום
דרישת PCI DSS 10: רישום גישה לסביבת נתוני כרטיסים. עבור יישומי מובייל:
- רישום כל תשלום מוצלח/כושל עם חותמת זמן, userId, PAN ממוסך (6 ספרות ראשונות + 4 אחרונות), סטטוס.
- אחסון לוגים לפחות 12 חודשים, עם 3 חודשים נגישים מיידית.
- הגנה על לוגים מפני שינוי (אחסון append-only).
מיסוך PAN בלוגים:
fun maskPan(pan: String): String {
return pan.take(6) + "*".repeat(pan.length - 10) + pan.takeLast(4)
} // "4111111111111111" → "411111******1111" מה זה היקף (Scoping) ולמה הוא נחוץ?
בחירת סוג SAQ משפיעה ישירות על היקף הביקורת. השוואה בין SAQ A ל-SAQ D:
| פרמטר | SAQ A | SAQ D |
|---|---|---|
| היקף | רק טוקניזציה | CDE מלא |
| מספר דרישות | 13 | 250+ |
| מאמץ ביקורת | 2-3 ימים | 3-4 שבועות |
| עלות תיקון | נמוכה | גבוהה |
טוקניזציה נכונה ומיקור חוץ של עיבוד כרטיסים (Stripe, CloudPayments) מאפשרים זכאות ל-SAQ A. החיסכון בביקורת יכול לעלות על עלות השינויים. לחץ להרחבה: SAQ A עדיף על SAQ D פי 20 במאמץ ופי 10 בעלות.
זה אומר שהצוות שלך יכול להתמקד בתכונות במקום בעומס תאימות.
התהליך שלנו: 5 צעדים לעמידה בתקן
| שלב | משך | תוצאה |
|---|---|---|
| היקף | יום אחד | הגדרת גבולות CDE, בחירת סוג SAQ |
| ניתוח פערים | 2-3 ימים | רשימת אי-התאמות מול 12 דרישות |
| תיקון | 1-3 שבועות | תיקון פרצות: הצמדת אישורים, FLAG_SECURE, הצפנת אחסון מקומי |
| בדיקות חדירה | 3-5 ימים | ניתוח סטטי (MobSF) ודינמי, בדיקת הנדסה לאחור של בינארי |
| הכנה לביקורת QSA | 2 ימים | תיעוד, דוחות, המלצות |
הצמדת אישורים שלב אחר שלב ב-iOS
- קבלת אישור השרת (DER).
- חישוב גיבוב SHA-256 של האישור.
- יצירת
Tokenעם בדיקת גיבוב. - הטמעת הגיבוב כקבוע בקוד.
- לכל בקשה, השוואת גיבוב השרת עם הגיבוב המוטמע.
- באי-התאמה, סיום החיבור.
רצף זה מבטיח הגנה מפני התקפות MITM. באנדרואיד, הצמדת אישורים קלה יותר דרך payment_method_id. פשוט הוסף קובץ XML ב-import StripePaymentSheet var configuration = PaymentSheet.Configuration() configuration.merchantDisplayName = "YourShop" PaymentSheet.FlowController.create( paymentIntentClientSecret: clientSecret, configuration: configuration ) { [weak self] result in switch result { case .success(let flowController): self?.paymentSheetFlowController = flowController case .failure(let error): // обрабатываем } } עם רשימת אישורים. עם זאת, לגמישות רבה יותר אנו משתמשים ב-OkHttp עם paymentMethodId.
מה כלול
- ניתוח פערים מלא של הקוד והתשתית (זיהוי כל אי-ההתאמות)
- יישום הצמדת אישורים ב-iOS ואנדרואיד עם טיפול בגרסאות ותצורה
- הגנה על מסכי הזנת כרטיס (FLAG_SECURE, מניעת שכבות-על)
- הגדרת טוקניזציה דרך Stripe/CloudPayments
- יישום זיהוי root/jailbreak עם בדיקות מרובות
- לוגים לביקורת ויישום מיסוך PAN
- ייעוץ בנושא SAQ ומעבר ביקורת QSA
לוח זמנים משוער
ביקורת ותיקונים בסיסיים: בין 2 ל-4 שבועות. מחזור מלא עם בדיקות חדירה והכנה ל-QSA: עד 6 שבועות. העלות מחושבת באופן אישי לאחר ניתוח המצב הנוכחי.
הזמינו ביקורת מקדימה—נעריך את ההיקף ולוח הזמנים תוך יומיים. צרו קשר לייעוץ, ונעזור להכין את היישום שלכם להסמכה. אנו מבטיחים עמידה בתקן וביקורת חיצונית מוצלחת.
קבלו הערכה ליישום שלכם תוך יומיים—פנו אלינו.







