1398/12/19، 09:00 عصر
(1398/12/19، 08:06 عصر)""M.gh نوشته است:(1398/12/19، 12:12 صبح)Master Badfar نوشته است:لازم نبود یک فایل جدا برای اضافه کردن به مقدار امتیاز کاربر در تیبل دیتابیس بسازی و میشه با یک فایل هم سر و تهش رو هم آورد!
پس من با همین منطق کد رو برات نوشتم طوری که با یک فایل بتونی هم نام کاربر صاحب امتیاز رو نشون بدی و هم در صورت نیاز به مقدار امتیازش اضافه کنی و مقدار جدید رو در دیتابیس ذخیره کنی.
طبق گفته های خودت در ابتدای تاپیک من فرض کردم مشخصات دیتابیس همونطوری هست که قبل تر گفتی و همچنین فرض کردم که
مقدار امتیاز کاربر عددی هست.
ممکنه در ادامه به کلمه «آرگومان» برخورد کنی که یعنی همون ورودی...
اما کد به این شرحه:کد php:<?php
/**
* @author Master Badfar
* @copyright 2020
*/
// صدور مجوزها برای مرورگـر
header('Content-Type: text/html; charset=utf-8');
header('Access-Control-Allow-Origin: *');
// و ذخیره آن در متغیر دریافت ورودی امتیاز کاربر
$score= $_GET['score'];
// دریافت میزان مورد نیاز برای اضافه کردن به امتیاز و ذخیره در متغیر
$add = $_GET['add'];
// متغیر نشاندهنده موفقیت آمیز بودن ریکوئست
$valid = 0;
// کانفیگ دیتابیس
$conn = mysqli_connect("localhost", "db-1399", "m.gh","db-1399");
// درصورت بروز خطا
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
// تنظیم دستور اس کیو ال برای دریافت نام کاربر از روی امیتاز ثبت شده در متغیر
$sql = "SELECT `name` FROM `db-1399` WHERE `score` = '$score'";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0 && isset($add)) {
$row = mysqli_fetch_assoc($result);
// نمایش نام کاربر
if (isset($row)){
echo "The name is:" . " " . $row['name'];
// ذخیره نام کاربر در متغیر
$name = $row['name'];
// اضافه کردن به مقدار متغیر موفقیت آمیز بودن ریکوئست (یک عدد)
$valid++;
}
}
// در صورت موجود نبودن امتیاز وارده در دیتابیس
if (!isset($row)){
echo "The entered score is not available in database!";
}
// اگر مقدار مورد نیاز برای اضافه کردن امتیاز در آرگومان وارده توسط کاربر بیشتر از صفر بود و توانستیم در مرحله قبل نام کاربر را دیافت کنیم یا به عبارتی دیگر مقدار متغیر موفقیت یک شد
if ($add > 0 && $valid == 1){
// تعریف متغیر final value و تنظیم مقدار آن با در نظر گرفتن مقدار مورد نظر برای اضافه شدن به امتیاز
$final_value = $score + $add;
// تنظیم دستور مای اس کیو اِل
$sql = "UPDATE db-1399 SET score='$final_value' WHERE name='$name'";
}
if ($conn->query($sql) === TRUE) {
// ایجاد فاصله بین پیغام قبل
echo '</br>';
// نمایش پیغام موفقیت آمیز بودن
echo "The score changed form . " " . $score . " " . "to" . " " . $final_value . " " . "by adding" . " " . $add . " " . "numbers to the first score value." ;
}
// بستن اتصال به دیتابیس
$conn->close();
?>توضیحات راجع به خروجی کـد:
در صورتی که آرگومان امتیاز وارده در دیتابیس وجود نداشت خروجی به این شکله:اگر صرفاً قصد نمایش نام صاحب امتیاز رو داشته باشی خروجی کد به این شکله:کد:The entered score is not available in database!
میتونی توی محیط کانستراکت با استفاده از اکسپرشن سیستم tokenat و با تنظیم پارامترهای seperator روی ":" و index روی 1 مقدار نام رو دریافت کنی. البته میدونم که با این اکسپرشن آشنا هستی.کد:The name is : "name"
اگر علاوه بر نمایش مقدار نام صاحب امتیاز قصد اضافه کردن به امتیاز فعلی رو داشته باشی چنین خروجی رو شاهد خواهی بود:
(فرض کن نام کاربر reza باشه و امتیاز فعلی هم 41 باشه)خط دوم کاملاً مشخصه که به ما میگه مقدار امتیاز کاربر از 41 به 43 تغییر کرد با اضافه شدن دو واحد!کد:The name is: reza
The score changed form 41 to 43 by adding 2 numbers to the first score value.
توضیحات راجع به فرمت آدرس ریکوئست:
در حالتی که قصد داری هیچ چیز به مقدار امتیاز اضافه نکنی و صرفاً قصد نمایش نام رو داری فرمت آدرس ریکوئست رو به این شکل وارد کن:به جای مقدار ایکس توی آدرس مقدار امتیاز موردنظر رو وارد کن. حالا اگر قصد داشتی به مقدار امتیاز چیزی اضافه کنی و تغییر رو توی دیتابیس ثبت کنی فرمت آدرس ریکوئست رو به این شکل وارد کن:کد:http://yourhost.com/file.php?score=x&add=0
اینجا x همون مقدار امتیاز مورد نظر هست و y هم مقداری هست که قصد داری به امتیاز کنونی کاربر اضافه کنی...کد:http://yourhost.com/file.php?score=x&add=y
یه نکته راجع به این قسمت هست و اونم اینه که تو اگر مقدار پارامتر add رو از صفر بیشتر وارد کنی یعنی مثلاً بزنی 0.5 کد اجرا میشه قسمت دومش و به مقدار متغیر کاربر 0.5 تا اضافه میکنه اما توی دیتابیس چون نوع داده رو روی int تنظیم کردی رکوردی که نمایش داده میشه اعشاری نیست و گرد میشه به بالا.
پ.ن: توصیه میکنم از متد get استفاده نکن چون از تاخت و تاز هکرها در امان نیستی! پس بهتره از متد post استفاده کنی که البته لازمه یک تغییر هم در فرمت آدرس ریکوئست ها و هم در متغیرهای گلوبال کد php بدی. در کل متد get برای تبادل داده های نه چندان حیاتی مناسبه و اینکه کجا از متد get بهتره استفاده بشه و یا متد post رو دیگه باید
خودت تشخیص بدی!
سعی کردم کدی که نوشتم رو کامنت گذاری کنم تا فهمش برات بهتر بشه.
موفق باشی![]()
(1398/12/19، 02:59 عصر)Master Badfar نوشته است:(1398/12/18، 08:57 عصر)""M.gh نوشته است: سلام
یک سوال کوچولو ی دیگه داشتم ، مثلا دیتابیس ما به این شکل :
name score
1330 mahdi
بعد الان سوال من اینه که مثلا ما به یک فایل php به نام add داریم که وقتی به اون ایجوری پست می کنیم :
https//:rezamms.ir/add.php?add=4&name=mahdi
بعد تو نیم mahdi و تو add عددی که میخوایم به 1330 اضافه بشه که بشه 1334 .
حالا من از شما میخوام بی زحمت فایل php اش رو بدین
در ضمن اینکه اومدی رکوردها رو همینطوری به صورت plaintext در داخل دیتابیس ذخیره کردی از نظر امنیتی درست نیست چرا که اگر هکر بتونه به دیتابیس تو نفوذ کنه همه چی براش هلو تو گلویه!
پس لازمه از متدهای رمزنگاری استفاده کنی حالا یا در سمت کانستراکت یا در سمت php...
میتونی از یک متد ساده ولی نسبتاً مناسب توی php به نام openssl استفاده کنی. کدش این شکلی میشه:
(بد نیست بدونی این روش همون رمزنگاری با AES-128 هست!)خُب همینطور که میبینی میتونی کلیدرمزنگاری رو هر چی که خواستی قرار بدی و هر چی طولانی تر باشه بهتر. من یک عبارت تصادفی رو جنریت کردم و به عنوان کلید رمزنگاری قرار دادم که غیرقابل حدس باشه و هکر برای دستیابی به اون هم با حملاتی مثل بروت فورس و یا وردلیست نتیجه شاخصی نگیره.کد php:<?php
// تنظیم پارامترهای متد رمزنگاری openssl
$ciphering = "AES-128-CTR";
$iv_length = openssl_cipher_iv_length($ciphering);
$options = 0;
//تنظیم پارامتر iv
$encryption_iv = '1234567891011121';
// تنظیم کلید رمزنگاری
$encryption_key = 'U^9k~aQT%hWS<g)#x)2@mc7Yfn~bjmGdUKpAcy[QM^)=^6NC+CPb}/9>HEZ;fSA%Dwy>u!pq<=+)IGi[P;*(AbeZPzQ=pcKwaCb9#U![}fQYX)ul3n>N)!,8UscPD@;q';
// رمزنگاری عبارت دلخواه
$encrypted_string = openssl_encrypt($_GET['string'], $ciphering,
$encryption_key, $options, $encryption_iv);
echo $encrypted_string;
?>
در کدی که بالا نوشتم برای اینکه عبارت یا رشته موردنظرت رو به این روش رمز کنی کافیه یک ریکوئست با این فرمت ارسال کنی:به جای عبارت x میتونی هر چیزی که دلت خواست قرار بدی تا رمز بشهکد:http://yourhost.com/file.php?string=x
اما خوبی این متد رمزنگاری اینه که قادر به رمزگشایی هم هستیم و مثل الگوریتم درهم سازی یا هش کردن پروسه یک طرفه نیست(البته میشه عبارات متداول رو De-Hash کرد در ضمن بعضی از متدهای هش کردن مثل md5 هم این روزا دیگه ایمن شناخته نمیشن)
کد رمزگشایی به این شکله:با ارسال چنین ریکوئستی و قرار دادن عبارت رمز شده ای که در مرحله رمزنگاری دریافت کردی به جای x میتونی عبارت موردنظر رو رمزگشایی کنی:کد php:<?php
// تنظیم پارامترهای متد رمزنگاری openssl
$ciphering = "AES-128-CTR";
$iv_length = openssl_cipher_iv_length($ciphering);
$options = 0;
//تنظیم پارامتر iv
$decryption_iv = '1234567891011121';
// تنظیم کلید رمزگشایی
$decryption_key = 'U^9k~aQT%hWS<g)#x)2@mc7Yfn~bjmGdUKpAcy[QM^)=^6NC+CPb}/9>HEZ;fSA%Dwy>u!pq<=+)IGi[P;*(AbeZPzQ=pcKwaCb9#U![}fQYX)ul3n>N)!,8UscPD@;q';
// رمزگشایی عبارت دلخواه
$decrypted_string = openssl_decrypt ($_GET['string'], $ciphering,
$decryption_key, $options, $decryption_iv);
// نمایش عبارت رمزگشایی شده
echo $decrypted_string;
?>فقط باید حواست باشه که برای رمزنگاری و رمزگشایی از یک کلید یکسان استفاده میشه توی این متد پس همین باعث میشه زیاد ایمن نباشه چون کلید عمومی و خصوصی در کار نیست و رمزنگاری متقارن محسوب میشه ولی در حد پروژه های معمول متد بدی نیست.کد:http://yourhost.com/file.php?string=x
علاوه بر اون کدی که من نوشتم و کدی که دوستان زحمت کشیدن دادن در برابر حمله ای مثل SQL Injection ایمن نیست چرا که اگر کاربر کاراکترهای غیرمجازی رو که به عنوان کوئری MySQL تلقی بشه وارد کنه خیلی راحت میتونه کوئری های دلخواه خودش رو اعمال کنه. پس لازمه کاراکترهای ورودی رو روشون کنترل داشته باشی که یک وقت علائم غیر مجاز نداشته باشه حالا یا در سمت کانستراکت یا در سمت php که بهترین کار تنظیم در سمت php هست.
ممنون عالی بود . فقط در مورد پست اولی میشه به جای وارد کردن score نیم رو وارد کنیم و score اون نیم ای که وارد کردیم بهش add کنیم؟؟
از آقا رضا هم بسیار ممنونم
بله چرا نشه ولی باید کد ادیت بشه یه مقداری