🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۴ دانشجوی سون‌لرن
دستکاری ID در سمت html توسط کاربر رو بروز مشکل در سمت فرانت
محسن موحد حل شده توسط محسن موحد

سلام و عرض احترام خدمت شما

در فرم‌های html ما یکسری input‌ها داریم که داده هایی مثل ID رو در خودشون دارن و معمولا hidden میکنیم. و در سمت بک اند اون ID رو میگیریم و تغییراتی در دیتابیس برای اون آی دی اعمال می‌کنیم.

اگر کاربر در بخش inspect یه تغییری بده و مقدار ID رو عوض بکنه، مثلا آیدی 1 رو بکنه 2 .... اون موقع اطلاعات آی دی 2 تغییر میکنه، درسته؟

این نمیتونه باعث بروز مشکل بشه؟

ممنون میشم راهنمائیم کنید.

سلام،

شما باید همیشه فرض کنید، داده‌های کاربر ناامن هستند و در سمت بک اند ولیدیشن داشته باشید.

شما باید توی بک‌ اند کنترل دسترسی بکنی (مثلاً چک کنی ID متعلق به کاربره یا نه با get_post و current_user_can)، از Nonce برای اعتبارسنجی درخواست استفاده کنی (wp_nonce_field و wp_verify_nonce)، ورودی‌ها رو تمیز کنی (مثلاً با intval).

ضمنا برای آیدی هم یک شناسه public_id بصورت UUID یا hash بگیر: (مثلا)

$public_id = md5($real_id . 'secret_salt');
<input type="hidden" name="post_uid" value="<?php echo $public_id; ?>">

 

محسن موحد ۳۰ فروردین ۱۴۰۴، ۱۴:۵۱

جناب موحد عزیز دست گلتون درد نکنه، خیلی لطف کردین

 

مقدار md5 شده داده رو چطوری در سمت بک اند به مقدار واقعی تبدیل کنیم؟ چون توی بک اند یه همچین کدی میده به ما :  df6545sd2f8h4512zxd1fawerfd14

سجاد آقایی ۳۰ فروردین ۱۴۰۴، ۱۷:۰۱

سلام مجدد،

md5 یک نوع هشِ یک‌طرفه‌ است و برگشت‌پذیر نیست. اگر بخوایم فقط از هش استفاده کنیم، برای اینکه بتونیم مقدار اصلی رو بازیابی کنیم، مجبوریم یک جایی اون هش رو به مقدار اصلی نگهداری کنیم، مثلاً تو یک جدول جداگونه. اما خب، روش‌‌های خیلی بهتر و امن‌تری هم وجود داره...

 

۱. انکریپشن (رمزنگاری) - روش حرفه‌ای و برگشت‌پذیر:

بهترین جایگزین برای هش کردن، استفاده از رمزنگاری متقارن (Symmetric Encryption) هست. توی این روش، شما با یک کلید، یک داده رو رمزگذاری میکنید و بعد با همون کلید میتونید رمزگشاییش کنید و به حالت اولش برگردونید.

 

۲. استفاده از سشن (Session) - کمتر توصیه میشه برای ID‌های اصلی:

شما میتونید شناسه اصلی رو تو سشن ذخیره کنید و فقط یک شناسه سشن رو تو فرانت‌ اند بفرستید. اما این روش برای مواردی که نیاز به نگهداری شناسه به صورت طولانی‌ مدت توی فرم ندارید مناسبتره. مثلاً برای جلوگیری از CSRF attack از سشن استفاده میشه (Nonce‌ها هم یک نوع سشن هستن). برای ID اصلی که ممکنه کاربر صفحه رو رفرش کنه یا بعداً برگرده، سشن خیلی پایدار نیست.

 

۳. API و Endpoint‌ها - معماری درست و جداسازی فرانت و بک‌اند:

تو معماری‌‌های مدرن وب، معمولاً فرانت‌ اند مستقیماً با دیتابیس کار نمیکنه. فرانت‌ اند (HTML، جاوا اسکریپت) با بک‌ اند (PHP، پایتون، نود و…) از طریق API‌ها ارتباط برقرار میکنه.

مثال ساده:

  • فرانت‌ اند (جاوا اسکریپت): درخواست AJAX به یک API endpoint برای گرفتن اطلاعات یک نوشته:

    fetch('/api/get_post_data?public_id=' + publicId)
        .then(response => response.json())
        .then(data => {
            // نمایش اطلاعات نوشته در صفحه
        });

     

  • بک‌ اند (PHP - WordPress): یک endpoint تعریف میکنید که شناسه عمومی رو بگیره، شناسه اصلی رو پیدا کنه، دسترسی کاربر رو چک کنه و اطلاعات رو برگردونه:

    // endpoint در وردپرس (مثلا تو functions.php یا یک فایل جدا)
    add_action('rest_api_init', function () {
        register_rest_route('my_api', '/get_post_data', [
            'methods' => 'GET',
            'callback' => 'my_get_post_data_callback',
            'permission_callback' => 'my_check_permission' // چک کردن مجوز کاربر برای دسترسی به این API
        ]);
    });
    function my_get_post_data_callback(WP_REST_Request $request) {
        $public_id = sanitize_text_field($request->get_param('public_id'));
        // ... (بازیابی شناسه اصلی از public_id با روش انکریپشن یا Lookup Table که قبلاً گفتیم) ...
        $real_post_id = ...;
        if (!$real_post_id) {
            return new WP_Error('not_found', 'نوشته پیدا نشد.', array('status' => 404));
        }
        // چک کردن دسترسی کاربر (مثال)
        if (!current_user_can('read_post', $real_post_id)) {
            return new WP_Error('rest_forbidden', 'شما مجوز دسترسی به این نوشته را ندارید.', array('status' => 403));
        }
        $post_data = get_post($real_post_id);
        return rest_ensure_response($post_data); // برگردوندن اطلاعات به صورت JSON
    }
    function my_check_permission() {
        // ... (منطق چک کردن مجوز دسترسی کاربر به این API) ...
        return true; // یا false اگر مجوز نداره
    }
بهترین پاسخ
محسن موحد ۳۱ فروردین ۱۴۰۴، ۲۳:۴۲

سلام و عرض احترام

جناب موحد عزیز، در یک کلام دمتون گرم، واقعا لطف کردین

سجاد آقایی ۰۱ اردیبهشت ۱۴۰۴، ۱۲:۲۴