أي لغات البرمجة تعتبر اكثر امانا من ناحية انها سوف تجبر المتعلم على ان يتعلم الاساسيات بشكل صحيح، واكثرهم انسيابية من ناحية ان الشخص اذا تعلمها فانها ستلبي له مطالب عدة وليس بحاجة على المستوى القريب ان ينتقل الى لغة اخرى؟
أي لغة أكثر أماناً وأكثر انسيابية للتعلم؟
اخي انت لم تذكر سوى عيوبها
الان بعد ظهور MYSQLI ليس هناك ثغرات SQL-injection
نظام القوالب يسهل عملية البرمجة بشكل جيد
لغة بي اتش بي داعمة لعدة اطر عمل
اما بايثون فعندك اطارين فقط هما فلايك ودجانغو
80 في المائة من المواقع تستخدم بي اتش بي
ملاحظة انا احب لغة بايثون و اجيد التعامل مع دجانغو لكن لكل ذي حق حقه
كما انه سيجد صعوبة في تعلمها اذا لم يبدأ بلغات (الاقواس) اخي
اخي انت لم تذكر سوى عيوبها
هو سأل وأنا أجبت. ما هي اللغة الأكثر أمنا وطبعا كما نعلم أي لغة بحد ثاتها لا يقال عنها أكثر أمنا أو أقل أمنا لكن هناك أخطاء أمنية تسهل اللغة على المبرمجين ارتكابها وأنا ذكرت كل لغة وما هي الأخطاء الأمنية الأكثر شيوعا في تلك اللغة.
ولنأخذ الأمثلة في mysqli مثلا
$mysqli->query("INSERT INTO test(id, label) VALUES (1, 'a')")
$mysqli->query("SELECT id, label FROM test WHERE id = 1")
لاحظ أن القيم a و 1 جاءات مضمنة في النص وهذا هو المدخل لثغرات SQL-injection وانتهت الصفحة دون تحديث أو نصح بالطريقة الصحيحة.
كذلك هذه الصفحة http://www.php.net/manual/e...
اكتفت بعبارة Data inside the query should be properly escaped دون شرح الطريقة والسبب أن الطريقة أطول من أن تشرح.
لاحظ الفرق بينها وبين تنفيذ استعلام محمي في Yii (وهو مكتوب بلغة php)
$user = Yii::app()->db
->createCommand('SELECT * FROM tbl_user WHERE name=:name LIMIT 1')
->queryRow(array(':name'=>$_GET['name']));
هذا المثال يعمل على تخطي المحارف الخاصة والتي تحميك من SQL-injection دون أي عناء فقط تضع : ثم اسم المتغير وتمرره كمنظومة وتتكفل هي بالباقي. الشاهد من كل هذا أن اللغة تسهل عليك ارتكاب الأخطاء وأنت بحاجة إلى بذل جهد كبير في حماية نفسك بنفسك أو في استعمال مكونات خارجية. في حين مع بايثون تأتي اللعبة مع بطاريات جاهزة للتشغيل. عملية تمرير معاملات وتخطي الحروف الخاصة ليس أمر شكلي اختياري ديكوري حتى أحتاج لمكون خارجي.
اما بايثون فعندك اطارين فقط هما فلايك ودجانغو
راجع معلوماتك. هي أكثر من أن أعدها لكن وجود واحد جيد يكفي.
80 في المائة من المواقع تستخدم بي اتش بي
لهذا 80% من المواقع معرضة ل XSS و SQL-inject.
نظام القوالب يسهل عملية البرمجة بشكل جيد
نعم يجب أن يكون هناك نظام منفصل للقوالب وليس خلط قولبة البيانات وعرضها بالكود وهذا مبدأ مهم غير متحقق في PHP فهي شوربة معكرونة لكن الخبر الجيد أنها لا تلزمك بذلك ولا تمنعك من فصل (يمكنك مثلا استعمال قوالب mustache أو smarty أو twig في php) هذا لكن تظل المشكلة أنها تسمح لك بعد الفصل من الأساس.
وأنا كنت ذكرت فقرة من دليل جانغو لذا دعني أعطيك الآن مثال آخر من إطار عمل القارورة bottle في بايثون وهو إطار مصغر (يعني ليس فيه لا نظام جلسات ولا نظام قواعد بيانات ...) هو يحتوي على قوالب تافهة صغيرة متواضعة ويسمح لك بخلط كود بايثون كامل داخل القالب وكل العيوب التي تريد وهو قد يكون أسوأ نظام قوالب في عالم بايثون لكن لاحظ أنك عندما تريد وضع قيمة name في h1
<h1>Hello {{name}}!</h1>
فإنه يحميك من XSS.
الشاهد من الموضوع ليس أن هذه اللغة أفضل من تلك بل أن هذه تسهل كذا وتلك تحتاج كذا.
ليست ثغرة بقدر ما هي عيب في التصميم. إن الأصل هو عدم الحماية والمبرمج عليه أن تضع مكان الكود غير الآمن
<h1>Hello <?php echo $name ?>!</h1>
الكود الآمن التالي
<h1>Hello <?php echo htmlspecialchars($name, ENT_QUOTES) ?>!</h1>
ومكان الكود غير الآمن التالي
$mysqli->query("INSERT INTO test(id, first_name, last_name) VALUES (1, '$first_name', '$last_name')");
بالكود الآمن التالي
$params=array();
$params[':first_name']='\''.$mysqli->real_escape_string($first_name).'\'';
$params[':last_name']='\''.$mysqli->real_escape_string($last_name).'\'';
$mysqli->query(str_replace(array_keys($params), array_values($params), 'INSERT INTO test(id, first_name, last_name) VALUES (1, :first_name, :last_name)'));
الكود الآمن أعلاه لن تجده في الوثائق وهو أقرب لحل إلتفافي منه إلى مكتبة آمنة.
التعليقات