سؤال

تحرير: لقد وجدت منذ ونشرت فعالة وأنيقة الحل الذي يحول معرفات مثل 3141592 سلاسل مثل vJST وإلى الوراء.أنها متاحة PHP هنا:

https://github.com/delight-im/PHP-IDs

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

المشكلة:

لدي ديناميكية الصفحات في PHP حيث يتم عرض المحتوى وفقا id معين.الهوية هي دائما في المقدمة عن طريق الحصول على المعلمة:الصفحة.php?id=X هذا يسبب مشكلة:يمكن زوار الموقع تعداد معرفات و ببساطة المشي من خلال جميع صفحات المحتوى المختلفة.هذا لا ينبغي أن يكون من الممكن بالطبع.

كيف يمكن حلها ؟

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

ممكن الحل من وجهة نظري:

أود أن تحويل عدد صحيح معرف قاعدة 38 صحيح واستبدال الأرقام من قبل شخصيات من قائمة معينة.وأود أن استخدام هذه الأحرف المشفرة string id:

a-z 0-9 - _

يمكنك استخدام أحرف أخرى أيضا ؟ هذه الشخصيات السيناريو سيكون هذا:

function id2secure($old_number) {
    $alphabet_en = array(0=>'1', 1=>'3', 2=>'5', 3=>'7', 4=>'9', 5=>'0', 6=>'2', 7=>'4', 8=>'6', 9=>'8', 10=>'a', 11=>'c', 12=>'e', 13=>'g', 14=>'i', 15=>'k', 16=>'m', 17=>'o', 18=>'q', 19=>'s', 20=>'u', 21=>'w', 22=>'y', 23=>'b', 24=>'d', 25=>'f', 26=>'h', 27=>'j', 28=>'l', 29=>'n', 30=>'p', 31=>'r', 32=>'t', 33=>'v', 34=>'x', 35=>'z', 36=>'-', 37=>'_');
    $new_number = '';
    while ($old_number > 0) {
        $rest = $old_number%38;
        if (!isset($alphabet_en[$rest])) { return FALSE; }
        $new_number .= $alphabet_en[$rest];
        $old_number = floor($old_number/38);
    }
    $new_number = strrev($new_number);
    return $new_number;
}

سؤال إضافي:

ما يمكن أن يكون عكس وظيفة لي وظيفة ؟

آمل أن تتمكن من مساعدتي.شكرا لك!

هل كانت مفيدة؟

المحلول

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

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

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

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

ننسى شخصية بسيطة استبدال وغيرها من السذاجة التشويش التقنيات.إنهم مضيعة للوقت الخاص بك.

تحرير: إذا كنت بعد غير متتابعة المعرفات التي هي نفس طول النظر باستخدام UUIDs بدلا من زيادة تلقائية المفاتيح الأساسية.أساسا هذا هو القيام به في مستوى التطبيق:

  • تغيير المفتاح الأساسي الخاص بك إلى شار(36);
  • في insert يجب عليك تعيين مفتاح وملء مع الخلية UUID() وظيفة.

نلقي نظرة على إلى UUID أو لا UUID ? و UUID باعتباره المفتاح الأساسي.هناك تدهور الأداء من هذا (على وجه التحديد لأن كنت تستخدم أحرف بدلا من الاعداد الصحيحه البحث) ولكن لم يكن لديك كبيرة (1 مليون+ الصفوف) أو البيانات ربما لن يكون مشكلة في الممارسة.

نصائح أخرى

استخدام المجموع الاختباري خوارزمية مثل Luhn:

$id = 1337;

$_GET['id'] = Luhn($id, 3); // 1337518, adds 3 checkdigits
$_GET['id'] = Luhn_Verify($_GET['id'], 3); // 1337, returns the original number of false if validation fails

echo $_GET['id']; // 1337

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

$id = Luhn_Verify($_GET['id'], 3);

if ($id === false)
{
    // someone is trying to guess the ID
}

else
{
    // $id is valid, do the DB stuff here
}

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

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

يمكنك أيضا استخدام Hashids ترميز/فك شفرة الخاص بك معرفات.

هذه المدونة كتبت بقصد وضع إنشاء معرفات في أماكن مرئية مثل URL.

Hashids صغيرة مفتوحة المصدر مكتبة يولد قصيرة, فريدة من نوعها, غير متتابعة معرفات من الأرقام.
فإنه يحول الأرقام مثل 347 في سلاسل مثل "yr8" ، أو مجموعة من الأرقام مثل [27, 986] في "3kTMd".
يمكنك أيضا فك تلك المعرفات مرة أخرى.هذا هو مفيدة في تجميع العديد من المعلمات في واحدة أو ببساطة استخدامها قصيرة منها.

لا تهتم حول هذه "المشكلة" ، ولكن على أي حال أنا استخدامها على بلدي واحد من المشاريع من هذه الطريقة:

بعد حفظ صفحة جديدة إلى DB, أنا ولدت md5 of (record_id + page_title) ووضعها على حقل خاص pagecode.ثم دخلت على صفحات قبل أن صفحة التعليمات البرمجية بدلا من معرف.وأنه من الأفضل أن مؤشر pagecode الحقل في قاعدة البيانات.

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

لست متأكدا لماذا ينبغي أن يكون هذا مشكلة - الناس يمكن عرض قائمة من كافة (العامة, Googlebot-فهرسة) صفحات على موقع على شبكة الإنترنت فقط عن طريق كتابة site:domain.com في جوجل ، وحلقة من خلال لهم إذا رغبوا في ذلك.تغيير فهرس فريد تستخدمها لن يغير ذلك.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top