مشاهده نسخه کامل
: سوال در مورد PHP
Reza Azimy_RW
28-04-2015, 00:00
اساتید محترم سلام
میبخشید این کدی که نوشتم از نظر امنیتی چقدر قویه ؟ آیا کسی میتونه هکش کنه ؟ راحت یا ... ؟ برای بالاتر بردن امنیتش چیکار میشه کرد ؟
اگه یکی یا قسمتی از سوالا رو هم بلدید خیلی ممنون میشم راهنمایی کنید :n12:
چون ممکنه کدها به هم بریزه تو صفحه وحسش نباشه کپی کنید تو ویرایشگر (:دی) یک عکس هم از کدها گرفتم که قرار میدم :
عکس :
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
کدها :
<?php
$db = mysql_connect('mysql_host', 'mysql_user', 'mysql_password') or die('Could not connect: ' . mysql_error());
mysql_select_db('my_database') or die('Could not select database');
// Strings must be escaped to prevent SQL injection attack.
$name = mysql_real_escape_string($_GET['name'], $db);
$score = mysql_real_escape_string($_GET['score'], $db);
$hash = $_GET['hash'];
$secretKey="mySecretKey"; # Change this value to match the value stored in the client javascript below
$real_hash = md5($name . $score . $secretKey);
if($real_hash == $hash) {
// Send variables for the MySQL database class.
$query = "insert into scores values (NULL, '$name', '$score');";
$result = mysql_query($query) or die('Query failed: ' . mysql_error());
}
?>
ممنون و موفق باشین :n12:
behnamy01
28-04-2015, 09:56
دقیق مشخص نیست کدتون چه کاری انجام میده، اگر میگفتید بهتر بود! مثلا شبیه کد بخش لاگین (authentication کاربر توی دیتابیس) هستش ولی با وجود گرفتن hash با GET این فرض رد میشه!! اگر بگید چه کار میخواین بکنید بهتر میشه توضیح داد. به هر جهت موارد زیر رو در حالت کلی میشه گفت:
1- از توابع MySQL استفاده نکنید، از mysqli یا PDO استفاده کنید و داده های ورودی کاربر رو Bind param کنید.
2- ترجیجا از md5 استفاده نکنید اگر هدفتون اینه که چیزی رو هش شده توی دیتابیس قرار بدید. از bcrypt یا sha512 استفاده کنید.
3- ترجیحا از GET استفاده نکنید چون ورودی ها توی url دیده میشن و از لحاظ امنیتی زیاد جالب نیست. از POST استفاده کنید.
4- باید کدهای جاوا اسکریپت سمت کلاینت رو بذارید تا مشخص بشه آیا کارتون از لحاظ امنیتی درست هستش یا نه.
5- اگر نمیخواین خطا ها رو به کاربر نشون بدید اون die و MySQL_error و ... رو بردارید و نمایش اررور ها رو هم غیرفعال کنید.
در نهایت هم دوست عزیز سوالتون رو توی بخش PHP بپرسید تا من و سایر دوستان ببینیم و بتونیم جواب بدیم. من دیشب شانسی این تاپیک رو از بخش آخرین تاپیک های انجمن دیدم و این بخش رو اصلا دنبال نمی کنم.
tabriz-info
28-04-2015, 16:58
این کد های mysql که نوشتی کلا از استاندارد خارج شده و دیگه پشتیبانی نمیشه
بقیه موارد هم که دوستمون به خوبی و کامل بیان فرمودند
Reza Azimy_RW
01-05-2015, 17:01
کدهای سمت کلانیت c# هستن واسه ثبت امتیاز بازی انلاینه درسته کدها قدیمیه چون از جایی کپی کردم واسه تست
در کل دمتون گرم نکته هایی که گفتین عالی بود خیلی کمکم کرد :n12::n11:
Reza Azimy_RW
02-05-2015, 22:27
دوستان یه سوال دیگس بدجوری درگیرم کرده چجوری بفهمم کاربرر آنلاینه یا افلاین ؟ هر لحظه چک بشه تا هر وقت از بازی افلاین شد متوجه بشم ,یه همچین چیزی
دمتون گرم :n12:
behnamy01
02-05-2015, 23:17
سلام. در وهله اول سشن ها رو توی دیتابیس ذخیره کنید نه به حالت معمولی، این کار برای امنیت هم بهتره. سرچ کنید: ذخیره سشن در DB
بعدش کوئری بزنید به دیتابیس و چک کنید آیا سشن اون کاربر وجود داره یا نه، اگر وجود نداشت یعنی آفلاینه!
Reza Azimy_RW
03-05-2015, 18:09
سلام. در وهله اول سشن ها رو توی دیتابیس ذخیره کنید نه به حالت معمولی، این کار برای امنیت هم بهتره. سرچ کنید: ذخیره سشن در DB
بعدش کوئری بزنید به دیتابیس و چک کنید آیا سشن اون کاربر وجود داره یا نه، اگر وجود نداشت یعنی آفلاینه!
ممنون عزیز من یه جوری باید توی سی شارپ چک کنم که کاربر انلاینه یا نه . یعنی دو تا کاربر دارن با هم بازی میکنن باید به صورت لحظه ای یا مثلا با خطای تغریبا 5 ثانیه متوجه افلاین شدن کاربر بشم
مثلا دقیقا میخام یه متغیری داشته باشم که وقتی کاربر انلاینه 1 و وقتی افلاینه 0 بشه . اینو اگه بشه اجرا کنم راحت میتونم دریافتش کنم و کار مورد نظرمو انجام بدم
واقعا کارم گیره خیلی ممنون میشم راهنمایی کنید :n12:
از مدیران هم خاهش میکنم تایپیکو به بخش مناسب انتقال بدن :n06:
behnamy01
03-05-2015, 18:26
ممنون عزیز من یه جوری باید توی سی شارپ چک کنم که کاربر انلاینه یا نه . یعنی دو تا کاربر دارن با هم بازی میکنن باید به صورت لحظه ای یا مثلا با خطای تغریبا 5 ثانیه متوجه افلاین شدن کاربر بشم
مثلا دقیقا میخام یه متغیری داشته باشم که وقتی کاربر انلاینه 1 و وقتی افلاینه 0 بشه . اینو اگه بشه اجرا کنم راحت میتونم دریافتش کنم و کار مورد نظرمو انجام بدم
واقعا کارم گیره خیلی ممنون میشم راهنمایی کنید :n12:
از مدیران هم خاهش میکنم تایپیکو به بخش مناسب انتقال بدن :n06:
سی شارپ بلد نیستم من، ولی فکر میکنم شما یک بازی آنلاین تحت ویندوز داری میسازی که قسمت سمت سرورش فقط با php هستش و سمت کاربر رو هم که با سی شارپ. خب شما باید هر چند ثانیه وقتی کاربری داره بازی رو انجام میده یک کوئری به دیتابیس سرورت بزنی از سمت سی شارپ، و فیلد زمان آخرین فعالیت کاربر رو اینجوری به روز کنی تا بفهمی کاربر آنلاینه یا نه.
حالا چه سمت سرور چه سمت کاربر، هر وقت لازم داشتی کوئری میزنی و اون زمان آخرین فعالیت کاربر رو میخونی و اگر مثلا 5 ثانیه از زمان آخرین فعالیت اون کاربر گذشته بود یعنی آفلاین هستش.
سناریو کار اینه ولی کد سی شارپش رو بلد نیستم، جستجو کنید حتما به جواب میرسید.
Reza Azimy_RW
03-05-2015, 19:46
ایول داداش دقیقا منظورم همین بود خیلی دارم نزدیک میشم
اونوقت میتونم اونجایی که نام کاربری و پسوورد کاربرا ذخیره میشه یه فیلد اضافه واسه زمان قرار بدم تا چند ثانیه یک بار اپدیت شه بدون اینکه ردیف جدیدی اضافه شه ؟
مثلا یه یوزر و پسوورد اضافه شده الان میخام فقط پسووردشو ویرایش کنم بدون اینکه یه ردیف دیگه اضافه شه . همون قبلی اپدیت شه
منظورم از ردیف ایناس : نمدونم اسمش چیه :دی
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
چون هر یوزر و پسووردی که ذخیره میشه چون فک کنم AUTO_INCREMENT تیکش زده شده توی ردیف جدید ذخیره میشه ولی میخام مثلا پسوورد(یا همون زمان) ویرایش شه و ردیف جدیدی ایجاد نشه(همون ردیف)
ویرایش :
و یه چیز دیگه الان فقط فیلد ID تیک AUTO_INCREMENT ش زده شده چرا وقتی یوزر و پسوورد اینسرت میکنیم ردیف جدید ایجاد میشه ؟ مگه نباید فقط وقتی بخش ای دی رو اینسرت میکنیم ردیف جدید ایجاد شه ؟
واقعا ببخشید اگه اماتور توضیح میدم :n27:
behnamy01
03-05-2015, 20:20
بله شما از همون Phpmyadmin برید به بخش structure و یک فیلد جدید بعد از فیلد پسورد ایجاد کنید به اسم مثلا last_modified که قراره زمان رو توش بذارید.
بعدش هر چند ثانیه از سمت سی شارپ یک کوئری مثل این رو توی دیتابیس سرور میزنید:
"UPDATE `users` SET `last_modified`=2015-05-03 21:16 WHERE username=reza"
توی این کوئری میگید که فیلد last_modified رو برای کاربر رضا عوض کن و اینی که میگم رو بذار، توی سی شارپ دیگه باید یک جوری نام کاربری که بازی رو داره اجرا میکنه بدست بیارید و زمان رو هم بدست بیارید بذارید توی این کوئری.
پ.ن: به ردیف توی sql رکورد میگن.
پ.ن2 : auto increment یعنی به صورت اتوماتیک زیاد بشه، یعنی شما وقتی از دستور insert استفاده میکنید به جای اینکه نام هر سه فیلد id, username, password رو توی کوئریتون استفاده کنید، فقط از username, password استفاده میکنید و وقتی این دستور میخواد اجرا بشه mysql خودش id رو هم پر میکنه و یکی به id قبلی که از قبل موجود بوده اضافه میکنه. معمولا از auto increment به همراه ویژگی primary استفاده میشه که باعث میشه توی دیتابیس شما هر رکورد به عنوان یک داده جداگانه و یکتا از بقیه داده ها شناخته بشه.
Reza Azimy_RW
03-05-2015, 20:28
واقعا ممنون داداش :n12:
مشکلم حل شد دمت گرم امیدوارم بشه جبران کنم :n06:
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.