कुकीज़ या स्थानीय भंडारण के बिना उपयोगकर्ता की पहचान


132

मैं एक एनालिटिक टूल बना रहा हूं और मैं वर्तमान में उपयोगकर्ता के आईपी पते, ब्राउज़र और ऑपरेटिंग सिस्टम को उनके उपयोगकर्ता एजेंट से प्राप्त कर सकता हूं।

अगर कुकीज़ या स्थानीय भंडारण का उपयोग किए बिना एक ही उपयोगकर्ता का पता लगाने की संभावना है, तो मैं सोच रहा हूं? मुझे यहां कोड उदाहरणों की उम्मीद नहीं है; आगे देखने के लिए बस एक सरल संकेत है।

यह उल्लेख करना भूल गए कि अगर यह एक ही कंप्यूटर / डिवाइस है तो इसे क्रॉस-ब्राउज़र संगत होना चाहिए। मूल रूप से मैं डिवाइस मान्यता के बाद वास्तव में उपयोगकर्ता नहीं हूं।


5
वास्तव में नहीं - कम से कम ऐसा कोई तरीका नहीं जिससे आप सटीक होने का भरोसा कर सकें। हो सकता है कि सभी तीनों का एक हैश संयुक्त हो, लेकिन अगर एक घर में एक से अधिक लोग एक ही ब्राउज़र और ओएस का उपयोग करते हैं, तो भी यह काम नहीं करेगा। इसके अलावा, अधिकांश आईएसपी डायनामिक आईपी पते प्रदान करते हैं, जिसका अर्थ है कि वे हर-बार बदलते हैं और पहचान के प्रयोजनों के लिए भी निर्भर नहीं हो पाएंगे।
जॉन

2
तब आप नहीं जानते कि सत्र क्या हैं। आपके उपयोग का मामला ठीक वही है जो सत्रों के लिए तैयार किया गया था। सत्र का लॉगिंग या प्रमाणीकरण से कोई लेना-देना नहीं है। आपका वेब सर्वर किसी ग्राहक को सत्र पहचानकर्ता के साथ कुकी भेजने के लिए कहेगा। आप उस ग्राहक को पहचानते हैं जो सत्र आईडी का उपयोग करके वे आपको भेजते हैं।
मैन बनाम कोड

4
कुकीज़ अभी भी काम करेंगे? आप कुकीज़ का उपयोग करने से क्यों बच रहे हैं?
बाबा

2
यह वास्तव में सरल है और मैं इसे हर समय उपयोग करता हूं, उपयोगकर्ता से उपयोगकर्ता नाम और पासवर्ड दर्ज करने के लिए कहेंगे !!!
अमित कृपलानी

2
यहाँ एक न्यूनतम जावास्क्रिप्ट समाधान है (इस मामले में नॉन-क्रॉस-ब्राउज़र): github.com/carlo/jquery-browser-fingerprint मैं इसका उल्लेख करता हूं, क्योंकि इसने मुझे इस धारणा में लाया कि कई प्लगइन्स डिफ़ॉल्ट रूप से बिना क्रॉस-ब्राउज़र स्थापित किए हैं, उपयोगकर्ता के हिस्से पर कोई भी विकल्प। उन लोगों को सावधानीपूर्वक क्रमबद्ध करना (जो कि एक छोटा काम नहीं है, लेकिन फिर भी ...) संभवतः एक बड़े डिवाइस-आधारित फिंगरप्रिंट की मूर्त ब्राउज़र-अज्ञेय संपत्ति को जन्म दे सकता है।
हेक्सालिस

जवाबों:


389

परिचय

यदि मैं आपको सही तरीके से समझता हूं, तो आपको एक ऐसे उपयोगकर्ता की पहचान करने की आवश्यकता है जिसके पास आपके पास विशिष्ट पहचानकर्ता नहीं है, इसलिए आप यह पता लगाना चाहते हैं कि वे रैंडम डेटा का मिलान करके कौन हैं। आप उपयोगकर्ता की पहचान को विश्वसनीय रूप से संग्रहीत नहीं कर सकते क्योंकि:

  • कुकीज़ को हटाया जा सकता है
  • IP पता बदल सकते हैं
  • ब्राउज़र बदल सकते हैं
  • ब्राउज़र कैश हटाया जा सकता है

एक जावा एप्लेट या कॉम ऑब्जेक्ट हार्डवेयर जानकारी के हैश का उपयोग करके एक आसान समाधान होता, लेकिन इन दिनों लोग इतने सुरक्षा-जागरूक होते हैं कि लोगों को अपने सिस्टम पर इस प्रकार के कार्यक्रमों को स्थापित करना मुश्किल होगा। यह आपको कुकीज़ और अन्य समान उपकरणों का उपयोग करने से रोकता है।

कुकीज़ और अन्य, समान उपकरण

आप एक संभावित उपयोगकर्ता की पहचान करने के लिए प्रायिकता परीक्षणों का उपयोग करके डेटा प्रोफ़ाइल बनाने पर विचार कर सकते हैं । इसके लिए उपयोगी एक प्रोफ़ाइल निम्नलिखित के कुछ संयोजन द्वारा उत्पन्न की जा सकती है:

  1. आईपी ​​पता
    • रियल आईपी एड्रेस
    • प्रॉक्सी IP पता (उपयोगकर्ता अक्सर एक ही प्रॉक्सी का बार-बार उपयोग करते हैं)
  2. कुकीज़
  3. वेब कीड़े (कम विश्वसनीय क्योंकि बग्स ठीक हो जाते हैं, लेकिन फिर भी उपयोगी हैं)
    • पीडीएफ बग
    • फ्लैश बग
    • जावा बग
  4. ब्राउज़र्स
    • ट्रैकिंग पर क्लिक करें (कई उपयोगकर्ता प्रत्येक विज़िट पर पृष्ठों की समान श्रृंखला पर जाते हैं)
    • ब्राउज़र फिंगर प्रिंट - इंस्टॉल किए गए प्लगइन्स (लोगों के पास अक्सर अलग-अलग होते हैं, प्लगइन्स के कुछ विशिष्ट सेट)
    • कैश्ड छवियां (लोग कभी-कभी अपनी कुकीज़ हटाते हैं लेकिन कैश्ड छवियों को छोड़ देते हैं)
    • ब्लब्स का उपयोग करना
    • URL (ब्राउज़र इतिहास या कुकीज़ में URLs में अद्वितीय उपयोगकर्ता आईडी हो सकते हैं, जैसे https://stackoverflow.com/users/1226894 या http://www.facebook.com/barackobama?fref=ts )
    • सिस्टम फ़ॉन्ट्स डिटेक्शन (यह एक अल्पज्ञात लेकिन अक्सर विशिष्ट कुंजी हस्ताक्षर है)
  5. HTML5 और जावास्क्रिप्ट
    • HTML5 लोकलस्टोरेज
    • HTML5 जियोलोकेशन एपीआई और रिवर्स जियोकोडिंग
    • वास्तुकला, OS भाषा, सिस्टम समय, स्क्रीन रिज़ॉल्यूशन, आदि।
    • नेटवर्क सूचना एपीआई
    • बैटरी स्थिति एपीआई

जिन वस्तुओं को मैंने सूचीबद्ध किया है, निश्चित रूप से, कुछ ही संभव तरीकों से उपयोगकर्ता को विशिष्ट रूप से पहचाना जा सकता है। और भी कई हैं।

रैंडम डेटा एलिमेंट्स के इस सेट से डेटा प्रोफाइल बनाने के लिए, आगे क्या है?

अगला कदम कुछ फजी लॉजिक विकसित करना है , या, अभी तक, एक कृत्रिम तंत्रिका नेटवर्क (जो फजी लॉजिक का उपयोग करता है)। या तो मामले में, विचार आपके सिस्टम को प्रशिक्षित करने के लिए है, और फिर अपने परिणामों की सटीकता को बढ़ाने के लिए बेइज़ियन इन्वेंशन के साथ अपने प्रशिक्षण को मिलाएं

कृत्रिम तंत्रिका नेटवर्क

NeuralMesh PHP के लिए पुस्तकालय आप कृत्रिम तंत्रिका नेटवर्क उत्पन्न करने के लिए अनुमति देता है। बायेसियन इंट्रेंस लागू करने के लिए, निम्नलिखित लिंक देखें:

इस बिंदु पर, आप सोच रहे होंगे:

एक सरल कार्य के लिए इतना गणित और तर्क क्यों?

मूल रूप से, क्योंकि यह एक सरल कार्य नहीं है । आप जो हासिल करने की कोशिश कर रहे हैं, वह वास्तव में शुद्ध संभावना है । उदाहरण के लिए, निम्नलिखित ज्ञात उपयोगकर्ताओं को दिया गया:

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 है? और उन दो मैचों में से कौन सबसे अधिक संभावित है?

इस प्रश्न का प्रभावी ढंग से उत्तर देने के लिए, आपको फ़्रिक्वेंसी बनाम प्रोबेबिलिटी प्रारूप को समझने की आवश्यकता है और संयुक्त संभावना एक बेहतर तरीका क्यों हो सकता है। यहाँ आने के लिए विवरण बहुत अधिक हैं (यही कारण है कि मैं आपको लिंक दे रहा हूँ), लेकिन एक अच्छा उदाहरण एक मेडिकल डायग्नोस्टिक विज़ार्ड है , जो संभावित बीमारियों की पहचान करने के लिए लक्षणों के संयोजन का उपयोग करता है।

डेटा बिंदुओं की श्रृंखला के एक पल के लिए सोचें, जिसमें आपके डेटा प्रोफाइल (बी + सी + ई + जी + एफ + के ऊपर उदाहरण में) लक्षण के रूप में हैं , और अज्ञात उपयोगकर्ता रोग के रूप में । बीमारी की पहचान करके, आप एक उपयुक्त उपचार (इस उपयोगकर्ता को उपयोगकर्ता 1 के रूप में मान सकते हैं) की पहचान कर सकते हैं।

जाहिर है, एक बीमारी जिसके लिए हमने 1 से अधिक लक्षणों की पहचान की है, पहचानना आसान है। वास्तव में, अधिक लक्षण हम पहचान कर सकते हैं, हमारा निदान उतना ही आसान और सटीक होगा।

क्या कोई अन्य विकल्प हैं?

बेशक। एक वैकल्पिक उपाय के रूप में, आप अपना स्वयं का सरल स्कोरिंग एल्गोरिथ्म बना सकते हैं, और इसे सटीक मिलानों पर आधारित कर सकते हैं। यह संभावना के रूप में कुशल नहीं है, लेकिन आपके लिए इसे लागू करना सरल हो सकता है।

एक उदाहरण के रूप में, इस सरल स्कोर चार्ट पर विचार करें:

+ ------------------------- + -------- + ------------ +
| संपत्ति | वजन | महत्व |
+ ------------------------- + -------- + ------------ +
| असली आईपी पता | 60 | 5 |
| प्रयुक्त प्रॉक्सी आईपी पता | 40 | 4 |
| HTTP कुकीज़ | 80 | 8 |
| सत्र कुकीज़ | 80 | 6 |
| 3 पार्टी कुकीज़ | 60 | 4 |
| फ्लैश कुकीज़ | 90 | 7 |
| पीडीएफ बग | 20 | 1 |
| फ्लैश बग | 20 | 1 |
| जावा बग | 20 | 1 |
| बार-बार पृष्ठ | 40 | 1 |
| ब्राउजर फिंगर प्रिंट | 35 | 2 |
| स्थापित प्लगइन्स | 25 | 1 |
| कैश्ड चित्र | 40 | 3 |
| URL | 60 | 4 |
| सिस्टम फ़ॉन्ट्स | 70 | 4 |
| लोकलस्टोरेज | 90 | 8 |
| जियोलोकेशन | 70 | 6 |
| AOLTR | 70 | 4 |
| नेटवर्क सूचना एपीआई | 40 | 3 |
| बैटरी की स्थिति एपीआई | 20 | 1 |
+ ------------------------- + -------- + ------------ +

जानकारी के प्रत्येक टुकड़े के लिए जिसे आप किसी दिए गए अनुरोध पर इकट्ठा कर सकते हैं, संबंधित स्कोर को पुरस्कृत कर सकते हैं, फिर जब स्कोर समान हो तो संघर्षों को हल करने के लिए महत्व का उपयोग करें ।

अवधारणा के सुबूत

अवधारणा के एक सरल प्रमाण के लिए, कृपया Perceptron पर एक नज़र डालें । पर्सेप्ट्रॉन एक आरएनए मॉडल है जो आमतौर पर पैटर्न मान्यता अनुप्रयोगों में उपयोग किया जाता है। एक पुरानी PHP क्लास भी है जो इसे पूरी तरह से लागू करती है, लेकिन आपको अपने उद्देश्यों के लिए इसे संशोधित करने की आवश्यकता होगी।

एक महान उपकरण होने के बावजूद, परसेप्ट्रॉन अभी भी कई परिणाम (संभावित मैच) लौटा सकता है, इसलिए स्कोर और अंतर की तुलना का उपयोग करना अभी भी उन मैचों में से सबसे अच्छा पहचानने के लिए उपयोगी है ।

मान्यताओं

  • प्रत्येक उपयोगकर्ता (आईपी, कुकीज़, आदि) के बारे में सभी संभावित जानकारी संग्रहीत करें
  • जहां परिणाम एक सटीक मैच है, स्कोर 1 से बढ़ाएं
  • जहां परिणाम एक सटीक मैच नहीं है, स्कोर 1 से घटाएं

उम्मीद

  1. आरएनए लेबल उत्पन्न करें
  2. डेटाबेस का अनुकरण करने वाले यादृच्छिक उपयोगकर्ता उत्पन्न करें
  3. एकल अज्ञात उपयोगकर्ता उत्पन्न करें
  4. अज्ञात उपयोगकर्ता RNA और मान उत्पन्न करें
  5. सिस्टम आरएनए जानकारी को मर्ज कर देगा और परसेप्ट्रॉन को सिखाएगा
  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 ";
}

आउटपुट:

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

"D" का Print_r:

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         |
| -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --   | --  | -- | --      | --      | --      | --      | --      | --      | --      | --      | --      | --       | --       | --       | --       | --       | --       | --       | --       | --       | --       | --       | -- | -- | -- | -- | -- | -- | -- | -- | -- | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --  | --        |
+----+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+------+-----+----+---------+---------+---------+---------+---------+---------+---------+---------+---------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----+----+----+----+----+----+----+----+----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----------+

X से 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;
    }
}

संशोधित परसेप्ट्रॉन क्लास

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

निष्कर्ष

यूनीक आइडेंटिफायर के बिना यूजर की पहचान करना सीधा-सीधा या सरल काम नहीं है। यह रैंडम डेटा की पर्याप्त मात्रा को इकट्ठा करने पर निर्भर करता है, जिसे आप विभिन्न तरीकों से उपयोगकर्ता से इकट्ठा करने में सक्षम हैं।

यहां तक ​​कि अगर आप एक कृत्रिम तंत्रिका नेटवर्क का उपयोग नहीं करने का चयन करते हैं, तो मैं सुझाव देता हूं कि प्राथमिकताओं और संभावना के साथ कम से कम एक साधारण संभाव्यता मैट्रिक्स का उपयोग करें - और मुझे आशा है कि ऊपर दिए गए कोड और उदाहरण आपको जाने के लिए पर्याप्त देते हैं।


@Baba ब्राउज़र का उपयोग करने के लिए "Blobs का उपयोग करने" से आपका क्या मतलब है?
बिलमलार्की


1
@ बाबा ब्राउज़र का उपयोग करने के लिए कोई कैसे उपयोग करेगा? बस यह जांचें कि किसी भी समय इसमें क्या है?
बिलमार्की

@ बाबा महान काम, मैंने हमेशा एक उपयोगकर्ता की पहचान करने के लिए कुछ बहु-स्तरीय रणनीति बनाने की कोशिश की है, लेकिन जैसा कि आपने कहा कि कैश को साफ किया जा सकता है, आईपी बदल गया है, परदे के पीछे के उपयोगकर्ता या नेट - विशेष रूप से उन लोगों -, कुकीज़ हटाए गए, आदि। लेकिन यह सब बहुत प्रयास के साथ भी यह एक संभावना है, भले ही बुरा उपयोगकर्ता उदाहरण के लिए Tor ब्राउज़र का उपयोग कर रहा है, सबसे अधिक अगर सभी का पता लगाने की रणनीतियों का उल्लेख नहीं किया तो काम नहीं करेगा। मुझे Browserleaks.com पसंद है, लेकिन Tor के साथ सभी अपरिभाषित या अज्ञात रूप से वापस आ गए
Mi-Creativity

एक नोट केवल एक प्रकाशन के इस रत्न से "कुछ धूल हटाने" पर इरादा है : 07.09.17 के रूप में टूटी हुई लिंक की सूची: - Implement Bayesian inference using PHP, सभी 3 भागों। - Frequency vs Probability - Joint Probability -Input (Sensor & Desired), Initial Weights, Output (Sensor, Sum, Network), Error, Correction and Final Weights
झीजी

28

इस तकनीक (कुकीज़ के बिना समान उपयोगकर्ताओं का पता लगाने के लिए - या यहां तक ​​कि आईपी पते के बिना) को ब्राउज़र फिंगरप्रिंटिंग कहा जाता है । मूल रूप से आप ब्राउज़र के बारे में जानकारी के रूप में क्रॉल कर सकते हैं - आप जावास्क्रिप्ट, फ्लैश या जावा (f.ex. स्थापित एक्सटेंशन, फोंट, आदि) के साथ बेहतर परिणाम प्राप्त कर सकते हैं। उसके बाद, यदि आप चाहें तो आप परिणाम को संग्रहीत कर सकते हैं।

यह अचूक नहीं है, लेकिन:

83.6% ब्राउज़रों के पास एक अनूठा फिंगरप्रिंट था; फ्लैश या जावा सक्षम लोगों के बीच, 94.2%। इसमें कुकीज़ शामिल नहीं हैं!

और जानकारी:


मुझे लगता है, यह अभी भी जवाब है। यदि आपको किसी उपकरण की पहचान करने की आवश्यकता है, तो आपको केवल उन डेटा को प्राप्त करने की आवश्यकता है - f.ex. OS, जेनेरिक एक्सटेंशन (और इसके 'संस्करण), स्थापित फोंट, आदि ...
pozs

इससे काम अच्छा नहीं हो रहा है। हर ब्राउज़र सत्र और कुकीज़ का समर्थन करता है। इस काम के लिए सही उपकरण का उपयोग करें।
मैन बनाम कोड

1
@ slash197 फ़ाइल कैश के बारे में क्या? मेरा मतलब है कि 1px x 1px पारदर्शी फ्लैश मीडिया के साथ-साथ एक एक्सएमएल फ़ाइल के साथ एक अद्वितीय जनरेट की गई आईडी को अंदर रखना (xml को सर्वर पर एक बार बनाया जाना चाहिए इससे पहले कि वह उपयोगकर्ता स्थानीय एचडी पर डाउनलोड हो जाए) इस तरह से भले ही उपयोगकर्ता कुकीज़ या लॉगआउट हटा देता है, आप अभी भी एक्शन स्क्रिप्ट सेंडअल्लाहड विधि का उपयोग करके एक पुल बना सकते हैं।
मबरी

परिवर्तन का न्यूनतम प्रभाव हैश परिणाम को प्रभावित करेगा। उदाहरण के लिए शॉक वेव प्लेयर का संस्करण। ब्राउज़र पर अद्वितीय कुंजी उत्पन्न + छिपी 1px x 1px फ्लैश मीडिया (एक्शन स्क्रिप्ट) के साथ स्थानीय रूप से संग्रहीत xml कैश फ़ाइल के साथ संभव समाधान, इस तरह से आप कुकीज़ से छुटकारा पा लेते हैं, सत्र समाप्ति मुद्दा अगर वह मुख्य मुद्दा था। आप अभी भी अपने sql डेटाबेस और उपयोगकर्ता स्थानीय मशीन पर कुंजी के बीच पुल रख सकते हैं।
मबरी

@ मैबरी मैं ज्यादा फ्लैश फैन का नहीं हूं, लेकिन अगर ब्राउजर में फ्लैश ब्लॉकिंग ऐड-ऑन है जैसे मेरे पास है कि 1x1 पिक्सेल फ्लैश मीडिया डिसेबल हो जाएगा, तो क्या मैं बर्बाद हो गया हूं?
slash197

7

ऊपर वर्णित थंबप्रिन्टिंग कार्य करता है, लेकिन अभी भी कोलों को पीड़ित कर सकता है।

एक तरीका यह है कि उपयोगकर्ता के साथ प्रत्येक सहभागिता के url में UID को जोड़ा जाए।

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

जहां साइट के प्रत्येक लिंक को इस संशोधक के साथ अनुकूलित किया गया है। यह उसी तरह है जैसे ASP.Net ने पृष्ठों के बीच FORM डेटा का उपयोग करके काम किया था।


मुझे लगा कि लेकिन उपयोगकर्ता के लिए इसे संशोधित करने का सबसे आसान तरीका है
slash197

1
आईडी का नहीं एक स्वयं संदर्भित हैश है। इसे क्रिप्टोग्राफिक रूप से सुरक्षित बनाता है।
जस्टिन अलेक्जेंडर

साथ ही, यह तरीका ठीक है जब कोई व्यक्ति साइट को ब्राउज़ कर रहा है, लेकिन आप उस मामले को संभालने का प्रस्ताव कैसे देते हैं जब एक लौटने वाला उपयोगकर्ता एक सप्ताह के बाद वापस आता है और बस वेबसाइट के पते में, बिना आईडी के टाइप करता है?
स्लैश 197

उस स्थिति में @ slash197 क्यों न आप उपयोगकर्ता को लॉगिन करने के लिए कहें, कि जब उपयोगकर्ता कुकीज़ हटाता है तब भी क्या होता है।
आकाश काव

6

क्या आपने एवरकुकी में देखा है ? यह ब्राउज़रों में काम कर भी सकता है और नहीं भी। उनकी साइट से एक अर्क।

"यदि कोई उपयोगकर्ता एक ब्राउज़र पर पकाया जाता है और किसी अन्य ब्राउज़र पर स्विच करता है, जब तक कि उसके पास अभी भी स्थानीय साझा ऑब्जेक्ट कुकी है, तो कुकी दोनों ब्राउज़र में पुन: उत्पन्न होगी।"


मुझे आश्चर्य है कि अगर यह जावास्क्रिप्ट अक्षम के साथ काम करता है। क्या आपको कोई अनुभव है?
वॉयटस

यह एक कारण के लिए सदाबहार कहा जाता है, यह कोई फर्क नहीं पड़ता कि क्या काम करेगा। कुकी को निकालना उनके लिए असंभव है।
एलेक्सिस टायलर

यह कोई बात नहीं क्या काम नहीं करेगा। विवरण की पहली पंक्ति से: 'evercookie एक जावास्क्रिप्ट एपीआई है ...'। यदि जावास्क्रिप्ट अक्षम है तो यह काम नहीं करेगा।
gdw2

विकलांग भी नहीं होना चाहिए। घोस्टरी एंड यूब्लॉक सदाबहार बूँदें
खुला '10

3

आप कैश्ड पीएनजी के साथ ऐसा कर सकते हैं, यह कुछ हद तक अविश्वसनीय होगा (विभिन्न ब्राउज़र अलग तरह से व्यवहार करते हैं, और यह विफल हो जाएगा यदि उपयोगकर्ता अपना कैश साफ़ करता है), लेकिन यह एक विकल्प है।

1: एक डेटाबेस सेट करें जो एक यूनिक यूजर आईडी को हेक्स स्ट्रिंग के रूप में संग्रहीत करता है

2: एक genUser.php (या जो भी भाषा) फ़ाइल बनाएं जो एक उपयोगकर्ता आईडी बनाता है, उसे DB में संग्रहीत करता है और फिर एक वास्तविक रंग बनाता है। उस हेक्स स्ट्रिंग (प्रत्येक पिक्सेल 4 बाइट्स) के मानों से बाहर निकलेगा और वापस आ जाएगा। ब्राउज़र के लिए। सामग्री-प्रकार और कैश हेडर सेट करना सुनिश्चित करें।

3: HTML या JS में एक इमेज बनाते हैं <img id='user_id' src='genUser.php' />

4: उस छवि को एक कैनवास पर खींचें ctx.drawImage(document.getElementById('user_id'), 0, 0);

5: उपयोग करके उस छवि के बाइट्स को पढ़ें ctx.getImageData, और पूर्णांक को हेक्स स्ट्रिंग में बदलें।

6: यह आपकी अद्वितीय उपयोगकर्ता आईडी है जो अब आपके उपयोगकर्ता कंप्यूटर पर कैश की गई है।


वह कुछ ऐसा चाहता है जो उपयोगकर्ता को "ब्राउज़रों के पार" ट्रैक कर सके जो यहां काम नहीं करेगा (प्रत्येक ब्राउज़र का अपना कैश डेटाबेस है)।
EricLaw

आप यह कहां देख रहे हैं, उनका प्रश्न केवल "यह उल्लेख करना भूल गया है कि इसे क्रॉस-ब्राउज़र संगत होना आवश्यक है", अर्थात किसी भी ब्राउज़र में काम करना।
hobberwickey

उनका सवाल खराब लिखा गया है। I'm after device recognitionक्या वह चाहता है के लिए सस्ता है, और वह यहाँ विस्तृत: stackoverflow.com/questions/15966812/…
EricLaw

2

आपने जो कहा है उसके आधार पर:

मूल रूप से मैं डिवाइस मान्यता के बाद वास्तव में उपयोगकर्ता नहीं हूं

इसे करने का सबसे अच्छा तरीका मैक एड्रेस जो एनआईसी आईडी है, उसे भेजना है।

आप इस पोस्ट पर एक नज़र डाल सकते हैं: मैं PHP में कनेक्टेड क्लाइंट का मैक और आईपी पता कैसे प्राप्त कर सकता हूं?


क्षमा करें, लेकिन एनआईसी आईडी आसान नहीं है। यह निश्चित रूप से सबसे अच्छा तरीका नहीं है।
18:13

@asgs ब्राउज़र फिंगरप्रिंटिंग बेहतर हो सकता है, या आपकी राय में सबसे अच्छा तरीका क्या होगा?
मेहदी करमोसली

कोई सबसे अच्छा तरीका नहीं है, इसके बारे में दुख की बात है। हालाँकि, वह और ब्राउज़र फ़िंगरप्रिंटिंग, जो कि बाबा ने ऊपर प्रस्तुत की है, संभाव्यता के अध्ययन के साथ संयोजन में मेरी राय में सबसे अच्छा होगा।
asgs

1

आप इसे etags के साथ कर सकते हैं। हालांकि मुझे यकीन नहीं है कि अगर यह कानूनी मुकदमा दायर किया गया था।

यदि आप अपने उपयोगकर्ताओं को ठीक से चेतावनी देते हैं या यदि आपके पास इंट्रानेट वेबसाइट जैसी कोई चीज है तो यह ठीक हो सकता है।


Etags पार संगत ब्राउज़र नहीं हैं।
स्लैश 197

1
Etags HTTP / 1.1 कल्पना का हिस्सा हैं। सभी लोकप्रिय ब्राउज़र etags का समर्थन करते हैं, आपको ETag / if-none-Match हेडर का समर्थन नहीं करने के लिए अपने ब्राउज़र को लिखने की बहुत आवश्यकता होगी।
ब्रायन मैकगिनिटी

मैंने यह नहीं कहा कि यह इसका समर्थन नहीं करता है, मैंने कहा कि इसका क्रॉस ब्राउज़र संगत नहीं है। यदि कोई टैग फ़ायरफ़ॉक्स में सहेजा गया है, तो वह क्रोम में उपलब्ध नहीं है, इसलिए सामग्री फिर से डाउनलोड हो जाएगी क्योंकि कैश नहीं है।
slash197

अब मैं समझ गया कि आप क्या कह रहे थे। आप सही हे। प्रत्येक ब्राउज़र का अपना कैश स्टोर होता है, इसलिए अलग-अलग etags।
ब्रायन मैक्गिनिटी

1

आप संभवतः डिवाइस पहचानकर्ता को संग्रहीत करने के लिए एक बूँद बना सकते हैं ...

नकारात्मक पक्ष यह है कि उपयोगकर्ता को बूँद डाउनलोड करने की आवश्यकता है ( आप डाउनलोड को बाध्य कर सकते हैं ), क्योंकि ब्राउज़र फ़ाइल सिस्टम को सीधे फ़ाइल को बचाने के लिए एक्सेस नहीं कर सकता है।

संदर्भ:

https://www.inkling.com/read/javascript-definitive-guide-david-flanagan-6th/chapter-22/blobs


0

अक्षम, लेकिन आपको वांछित परिणाम दे सकता है, आपके पक्ष में एक एपीआई सर्वेक्षण करना होगा। क्लाइंट पक्ष पर एक पृष्ठभूमि प्रक्रिया है जो एक अंतराल पर उपयोगकर्ता डेटा भेजता है। अपने एपीआई को भेजने के लिए आपको एक उपयोगकर्ता पहचानकर्ता की आवश्यकता होगी। एक बार आपके पास वह विशिष्ट पहचानकर्ता से जुड़ी कोई भी जानकारी भेज सकता है।

यह कुकीज़ और स्थानीय भंडार की आवश्यकता को दूर करता है।


0

मैं विश्वास नहीं कर सकता, http://browserspy.dk अभी भी यहाँ उल्लेख नहीं किया गया है! साइट कई विशेषताओं का वर्णन करती है (पैटर्न मान्यता के संदर्भ में), जिसका उपयोग एक क्लासिफायरियर बनाने में किया जा सकता है।

और कारण, उन विशेषताओं के मूल्यांकन के लिए जो मैं विशेष रूप से वेक्टर मशीनों और लिब्स्विम का समर्थन करना चाहूंगा


0

एक सत्र के दौरान या सत्र के दौरान उन्हें ट्रैक करें?

यदि आपकी साइट HTTPS है हर जगह आप उपयोगकर्ता के सत्र को ट्रैक करने के लिए TLS सत्र आईडी का उपयोग कर सकते हैं


1
यहाँ सवाल यह है कि कैसे?
user455318

-2
  1. क्रॉस-प्लेटफ़ॉर्म डमी (nsapi) प्लगइन बनाएं और प्लगइन नाम या संस्करण के लिए एक अद्वितीय नाम उत्पन्न करें जब उपयोगकर्ता इसे डाउनलोड करता है (जैसे लॉगिन के बाद)।
  2. प्लगइन के लिए एक इंस्टॉलर प्रदान करें / इसे प्रति नीति स्थापित करें

इसके लिए उपयोगकर्ता को स्वेच्छा से पहचानकर्ता को स्थापित करना होगा।

एक बार प्लगइन स्थापित हो जाने के बाद, किसी भी (प्लगइन सक्षम) ब्राउज़र के फिंगरप्रिंट में यह विशिष्ट प्लगइन होगा। सर्वर पर जानकारी वापस करने के लिए, क्लाइंट-साइड पर प्लगइन का प्रभावी ढंग से पता लगाने के लिए एक एल्गोरिथ्म की आवश्यकता होती है, अन्यथा IE और फ़ायरफ़ॉक्स> = 28 उपयोगकर्ताओं को संभावित वैध पहचानों की एक तालिका की आवश्यकता होगी।

इसके लिए एक प्रौद्योगिकी में अपेक्षाकृत उच्च निवेश की आवश्यकता होती है जो संभवतः ब्राउज़र-विक्रेताओं द्वारा बंद कर दी जाएगी। जब आप प्लगइन स्थापित करने के लिए अपने उपयोगकर्ताओं को समझाने में सक्षम होते हैं, तो स्थानीय ड्राइवर स्थापित करने , वीपीएन का उपयोग करने या नेटवर्क ड्राइवरों को पैच करने जैसे विकल्प भी हो सकते हैं ।

जो उपयोगकर्ता पहचान नहीं करना चाहते हैं (या उनकी मशीनें) हमेशा इसे रोकने के लिए एक रास्ता खोज लेंगे।


नमस्ते अतिप्रवाह ढेर करने के लिए आपका स्वागत है। कृपया ध्यान दें; this will require the user to willingly install the identifier.शायद मूल पोस्टर (ओपी) का मतलब क्या नहीं है।
स्टेफन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.