javascript جميع - التعرف على المستخدم بدون ملفات تعريف الارتباط أو التخزين المحلي




حتى كروم (11)

بناء على ما قلته:

أساسا أنا بعد التعرف على الجهاز ليس حقا للمستخدم

أفضل طريقة للقيام بذلك هي إرسال عنوان MAC الذي هو معرف NIC.

يمكنك إلقاء نظرة على هذا المنشور: كيف يمكنني الحصول على MAC وعنوان IP لعميل متصل في PHP؟

JavaScript Mac Finder

أعمل على إنشاء أداة تحليلية ويمكنني حاليًا الحصول على عنوان IP للمستخدم والمستعرض ونظام التشغيل من وكيل المستخدم.

أتساءل ما إذا كان هناك إمكانية للكشف عن نفس المستخدم دون استخدام ملفات تعريف الارتباط أو التخزين المحلي؟ أنا لا أتوقع أمثلة الكود هنا ؛ مجرد تلميح بسيط من أن ننظر إلى أبعد من ذلك.

نسيت الإشارة إلى أنها تحتاج إلى أن تكون متوافقة بين المتصفحات إذا كان الكمبيوتر / الجهاز نفسه. أساسا أنا بعد التعرف على الجهاز ليس حقا للمستخدم.


غير فعال ، ولكن قد يعطيك النتائج المرجوة ، سيكون استطلاع API على جانبك. لديك عملية خلفية على جانب العميل الذي يرسل بيانات المستخدم في فترة زمنية. ستحتاج إلى مُعرّف مستخدم لإرساله إلى واجهة برمجة التطبيقات. وبمجرد الانتهاء من ذلك ، يمكنك إرسال أي معلومات مرتبطة بهذا المعرِّف الفريد.

هذا يزيل الحاجة لملفات تعريف الارتباط و localstorage.


  1. قم بإنشاء ملحق (nsapi) وهمي عبر النظام الأساسي وأنشئ اسمًا فريدًا لاسم البرنامج المساعد أو إصداره عندما يقوم المستخدم بتنزيله (على سبيل المثال بعد تسجيل الدخول).
  2. توفير أداة تثبيت للمكوّن الإضافي / تثبيته لكل سياسة

سيتطلب هذا من المستخدم تثبيت المعرف.

بمجرد تثبيت المكون الإضافي ، ستحتوي fingerprint أي متصفح (مُمكِّن للمكون الإضافي) على هذا المكون الإضافي المحدد. لإرجاع المعلومات إلى خادم ، هناك حاجة إلى خوارزمية للكشف عن المكوِّن الإضافي بشكل فعال على جانب العميل ، وإلا فستحتاج IE و Firefox> = 28 مستخدمًا إلى جدول يتضمن تعريفًا صالحًا صالحًا.

وهذا يتطلب استثمارًا مرتفعًا نسبيًا في تقنية من المحتمل أن يتم إغلاقها من قبل موردي المتصفح. عندما تكون قادرًا على إقناع المستخدمين لديك بتثبيت مكون إضافي ، قد تتوفر أيضًا خيارات مثل تثبيت خادم وكيل محلي ، أو استخدام vpn أو تصحيح برامج تشغيل الشبكة.

سيجد المستخدمون الذين لا يرغبون في التعرف عليهم (أو أجهزتهم) دائمًا طريقة لمنع ذلك.


لا أستطيع أن أصدق ، http://browserspy.dk لا يزال لم يرد ذكرها هنا! يصف الموقع العديد من الميزات (من حيث التعرف على الأنماط) ، والتي يمكن استخدامها لبناء مصنف.

libsvm في تقييم الميزات ، أقترح دعم آلات المتجهات و libsvm وجه الخصوص.



تعمل هذه البصمة المذكورة أعلاه ، ولكن لا يزال يعاني من الاصطدامات.

تتمثل إحدى الطرق في إضافة UID إلى عنوان url لكل تفاعل مع المستخدم.

http://someplace.com/12899823/user/profile

حيث يتم تكييف كل رابط في الموقع مع هذا المعدل. وهو مماثل للطريقة التي يستخدمها ASP.Net للعمل باستخدام بيانات FORM بين الصفحات.


يمكنك القيام بذلك باستخدام png مخبأ ، سيكون غير موثوق به إلى حد ما (تتصرف المتصفحات المختلفة بشكل مختلف ، وسوف تفشل إذا قام المستخدم بمسح ذاكرة التخزين المؤقت الخاصة به) ، ولكنه خيار.

1: إعداد قاعدة بيانات تخزن معرف مستخدم فريدًا كسلسلة سداسية عشرية

2: إنشاء ملف genUser.php (أو أي لغة) يقوم بإنشاء معرف مستخدم ، وتخزينه في قاعدة بيانات DB ثم إنشاء لون حقيقي .png للخروج من قيم تلك السلسلة السداسية (كل بكسل سيكون 4 بايت) والعودة هذا للمتصفح. تأكد من تعيين رؤوس المحتويات ورؤوس التخزين المؤقت.

3: في HTML أو JS قم بإنشاء صورة مثل <img id='user_id' src='genUser.php' />

4: ارسم تلك الصورة على قماش ctx.drawImage(document.getElementById('user_id'), 0, 0);

5: قراءة بايت تلك الصورة خارج باستخدام ctx.getImageData ، وتحويل الأعداد الصحيحة إلى سلسلة سداسية عشرية.

6: هذا هو معرف المستخدم الفريد الخاص بك الذي تم تخزينه مؤقتًا الآن على جهاز الكمبيوتر الخاص بك.


تتبعها خلال جلسة أو عبر الجلسات؟

إذا كان موقعك هو HTTPS Everywhere ، فيمكنك استخدام معرف جلسة TLS لتعقب جلسة المستخدم


المقدمة

إذا كنت أفهمك بشكل صحيح ، فأنت بحاجة إلى تحديد مستخدم ليس لديك معرف فريد له ، لذا فأنت تريد معرفة من هم بمطابقة بيانات عشوائية. لا يمكنك تخزين هوية المستخدم بطريقة موثوقة بسبب:

  • ملفات تعريف الارتباط يمكن حذفها
  • عنوان IP يمكن أن يتغير
  • متصفح يمكن أن يتغير
  • قد يتم حذف ذاكرة التخزين المؤقت للمتصفح

كان تطبيق Java Applet أو Com Object حلًا سهلاً باستخدام تجزئة لمعلومات الأجهزة ، ولكن الناس في هذه الأيام يدركون تمامًا الأمان أنه سيكون من الصعب جعل الأشخاص يقومون بتثبيت هذه الأنواع من البرامج على نظامهم. هذا يتركك عالقًا في استخدام ملفات تعريف الارتباط وأدوات أخرى مماثلة.

ملفات تعريف الارتباط وأدوات أخرى مماثلة

قد تفكر في إنشاء ملف تعريف بيانات ، ثم استخدام اختبارات احتمالية لتحديد مستخدم محتمل . يمكن إنشاء ملف تعريف مفيد لهذا من خلال مجموعة من ما يلي:

  1. عنوان IP
    • عنوان IP حقيقي
    • عنوان IP الوكيل (غالبًا ما يستخدم المستخدمون الخادم الوكيل نفسه بشكل متكرر)
  2. بسكويت
  3. Web Bugs (أقل موثوقية بسبب ثبات الأخطاء ، ولكنها لا تزال مفيدة)
    • PDF Bug
    • فلاش علة
    • جافا خلل
  4. المتصفحات
    • انقر على التتبع (كثير من المستخدمين يزورون نفس سلسلة الصفحات في كل زيارة)
    • المتصفحات بصمة الإصبع - البرامج الإضافية المثبتة (عادةً ما يكون لدى الأشخاص مجموعات متنوعة وفريدة إلى حد ما من المكونات الإضافية)
    • الصور المخزنة مؤقتًا (يقوم الأشخاص في بعض الأحيان بحذف ملفات تعريف الارتباط الخاصة بهم مع ترك الصور المخزنة مؤقتًا)
    • باستخدام النقط
    • URL (s) (قد يحتوي سجل المتصفح أو ملفات تعريف الارتباط على معرف مستخدم فريد في عناوين URL ، مثل https://.com/users/1226894 أو http://www.facebook.com/barackobama?fref=ts )
    • كشف نظام الخطوط (هذا هو توقيع مفتاح غير معروفة ولكن في كثير من الأحيان فريدة من نوعها)
  5. HTML5 & Javascript
    • HTML5 LocalStorage
    • HTML5 موقع Geolocation API وعكس الترميز الجغرافي
    • العمارة ، لغة OS ، وقت النظام ، دقة الشاشة ، إلخ.
    • شبكة معلومات API
    • واجهة برمجة تطبيقات حالة البطارية

وبالطبع ، فإن العناصر التي ذكرتها ليست سوى عدد قليل من الطرق الممكنة لتحديد هوية المستخدم بشكل فريد. هناك أكثر من ذلك بكثير.

باستخدام هذه المجموعة من عناصر البيانات العشوائية لإنشاء ملف تعريف بيانات ، ما الخطوة التالية؟

والخطوة التالية هي تطوير بعض المنطق الضبابي ، أو ، أفضل ، شبكة عصبية اصطناعية (التي تستخدم المنطق الضبابي). في كلتا الحالتين ، فإن الفكرة هي تدريب النظام الخاص بك ، ثم الجمع بين تدريبه مع Inesian Inference لزيادة دقة نتائجك.

تسمح لك مكتبة NeuralMesh لـ PHP بإنشاء شبكات عصبية اصطناعية. لتنفيذ تطبيق Bayesian Inference ، راجع الروابط التالية:

في هذه المرحلة ، قد تفكر:

لماذا الكثير من الرياضيات والمنطق لمهمة تبدو بسيطة؟

في الأساس ، لأنها ليست مهمة بسيطة . ما تحاول تحقيقه هو ، في الواقع ، الاحتمال النقي . على سبيل المثال ، بالنظر إلى المستخدمين المعروفين التاليين:

User1 = A + B + C + D + G + K
User2 = C + D + I + J + K + F

عندما تتلقى البيانات التالية:

B + C + E + G + F + K

السؤال الذي تطرحه في الأساس هو:

ما هو احتمال أن البيانات المستلمة (B + C + E + G + F + K) هي في الواقع User1 أو User2؟ وأي من هاتين المباراتين هو الأكثر احتمالا؟

من أجل الإجابة على هذا السؤال بفاعلية ، يجب أن تفهم صيغة التردد مقابل الاحتمال ولماذا قد تكون الاحتمالية المشتركة طريقة أفضل. التفاصيل أكثر من اللازم للوصول إلى هنا (وهذا هو السبب في أنني أعطيكم روابط) ، ولكن المثال الجيد سيكون تطبيق معالج التشخيص الطبي ، الذي يستخدم مجموعة من الأعراض لتحديد الأمراض المحتملة.

فكر في لحظة من سلسلة نقاط البيانات التي تضم ملف بياناتك (B + C + E + G + F + K في المثال أعلاه) كأعراض ، ومستخدمين غير معروفين كأمراض . من خلال تحديد المرض ، يمكنك تحديد العلاج المناسب (التعامل مع هذا المستخدم كمستخدم 1).

من الواضح أن المرض الذي حددنا له أكثر من 1 أعراض هو أسهل في تحديده. في الواقع ، كلما زادت الأعراض التي يمكننا تحديدها ، أصبح التشخيص الأكثر سهولة ودقة أمرًا مؤكدًا تقريبًا.

هل هناك أي بدائل أخرى؟

بالتاكيد. كإجراء بديل ، قد تنشئ خوارزمية تسجيل بسيطة ، وترتكز على المطابقات الدقيقة. هذا ليس بنفس الكفاءة مثل الاحتمالية ، ولكن قد يكون من الأسهل بالنسبة لك تنفيذ.

على سبيل المثال ، ضع في اعتبارك مخطط النقاط البسيطة هذا:

+-------------------------+--------+------------+
|        Property         | Weight | Importance |
+-------------------------+--------+------------+
| Real IP address         |     60 |          5 |
| Used proxy IP address   |     40 |          4 |
| HTTP Cookies            |     80 |          8 |
| Session Cookies         |     80 |          6 |
| 3rd Party Cookies       |     60 |          4 |
| Flash Cookies           |     90 |          7 |
| PDF Bug                 |     20 |          1 |
| Flash Bug               |     20 |          1 |
| Java Bug                |     20 |          1 |
| Frequent Pages          |     40 |          1 |
| Browsers Finger Print   |     35 |          2 |
| Installed Plugins       |     25 |          1 |
| Cached Images           |     40 |          3 |
| URL                     |     60 |          4 |
| System Fonts Detection  |     70 |          4 |
| Localstorage            |     90 |          8 |
| Geolocation             |     70 |          6 |
| AOLTR                   |     70 |          4 |
| Network Information API |     40 |          3 |
| Battery Status API      |     20 |          1 |
+-------------------------+--------+------------+

لكل جزء من المعلومات التي يمكنك جمعها في طلب معين ، قم بمنح النقاط المرتبطة ، ثم استخدم الأهمية لحل التعارضات عندما تكون النقاط متشابهة.

إثبات المفهوم

لإثبات بسيط للمفهوم ، يرجى إلقاء نظرة على Perceptron . Perceptron هو نموذج RNA الذي يستخدم عادة في تطبيقات التعرف على الأنماط. حتى أن هناك فئة PHP قديمة تقوم بتنفيذها بشكل مثالي ، ولكنك ستحتاج على الأرجح إلى تعديلها لأغراضك.

على الرغم من كونه أداة رائعة ، إلا أنه لا يزال بإمكان Perceptron عرض نتائج متعددة (تطابقات محتملة) ، لذلك لا يزال استخدام مقارنة النقاط والفرق مفيدًا في تحديد أفضل تلك التطابقات.

الافتراضات

  • تخزين كل المعلومات الممكنة عن كل مستخدم (IP ، ملفات تعريف الارتباط ، وما إلى ذلك)
  • عندما تكون النتيجة مطابقة تامة ، قم بزيادة النتيجة بمقدار 1
  • عندما تكون النتيجة غير متطابقة تمامًا ، احرص على تقليل النتيجة بمقدار 1

توقع

  1. توليد علامات الحمض النووي الريبي
  2. توليد مستخدمين عشوائيين محاكاة قاعدة بيانات
  3. إنشاء مستخدم واحد غير معروف
  4. توليد المستخدم غير معروف RNA والقيم
  5. سيقوم النظام بدمج معلومات الحمض النووي الريبي وتعليم Perceptron
  6. بعد تدريب Perceptron ، سيكون للنظام مجموعة من الأوزان
  7. يمكنك الآن اختبار نمط المستخدم غير المعروف وسيقوم Perceptron بإنتاج مجموعة نتائج.
  8. تخزين جميع المباريات الإيجابية
  9. فرز المطابقات أولاً حسب الدرجة ، ثم حسب الفرق (كما هو موضح أعلاه)
  10. قم بإخراج أقرب تطابقين ، أو إذا لم يتم العثور على تطابقات ، قم بإخراج نتائج فارغة

رمز إثبات المفهوم

$features = array(
    'Real IP address' => .5,
    'Used proxy IP address' => .4,
    'HTTP Cookies' => .9,
    'Session Cookies' => .6,
    '3rd Party Cookies' => .6,
    'Flash Cookies' => .7,
    'PDF Bug' => .2,
    'Flash Bug' => .2,
    'Java Bug' => .2,
    'Frequent Pages' => .3,
    'Browsers Finger Print' => .3,
    'Installed Plugins' => .2,
    'URL' => .5,
    'Cached PNG' => .4,
    'System Fonts Detection' => .6,
    'Localstorage' => .8,
    'Geolocation' => .6,
    'AOLTR' => .4,
    'Network Information API' => .3,
    'Battery Status API' => .2
);

// Get RNA Lables
$labels = array();
$n = 1;
foreach ($features as $k => $v) {
    $labels[$k] = "x" . $n;
    $n ++;
}

// Create Users
$users = array();
for($i = 0, $name = "A"; $i < 5; $i ++, $name ++) {
    $users[] = new Profile($name, $features);
}

// Generate Unknown User
$unknown = new Profile("Unknown", $features);

// Generate Unknown RNA
$unknownRNA = array(
    0 => array("o" => 1),
    1 => array("o" => - 1)
);

// Create RNA Values
foreach ($unknown->data as $item => $point) {
    $unknownRNA[0][$labels[$item]] = $point;
    $unknownRNA[1][$labels[$item]] = (- 1 * $point);
}

// Start Perception Class
$perceptron = new Perceptron();

// Train Results
$trainResult = $perceptron->train($unknownRNA, 1, 1);

// Find matches
foreach ($users as $name => &$profile) {
    // Use shorter labels
    $data = array_combine($labels, $profile->data);
    if ($perceptron->testCase($data, $trainResult) == true) {
        $score = $diff = 0;

        // Determing the score and diffrennce
        foreach ($unknown->data as $item => $found) {
            if ($unknown->data[$item] === $profile->data[$item]) {
                if ($profile->data[$item] > 0) {
                    $score += $features[$item];
                } else {
                    $diff += $features[$item];
                }
            }
        }
        // Ser score and diff
        $profile->setScore($score, $diff);
        $matchs[] = $profile;
    }
}

// Sort bases on score and Output
if (count($matchs) > 1) {
    usort($matchs, function ($a, $b) {
        // If score is the same use diffrence
        if ($a->score == $b->score) {
            // Lower the diffrence the better
            return $a->diff == $b->diff ? 0 : ($a->diff > $b->diff ? 1 : - 1);
        }
        // The higher the score the better
        return $a->score > $b->score ? - 1 : 1;
    });

    echo "<br />Possible Match ", implode(",", array_slice(array_map(function ($v) {
        return sprintf(" %s (%0.4f|%0.4f) ", $v->name, $v->score,$v->diff);
    }, $matchs), 0, 2));
} else {
    echo "<br />No match Found ";
}

Output:

Possible Match D (0.7416|0.16853),C (0.5393|0.2809)

Print_r من "D":

echo "<pre>";
print_r($matchs[0]);


Profile Object(
    [name] => D
    [data] => Array (
        [Real IP address] => -1
        [Used proxy IP address] => -1
        [HTTP Cookies] => 1
        [Session Cookies] => 1
        [3rd Party Cookies] => 1
        [Flash Cookies] => 1
        [PDF Bug] => 1
        [Flash Bug] => 1
        [Java Bug] => -1
        [Frequent Pages] => 1
        [Browsers Finger Print] => -1
        [Installed Plugins] => 1
        [URL] => -1
        [Cached PNG] => 1
        [System Fonts Detection] => 1
        [Localstorage] => -1
        [Geolocation] => -1
        [AOLTR] => 1
        [Network Information API] => -1
        [Battery Status API] => -1
    )
    [score] => 0.74157303370787
    [diff] => 0.1685393258427
    [base] => 8.9
)

إذا كان Debug = true ، فستتمكن من رؤية الإدخال (المستشعر والمرغوب) والأوزان المبدئية والمخرجات (المستشعر والمجموع والشبكة) والخطأ والتصحيح والأوزان النهائية .

+----+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+----+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----------+
| o  | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | x10 | x11 | x12 | x13 | x14 | x15 | x16 | x17 | x18 | x19 | x20 | Bias | Yin | Y  | deltaW1 | deltaW2 | deltaW3 | deltaW4 | deltaW5 | deltaW6 | deltaW7 | deltaW8 | deltaW9 | deltaW10 | deltaW11 | deltaW12 | deltaW13 | deltaW14 | deltaW15 | deltaW16 | deltaW17 | deltaW18 | deltaW19 | deltaW20 | W1 | W2 | W3 | W4 | W5 | W6 | W7 | W8 | W9 | W10 | W11 | W12 | W13 | W14 | W15 | W16 | W17 | W18 | W19 | W20 | deltaBias |
+----+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+----+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----------+
| 1  | 1  | -1 | -1 | -1 | -1 | -1 | -1 | 1  | 1  | 1   | 1   | 1   | 1   | 1   | -1  | -1  | -1  | -1  | 1   | 1   | 1    | 0   | -1 | 0       | -1      | -1      | -1      | -1      | -1      | -1      | 1       | 1       | 1        | 1        | 1        | 1        | 1        | -1       | -1       | -1       | -1       | 1        | 1        | 0  | -1 | -1 | -1 | -1 | -1 | -1 | 1  | 1  | 1   | 1   | 1   | 1   | 1   | -1  | -1  | -1  | -1  | 1   | 1   | 1         |
| -1 | -1 | 1  | 1  | 1  | 1  | 1  | 1  | -1 | -1 | -1  | -1  | -1  | -1  | -1  | 1   | 1   | 1   | 1   | -1  | -1  | 1    | -19 | -1 | 0       | 0       | 0       | 0       | 0       | 0       | 0       | 0       | 0       | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0  | -1 | -1 | -1 | -1 | -1 | -1 | 1  | 1  | 1   | 1   | 1   | 1   | 1   | -1  | -1  | -1  | -1  | 1   | 1   | 1         |
| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --   | --  | -- | --      | --      | --      | --      | --      | --      | --      | --      | --      | --       | --       | --       | --       | --       | --       | --       | --       | --       | --       | --       | -- | -- | -- | -- | -- | -- | -- | -- | -- | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --        |
| 1  | 1  | -1 | -1 | -1 | -1 | -1 | -1 | 1  | 1  | 1   | 1   | 1   | 1   | 1   | -1  | -1  | -1  | -1  | 1   | 1   | 1    | 19  | 1  | 0       | 0       | 0       | 0       | 0       | 0       | 0       | 0       | 0       | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0  | -1 | -1 | -1 | -1 | -1 | -1 | 1  | 1  | 1   | 1   | 1   | 1   | 1   | -1  | -1  | -1  | -1  | 1   | 1   | 1         |
| -1 | -1 | 1  | 1  | 1  | 1  | 1  | 1  | -1 | -1 | -1  | -1  | -1  | -1  | -1  | 1   | 1   | 1   | 1   | -1  | -1  | 1    | -19 | -1 | 0       | 0       | 0       | 0       | 0       | 0       | 0       | 0       | 0       | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0        | 0  | -1 | -1 | -1 | -1 | -1 | -1 | 1  | 1  | 1   | 1   | 1   | 1   | 1   | -1  | -1  | -1  | -1  | 1   | 1   | 1         |
| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --   | --  | -- | --      | --      | --      | --      | --      | --      | --      | --      | --      | --       | --       | --       | --       | --       | --       | --       | --       | --       | --       | --       | -- | -- | -- | -- | -- | -- | -- | -- | -- | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --        |
+----+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+----+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----------+

تمثل x1 إلى x20 الخصائص المحولة بواسطة الشفرة.

// Get RNA Labels
$labels = array();
$n = 1;
foreach ( $features as $k => $v ) {
    $labels[$k] = "x" . $n;
    $n ++;
}

هنا هو عرض على الانترنت

الفئة المستخدمة:

class Profile {
    public $name, $data = array(), $score, $diff, $base;

    function __construct($name, array $importance) {
        $values = array(-1, 1); // Perception values
        $this->name = $name;
        foreach ($importance as $item => $point) {
            // Generate Random true/false for real Items
            $this->data[$item] = $values[mt_rand(0, 1)];
        }
        $this->base = array_sum($importance);
    }

    public function setScore($score, $diff) {
        $this->score = $score / $this->base;
        $this->diff = $diff / $this->base;
    }
}

تعديل Perceptron الطبقة

class Perceptron {
    private $w = array();
    private $dw = array();
    public $debug = false;

    private function initialize($colums) {
        // Initialize perceptron vars
        for($i = 1; $i <= $colums; $i ++) {
            // weighting vars
            $this->w[$i] = 0;
            $this->dw[$i] = 0;
        }
    }

    function train($input, $alpha, $teta) {
        $colums = count($input[0]) - 1;
        $weightCache = array_fill(1, $colums, 0);
        $checkpoints = array();
        $keepTrainning = true;

        // Initialize RNA vars
        $this->initialize(count($input[0]) - 1);
        $just_started = true;
        $totalRun = 0;
        $yin = 0;

        // Trains RNA until it gets stable
        while ($keepTrainning == true) {
            // Sweeps each row of the input subject
            foreach ($input as $row_counter => $row_data) {
                // Finds out the number of columns the input has
                $n_columns = count($row_data) - 1;

                // Calculates Yin
                $yin = 0;
                for($i = 1; $i <= $n_columns; $i ++) {
                    $yin += $row_data["x" . $i] * $weightCache[$i];
                }

                // Calculates Real Output
                $Y = ($yin <= 1) ? - 1 : 1;

                // Sweeps columns ...
                $checkpoints[$row_counter] = 0;
                for($i = 1; $i <= $n_columns; $i ++) {
                    /** DELTAS **/
                    // Is it the first row?
                    if ($just_started == true) {
                        $this->dw[$i] = $weightCache[$i];
                        $just_started = false;
                        // Found desired output?
                    } elseif ($Y == $row_data["o"]) {
                        $this->dw[$i] = 0;
                        // Calculates Delta Ws
                    } else {
                        $this->dw[$i] = $row_data["x" . $i] * $row_data["o"];
                    }

                    /** WEIGHTS **/
                    // Calculate Weights
                    $this->w[$i] = $this->dw[$i] + $weightCache[$i];
                    $weightCache[$i] = $this->w[$i];

                    /** CHECK-POINT **/
                    $checkpoints[$row_counter] += $this->w[$i];
                } // END - for

                foreach ($this->w as $index => $w_item) {
                    $debug_w["W" . $index] = $w_item;
                    $debug_dw["deltaW" . $index] = $this->dw[$index];
                }

                // Special for script debugging
                $debug_vars[] = array_merge($row_data, array(
                    "Bias" => 1,
                    "Yin" => $yin,
                    "Y" => $Y
                ), $debug_dw, $debug_w, array(
                    "deltaBias" => 1
                ));
            } // END - foreach

            // Special for script debugging
             $empty_data_row = array();
            for($i = 1; $i <= $n_columns; $i ++) {
                $empty_data_row["x" . $i] = "--";
                $empty_data_row["W" . $i] = "--";
                $empty_data_row["deltaW" . $i] = "--";
            }
            $debug_vars[] = array_merge($empty_data_row, array(
                "o" => "--",
                "Bias" => "--",
                "Yin" => "--",
                "Y" => "--",
                "deltaBias" => "--"
            ));

            // Counts training times
            $totalRun ++;

            // Now checks if the RNA is stable already
            $referer_value = end($checkpoints);
            // if all rows match the desired output ...
            $sum = array_sum($checkpoints);
            $n_rows = count($checkpoints);
            if ($totalRun > 1 && ($sum / $n_rows) == $referer_value) {
                $keepTrainning = false;
            }
        } // END - while

        // Prepares the final result
        $result = array();
        for($i = 1; $i <= $n_columns; $i ++) {
            $result["w" . $i] = $this->w[$i];
        }

        $this->debug($this->print_html_table($debug_vars));

        return $result;
    } // END - train
    function testCase($input, $results) {
        // Sweeps input columns
        $result = 0;
        $i = 1;
        foreach ($input as $column_value) {
            // Calculates teste Y
            $result += $results["w" . $i] * $column_value;
            $i ++;
        }
        // Checks in each class the test fits
        return ($result > 0) ? true : false;
    } // END - test_class

    // Returns the html code of a html table base on a hash array
    function print_html_table($array) {
        $html = "";
        $inner_html = "";
        $table_header_composed = false;
        $table_header = array();

        // Builds table contents
        foreach ($array as $array_item) {
            $inner_html .= "<tr>\n";
            foreach ( $array_item as $array_col_label => $array_col ) {
                $inner_html .= "<td>\n";
                $inner_html .= $array_col;
                $inner_html .= "</td>\n";

                if ($table_header_composed == false) {
                    $table_header[] = $array_col_label;
                }
            }
            $table_header_composed = true;
            $inner_html .= "</tr>\n";
        }

        // Builds full table
        $html = "<table border=1>\n";
        $html .= "<tr>\n";
        foreach ($table_header as $table_header_item) {
            $html .= "<td>\n";
            $html .= "<b>" . $table_header_item . "</b>";
            $html .= "</td>\n";
        }
        $html .= "</tr>\n";

        $html .= $inner_html . "</table>";

        return $html;
    } // END - print_html_table

    // Debug function
    function debug($message) {
        if ($this->debug == true) {
            echo "<b>DEBUG:</b> $message";
        }
    } // END - debug
} // END - class

استنتاج

لا يعد تعريف مستخدم بدون معرف فريد مهمة بسيطة أو بسيطة. يعتمد على جمع كمية كافية من البيانات العشوائية التي يمكنك جمعها من المستخدم بواسطة مجموعة متنوعة من الطرق.

حتى لو اخترت عدم استخدام شبكة عصبية اصطناعية ، أقترح على الأقل استخدام مصفوفة الاحتمالية البسيطة ذات الأولويات والأرجوحات - وآمل أن تعطيك الشفرة والأمثلة المذكورة أعلاه ما يكفي للاستمرار.


هل نظرت في Evercookie ؟ قد يعمل أو لا يعمل عبر المتصفحات. مستخرج من موقعهم.

"إذا تم طهي مستخدم على أحد المتصفحات وتحويله إلى متصفح آخر ، طالما أن مجلد ملفات تعريف الارتباط المحلي المشترك لا يزال موجودًا ، فسيتم إعادة إنشاء ملف تعريف الارتباط في كلا المتصفحين."


نظرًا لأن وحدة angulars ngTouch تزيل فقط تأخير 300 مللي ثانية على توجيهات ng-click ، ​​فأنا أستخدم fastclick.js الآن والتي تتوافق تمامًا مع الزاوي.

في البداية لم يعمل لي ، لأنني أرفقت مكتبة Fastclick قبل تحميل النص البرمجي ، قبل أن يكون DOM جاهزًا. أصلحت هذا عن طريق التفاف الوظيفة في كتلة تشغيل التطبيق الزاوي. تقوم هذه الوظيفة بتنفيذ التعليمات البرمجية بعد أن يكون DOM جاهزًا.

angular.module('myModule', []).
  run(function() {
    FastClick.attach(document.body);
  });

يتم اقتراح هذه الطريقة بواسطة أحدث screencast على قناة youtube angularjs.





javascript php http-headers fingerprinting