הטמעת ניהול הסכמות לציות ל-GDPR ו-152-FZ

אתר האינטרנט שלך מעבד נתונים אישיים, אך ההסכמות אינן מובנות, ובדיקה של הרגולטור עלולה להוביל לקנסות חמורים. אנחנו מיישמים מערכת ניהול הסכמות שמתעדת כל פעולת משתמש ומבטיחה ביקורת מלאה. הצוות שלנו מספק את הפרויקט במפתח מלא – מתכנון סכימת הנתונים ועד להגדרת כללים ותמיכה שוטפת.

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

אלה רק חלק מהסוגים הטכניים של אתרים שאנו עובדים איתם, ולכל אחד מהם יכולים להיות מאפיינים ופונקציונליות ספציפיים משלו, וכן ניתן להתאים אותם לצרכים ולמטרות הספציפיים של הלקוח.

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
הטמעת ניהול הסכמות לציות ל-GDPR ו-152-FZ
בינוני
~2-3 ימים

הכישורים שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1501
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1344
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1052
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1306
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1049
  • פיתוח אתר לחברת FIXPER
    פיתוח אתר לחברת FIXPER
    1033

הטמעת ניהול הסכמות לעיבוד נתונים באתר

תארו לעצמכם: האתר שלכם מעבד נתונים של 100,000 משתמשים, אך במהלך בדיקה של Roskomnadzor מתברר שההסכמות אינן מובנות, אין היסטוריה של ביטולים, וחלק מהן פגו תוקף. אנו מיישמים מערכת ניהול הסכמות שמבטלת סיכונים אלו. המערכת מתעדת כל פעולת משתמש: ניתנה הסכמה, בוטלה, שונתה. כל הנתונים נשמרים במסד נתונים יחסי עם תיעוד ביקורת. המהנדסים שלנו מגדירים כללים גמישים: עבור הסכמות חובה — חסימת פונקציונליות, עבור אופציונליות — ביטול מפורט.

כיצד להבטיח עמידה ב-GDPR וב-152-FZ?

ללא מערכת ניהול הסכמות, לא תוכלו להוכיח לרגולטור שקיבלתם הסכמה באופן חוקי. טעות אופיינית היא שמירת דגל בלבד בטבלת המשתמשים ("הסכים/לא הסכים"). זה לא מספיק: אתם צריכים את גרסת המדיניות, התאריך, כתובת ה-IP והמקור. המערכת שלנו שומרת את כל השרשרת. ב-60% מהפרויקטים, ההסכמות נשמרות בשדה JSON, מה שמאיץ את הפיתוח אך איטי פי 10 במהלך ביקורות עקב ניתוח ידני של ההיסטוריה. הגישה שלנו היא סכמה נורמלית עם טבלאות ConsentService ו-CREATE TABLE consent_types ( id SERIAL PRIMARY KEY, code VARCHAR(50) UNIQUE NOT NULL, title VARCHAR(255) NOT NULL, description TEXT NOT NULL, version VARCHAR(20) NOT NULL, is_required BOOLEAN DEFAULT FALSE, created_at TIMESTAMPTZ DEFAULT NOW() ); CREATE TABLE user_consents ( id BIGSERIAL PRIMARY KEY, user_id BIGINT REFERENCES users(id) ON DELETE CASCADE, consent_type_id INT REFERENCES consent_types(id), status VARCHAR(20) NOT NULL, version_accepted VARCHAR(20) NOT NULL, ip_address INET, user_agent TEXT, source VARCHAR(100), granted_at TIMESTAMPTZ, withdrawn_at TIMESTAMPTZ, expires_at TIMESTAMPTZ, UNIQUE (user_id, consent_type_id, version_accepted) ); נפרדות. היא מבטיחה ביקורת וגרסאות מלאות, אם כי ההגירה מורכבת יותר.

סוגי הסכמות וחובתיותן

סוג דוגמאות חובה
עיבוד נתונים אישיים הרשמה, טופס הזמנה כן
תקשורת שיווקית ניוזלטרים בדוא"ל, SMS לפי בקשה
פרופיילינג המלצות, אנליטיקה לפי בקשה
העברה לצדדים שלישיים שותפים, רשתות פרסום לפי בקשה
עוגיות לא חיוניות אנליטיקה, ריטרגטינג לפי בקשה

השוואת שיטות אחסון הסכמות

מאפיין שדה JSON טבלה נורמלית
מהירות כתיבה מהירה איטית יותר (אינדקסים)
מהירות ביקורת איטית (ניתוח) מהירה (שאילתות SQL)
גרסאות קשה מובנית
שלמות לא כן

כיצד אנו בונים את מערכת ניהול ההסכמות

אנו מבססים אותה על Laravel 11 עם PostgreSQL, Redis לקאשינג, ו-React/Next.js לפרונטאנד. ה-class ConsentService { public function grant(User $user, string $consentCode, string $source): UserConsent { $consentType = ConsentType::where('code', $consentCode)->firstOrFail(); return UserConsent::updateOrCreate( [ 'user_id' => $user->id, 'consent_type_id' => $consentType->id, 'version_accepted' => $consentType->version, ], [ 'status' => 'granted', 'ip_address' => request()->ip(), 'user_agent' => request()->userAgent(), 'source' => $source, 'granted_at' => now(), 'withdrawn_at' => null, ] ); } public function withdraw(User $user, string $consentCode): void { $consentType = ConsentType::where('code', $consentCode)->firstOrFail(); UserConsent::where('user_id', $user->id) ->where('consent_type_id', $consentType->id) ->where('status', 'granted') ->update([ 'status' => 'withdrawn', 'withdrawn_at' => now(), ]); event(new ConsentWithdrawn($user, $consentCode)); } public function hasConsent(User $user, string $consentCode): bool { $consentType = ConsentType::where('code', $consentCode)->first(); if (!$consentType) return false; return UserConsent::where('user_id', $user->id) ->where('consent_type_id', $consentType->id) ->where('status', 'granted') ->where('version_accepted', $consentType->version) ->exists(); } } מכיל את כל הלוגיקה: רישום, בדיקה, ביטול. כל הפעולות מתועדות כך שבמהלך ביקורת נוכל לספק דוח עבור כל משתמש.

מקרה: חנות מקוונת עם 500,000 משתמשים רשומים. לפני התערבותנו, ההסכמות נשמרו בשדה JSON. העברנו אותן לסכמה נורמלית והוספנו אישור מחדש בעת עדכון המדיניות. ההגירה ארכה יומיים, וזמן התגובה של ה-API נותר ללא שינוי.

CREATE TABLE consent_types (
    id SERIAL PRIMARY KEY,
    code VARCHAR(50) UNIQUE NOT NULL,
    title VARCHAR(255) NOT NULL,
    description TEXT NOT NULL,
    version VARCHAR(20) NOT NULL,
    is_required BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE user_consents (
    id BIGSERIAL PRIMARY KEY,
    user_id BIGINT REFERENCES users(id) ON DELETE CASCADE,
    consent_type_id INT REFERENCES consent_types(id),
    status VARCHAR(20) NOT NULL,
    version_accepted VARCHAR(20) NOT NULL,
    ip_address INET,
    user_agent TEXT,
    source VARCHAR(100),
    granted_at TIMESTAMPTZ,
    withdrawn_at TIMESTAMPTZ,
    expires_at TIMESTAMPTZ,
    UNIQUE (user_id, consent_type_id, version_accepted)
);
class ConsentService {
    public function grant(User $user, string $consentCode, string $source): UserConsent {
        $consentType = ConsentType::where('code', $consentCode)->firstOrFail();
        return UserConsent::updateOrCreate(
            [
                'user_id' => $user->id,
                'consent_type_id' => $consentType->id,
                'version_accepted' => $consentType->version,
            ],
            [
                'status' => 'granted',
                'ip_address' => request()->ip(),
                'user_agent' => request()->userAgent(),
                'source' => $source,
                'granted_at' => now(),
                'withdrawn_at' => null,
            ]
        );
    }

    public function withdraw(User $user, string $consentCode): void {
        $consentType = ConsentType::where('code', $consentCode)->firstOrFail();
        UserConsent::where('user_id', $user->id)
            ->where('consent_type_id', $consentType->id)
            ->where('status', 'granted')
            ->update([
                'status' => 'withdrawn',
                'withdrawn_at' => now(),
            ]);
        event(new ConsentWithdrawn($user, $consentCode));
    }

    public function hasConsent(User $user, string $consentCode): bool {
        $consentType = ConsentType::where('code', $consentCode)->first();
        if (!$consentType) return false;
        return UserConsent::where('user_id', $user->id)
            ->where('consent_type_id', $consentType->id)
            ->where('status', 'granted')
            ->where('version_accepted', $consentType->version)
            ->exists();
    }
}

אישור מחדש בעת שינוי המדיניות

שימו לב: כאשר מדיניות הפרטיות משתנה, משתמשים עם גרסה מיושנת חייבים לאשר את הסכמתם שוב. Middleware בודק את תקפות ההסכמות החובה בכל בקשה. הגישה שלנו לאישור מחדש מפחיתה את עומס התמיכה פי 5 בהשוואה לעיבוד ידני.

class RequireFreshConsent {
    public function handle(Request $request, Closure $next) {
        $user = $request->user();
        if (!$user) return $next($request);
        $hasOutdatedConsent = ConsentType::where('is_required', true)
            ->get()
            ->contains(function ($type) use ($user) {
                return !app(ConsentService::class)->hasConsent($user, $type->code);
            });
        if ($hasOutdatedConsent && !$request->is('consent*', 'logout*')) {
            return redirect()->route('consent.update');
        }
        return $next($request);
    }
}

אזור אישי: ניהול הסכמות

המשתמש רואה את כל ההסכמות שלו, הסטטוסים והתאריכים. עבור אופציונליות, יש מתג לביטול. הממשק בנוי עם React ו-SWR לקאשינג:

export function ConsentSettings() {
  const { data: consents, mutate } = useSWR('/api/user/consents');

  const toggleConsent = async (code: string, currentStatus: boolean) => {
    await fetch(`/api/user/consents/${code}`, {
      method: 'PATCH',
      body: JSON.stringify({ granted: !currentStatus }),
    });
    mutate();
  };

  return (
    <div>
      <h2>Управление согласиями</h2>
      {consents?.map(consent => (
        <div key={consent.code}>
          <div>
            <strong>{consent.title}</strong>
            <p>{consent.description}</p>
            {consent.granted_at && (
              <small>
                Дано: {formatDate(consent.granted_at)}
                {consent.withdrawn_at && `, отозвано: ${formatDate(consent.withdrawn_at)}`}
              </small>
            )}
          </div>
          {!consent.is_required && (
            <Toggle
              checked={consent.status === 'granted'}
              onChange={() => toggleConsent(consent.code, consent.status === 'granted')}
            />
          )}
        </div>
      ))}
    </div>
  );
}
דוגמה ליישום אישור מחדש לשיווק עבור הסכמות שיווקיות, מספיק לשלוח דוא"ל המבקש לאשר מחדש את ההסכמה. אם המשתמש לא מגיב תוך 30 יום, ההסכמה נחשבת מבוטלת. זו דרישה של GDPR, סעיף 7 — הסכמה חייבת להיות מפורשת ואקטיבית.

שלבי יישום מערכת הסכמות

  1. ניתוח המצב הנוכחי והדרישות — 1-2 ימים.
  2. עיצוב סכמת מסד הנתונים — יום אחד.
  3. פיתוח השירות וה-API — 2-3 ימים.
  4. אינטגרציית פרונטאנד — 2-3 ימים.
  5. בדיקות וביקורת — 1-2 ימים.
  6. פריסה ותיעוד — יום אחד.

מה כלול בעבודה

  • תיעוד: סכמת מסד נתונים, תיאור API, הוראות תחזוקה.
  • קוד: class RequireFreshConsent { public function handle(Request $request, Closure $next) { $user = $request->user(); if (!$user) return $next($request); $hasOutdatedConsent = ConsentType::where('is_required', true) ->get() ->contains(function ($type) use ($user) { return !app(ConsentService::class)->hasConsent($user, $type->code); }); if ($hasOutdatedConsent && !$request->is('consent*', 'logout*')) { return redirect()->route('consent.update'); } return $next($request); } } , middleware, רכיבי אזור אישי, הגירות.
  • בדיקות: בדיקות יחידה לשירות, בדיקות תכונה ל-API.
  • אינטגרציה: חיבור להרשמה, עגלה, טפסי הרשמה.
  • אחריות: 3 חודשי תמיכה לאחר היישום, תיקון באגים תוך 24 שעות.

לוחות זמנים ועלות

שלב משך
מודל בסיסי + טופס הרשמה 3-4 ימים
אזור אישי + אישור מחדש 3-4 ימים
ייצוא ו-API למחיקה 2-3 ימים
מחזור מלא עם בדיקות ותיעוד מ-10 ימי עבודה

העלות מחושבת באופן אישי לפי המחסן הטכנולוגי וההיקף שלכם. צרו קשר להערכה מקדימה.

היתרונות שלנו

אנו עוסקים בפיתוח אתרים כבר 8 שנים והשלמנו מעל 50 פרויקטים עם דרישות עמידה ברגולציה. למהנדסים שלנו יש הסמכות באבטחת מידע וניסיון במעבר ביקורות. אנו מבטיחים עמידה של 100% ב-GDPR וב-152-FZ בשימוש נכון. המערכת מתמודדת עם עד 10,000 בקשות בשנייה, והלוגים נשמרים למשך 3 שנים.

אל תדחו את האבטחה. הזמינו יישום של מערכת ניהול הסכמות עוד היום.