php tag - هل هناك أي اختلاف معين بين الفترة الزمنية والصب إلى int-(int)X`؟




w3schools html (7)

شيء واحد أن نلاحظه عن الفرق بين (int) و intval() : intval() يعامل المتغيرات التي هي بالفعل int s و float s كأنها لا تحتاج إلى تحويل ، بغض النظر عن الوسيطة الأساسية (اعتبارًا من PHP 5.3.5 على الأقل). هذا السلوك ليس هو الأكثر وضوحًا ، كما هو موضح في التعليقات على صفحة PHP وأكرر هنا بلا خجل:

$test_int    = 12;
$test_string = "12";
$test_float  = 12.8;

echo (int) $test_int;         // 12
echo (int) $test_string;      // 12
echo (int) $test_float;       // 12

echo intval($test_int, 8);    // 12 <-- WOAH!
echo intval($test_string, 8); // 10
echo intval($test_float, 8)   // 12 <-- HUH?

هل هناك أي فرق معين بين intval و (int)؟

مثال:

$product_id = intval($_GET['pid']);
$product_id = (int) $_GET['pid'];

هل يوجد فرق معين بين سطرين من الكود؟


الشيء الذي يفعله intval هو أن التحويل البسيط ليس هو التحويل الأساسي:

int intval ( mixed $var [, int $base = 10 ] )

إذا كانت القاعدة 10 على الرغم من ذلك ، يجب أن تكون intval هي نفسها مثل cast (إلا إذا كنت ستصبح nitpicky وتذكر أن أحدها يقوم بإجراء مكالمة دالة بينما لا يقوم الآخر). كما هو موضح في intval :

تنطبق القواعد العامة للإدخال الصحيح.


يمكن تمرير intval() قاعدة منه للتحويل. (int) لا يمكن.

int intval( mixed $var  [, int $base = 10  ] )

أعتقد أن هناك اختلاف واحد على الأقل: مع intval ، يمكنك تحديد القاعدة التي يجب استخدامها كمعلمة ثانية (الأساس 10 بشكل افتراضي):

var_dump((int)"0123", intval("0123"), intval("0123", 8));

سوف تحصل :

int 123
int 123
int 83

إحدى الخصائص المفيدة intval هي أنه - نظرًا لأنها دالة وليست بنية لغة - يمكن تمريرها كوسيطة لدالة تتوقع وظيفة. لا يمكنك القيام بذلك مع (int) .

على سبيل المثال ، لقد استخدمتها لتعقيم الأعداد الصحيحة لتضمينها في جملة SQL IN() عبر تمريرها إلى array_map . هنا مثال:

$ids = implode(",", array_map('intval', $_POST['array_of_integers']));
$sql = "SELECT * FROM table WHERE ids IN ($ids)";

العنبر هو الصحيح وإذا أمكنني إضافة نوع مفيد من معلومات الإرسال (إضافة "(int)" قبل التعبير الخاص بك) هو 300 إلى 600٪ أسرع من intval. لذلك إذا كان الغرض الخاص بك هو عدم التعامل مع قواعد أخرى غير العشرية ، فإنني أوصي باستخدام: (int) $something


إخلاء المسؤولية : تمت كتابة هذه الإجابة في عام 2008.

منذ ذلك الحين ، أعطتنا PHP php.net/manual/en/function.password-hash.php password_verify ، ومنذ تقديمها ، فهي طريقة موصى بها لتجزئة كلمة المرور.

نظرية الجواب لا تزال قراءة جيدة رغم ذلك.

TL، DR

يترك

  • لا تحد ما الأحرف التي يمكن للمستخدمين إدخالها لكلمات المرور. فقط البلهاء يفعلون هذا
  • لا تحد من طول كلمة المرور. إذا كان مستخدموك يريدون جملة مع supercalifragilisticexpialidocious فيها ، فلا تمنعهم من استخدامها.
  • لا تقم أبدًا بتخزين كلمة مرور المستخدم الخاصة بك بنص عادي.
  • لا ترسل مطلقًا كلمة مرور إلى المستخدم إلا عندما يفقدون كلمة المرور الخاصة بهم ، وقمت بإرسال كلمة مرور مؤقتة.
  • أبدا ، من أي وقت مضى تسجيل كلمات المرور بأي شكل من الأشكال.
  • أبدا كلمات المرور تجزئة مع SHA1 أو MD5 أو حتى SHA256! يمكن أن تتجاوز المفرقعات الحديثة 60 و 180 مليار درهم / ثانية (على التوالي).
  • لا تخلط bcrypt ومع الإخراج الخام من hash () ، إما استخدام إخراج عرافة أو base64_encode عليه. (ينطبق هذا على أي إدخال قد يحتوي على \0 rogue \0 ، مما قد يؤدي إلى إضعاف الأمان بشكل خطير.)

دوس

  • استخدم scrypt عندما تستطيع ؛ bcrypt إذا كنت لا تستطيع ذلك.
  • استخدم PBKDF2 إذا كنت لا تستطيع استخدام bcrypt أو scrypt ، باستخدام SHA2 hashes.
  • إعادة تعيين كلمات مرور الجميع عند اختراق قاعدة البيانات.
  • تنفيذ الحد الأدنى للطول المناسب من 8 إلى 10 أحرف ، بالإضافة إلى تتطلب حرفًا كبيرًا واحدًا على الأقل ، وحرفًا صغيرًا واحدًا ، ورقمًا ، ورمزًا. سيؤدي ذلك إلى تحسين إنتروبيا كلمة المرور ، مما يجعل من الصعب كسرها. (راجع قسم "ما الذي يجعل كلمة مرور جيدة؟" في بعض النقاش.)

لماذا تجزئة كلمات المرور على أي حال؟

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

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

صرح Jeremiah Grossman، CTO of Whitehat Security ، في مدونته بعد استعادة كلمة المرور الأخيرة التي تطلبت كسر القوة الغاشمة لحماية كلمة المرور الخاصة به:

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

(التشديد لي.)

ما الذي يجعل كلمة مرور جيدة على أي حال؟

Entropy . (لا أوافق بالكامل على وجهة نظر راندال.)

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

كلمة السر إنتروبيا approximated بسهولة. يؤدي استخدام مجموعة كاملة من أحرف ascii (حوالي 96 حرفًا قابلاً للطباعة) إلى إنتروبيا تبلغ 6.6 حرفًا لكل حرف ، والتي لا تزال عند 8 أحرف لكلمة مرور منخفضة جدًا (52.679 بت من الإنتروبيا) للأمان المستقبلي. لكن الخبر السار هو: كلمات مرور أطول وكلمات مرور بأحرف unicode ، تزيد من حقيقة كلمة السر وتجعل من الصعب كسرها.

هناك مناقشة أطول للانتروبيا كلمة المرور على موقع Crypto StackExchange . سيحقق البحث الجيد من Google أيضًا الكثير من النتائج.

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

بقدر ما كنت قادرا على إخباره ، فإن جعل أفضل كلمة مرور في العالم هو Catch-22. إما الأحرف التي لا تنسى أو يمكن التنبؤ بها أو قصيرة جدًا أو عددًا كبيرًا من أحرف unicode (يصعب كتابتها على جهاز Windows / Mobile) ، أو طويلة جدًا ، وما إلى ذلك. لا توجد كلمة مرور جيدة بما يكفي لأغراضنا ، لذلك يجب أن نحميهم كما لو كانوا كانت في فورت نوكس.

أفضل الممارسات

Bcrypt و scrypt هي أفضل الممارسات الحالية. سيكون scrypt أفضل من bcrypt في الوقت المناسب ، لكنه لم ير التبني كمعيار من قبل Linux / Unix أو من قبل خوادم الويب ، ولم يقم بمراجعة متعمقة لخوارزمية نشرها حتى الآن. ولكن لا يزال ، مستقبل الخوارزمية يبدو واعدًا. إذا كنت تعمل مع Ruby ، ​​فهناك جوهرة مقفلة ستساعدك على الخروج ، ولدى Node.js الآن حزمة scrypt خاصة بها. يمكنك استخدام Scrypt in PHP إما عن طريق امتداد Scrypt أو ملحق Libsodium (يتوفر كلاهما في PECL).

أقترح بشدة قراءة وثائق وظيفة القبو إذا كنت تريد فهم كيفية استخدام bcrypt ، أو العثور على wrapper good أو استخدام شيء مثل openwall.com/phpass لتنفيذ أكثر تراثًا. أوصي بحد أدنى 12 جولة من bcrypt ، إن لم يكن 15 إلى 18.

لقد غيرت رأيي في استخدام bcrypt عندما علمت أن bcrypt يستخدم فقط الجدول الزمني الرئيسي blowfish ، مع آلية التكلفة المتغيرة. هذا الأخير يتيح لك زيادة تكلفة القوة الغاشمة لكلمة المرور عن طريق زيادة الجدول الزمني الرئيسي مكلف بالفعل.

متوسط ​​الممارسات

أنا تقريبا لا أستطيع تخيل هذا الموقف بعد الآن. يدعم openwall.com/phpass PHP 3.0.18 من خلال 5.3 ، لذلك فهو قابل للاستخدام على كل تركيب تقريباً يمكن تخيله - ويجب استخدامه إذا كنت لا تعرف على وجه اليقين أن بيئتك تدعم bcrypt.

ولكن لنفترض أنك لا تستطيع استخدام bcrypt أو PHPASS على الإطلاق. ماذا بعد؟

حاول تنفيذ PDKBF2 مع الحد الأقصى لعدد الجولات التي يمكن أن تتحملها بيئة / تطبيق / إدراك المستخدم. أقل عدد نوصي به هو 2500 طلقة. أيضًا ، تأكد من استخدام hash_hmac() إذا كان متاحًا لجعل العملية أكثر صعوبة في التكاثر.

الممارسات المستقبلية

المجيء في PHP 5.5 هو مكتبة حماية بكلمة مرور تزيل أي آلام للعمل مع bcrypt. في حين أن معظمنا عالقون مع PHP 5.2 و 5.3 في أكثر البيئات شيوعًا ، خاصةً المضيفات المشتركة ، فقد قامircmaxell ببناء طبقة توافق لواجهة برمجة التطبيقات (API) القادمة المتوافقة للخلف مع PHP 5.3.7.

تشفير وإخلاء المسؤولية

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

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

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





php