| AmirHossein | – Telegram
| AmirHossein |
591 subscribers
44 photos
8 videos
2 files
73 links
نوشته‌های یک برنامه‌نویس ناشی

🫂 @StartUnity
Download Telegram
#security #bug
دسته بندی Cross-Site Attacks

باگ Server-Side Request Forgery (SSRF) یک نوع باگ امنیتی است که در برنامه‌ها و سیستم‌ها رخ می‌دهد. در این نوع حمله، حمله‌کننده با اجازه یا بدون اجازه کاربر، سیستم به سرورها و منابع دیگری دسترسی پیدا می‌کند که نباید به آن‌ها دسترسی داشته باشد. این کار می‌تواند منجر به دسترسی به منابع داخلی و محرمانه شبکه، حمله به سیستم‌های داخلی، و یا حتی دسترسی به سرویس‌های خارجی و ایجاد هزینه‌های ناخواسته برای صاحب سرویس شود.

مثال:

فرض کنید یک برنامه وب دارای ویژگی‌هایی است که اجازه می‌دهد که عکس‌ها از یک آدرس URL را در صفحه نمایش دهد. کد PHP به صورت زیر است:
<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$url = $_POST['url'];
$image_data = file_get_contents($url);
// proccess and show images
header('Content-Type: image/jpeg');
echo $image_data;
}
?>
<!DOCTYPE html>
<html>
<head>
<noscript>Image</noscript>
</head>
<body>
<h1>Image</h1>
<form action="" method="post">
<label for="url">Image URL:</label>
<input type="text" name="url" id="url">
<input type="submit" value="View Image">
</form>
</body>
</html>

حمله‌کننده می‌تواند یک آدرس URL مخرب (مثلاً یک سرور داخلی یا آدرس آی‌پی دیگری در شبکه داخلی) را وارد کند تا به منابع داخلی سیستم یا شبکه دسترسی پیدا کند. به عنوان مثال:
http://localhost/internal/resource

این باعث می‌شود که سیستم درخواست به URL داخلی ارسال کند و احتمالاً دسترسی به منابع داخلی را فراهم کند.

روش های جلوگیری:

1- اجازه دسترسی به منابع و سرویس‌های خارجی را تنها به دامنه‌ها و آدرس‌های معتبر محدود کنید.

2- برنامه‌ها باید درخواست‌های خود را با آدرس‌های ثابت و معتبر ارسال کنند و نباید آدرس‌ها را از ورودی کاربران استخراج کنند.

3- اطمینان حاصل کنید که ورودی‌های کاربران به طور دقیق اعتبارسنجی و فیلترسازی شده‌اند و حاوی آدرس‌های معتبر هستند.

4- تنها اجازه دسترسی به منابع مجاز را با استفاده از Whitelist بدهید.

5- اطمینان حاصل کنید که کاربران فقط به منابعی دسترسی دارند که نیاز دارند و به منابع داخلی و محرمانه دسترسی ندارند.

.
#security #bug
دسته بندی Cross-Site Attacks

باگ Clickjacking یا همچنین شناخته شده به عنوان UI Redressing، یک نوع حمله امنیتی است که در آن حمله‌کننده با استفاده از انگشت‌آوری و برتری لایه‌ی کاربری (UI)، کاربران را به انجام عملیات‌هایی که می‌خواهند، نادیده می‌گیرد و آن‌ها را به انجام عملیات‌های خطرناک یا ناخواسته می‌اندازد. این حمله با استفاده از طرح‌بندی صفحات وب یا نشان‌دهنده‌های قابل مشاهده، کاربر را به کلیک بر روی عنصری که اصلاً نمی‌خواهند ترغیب می‌کند.

مثال:

فرض کنید یک سایت بانکی وجود دارد که یک فرم احراز هویت دارد و کاربران باید نام کاربری و رمزعبور خود را وارد کنند. صفحه‌ای با نام "به‌روزرسانی امنیتی" در سایت وجود دارد که از کاربران خواسته می‌شود بر روی دکمه‌ی "تأیید" کلیک کنند تا احراز هویت را کامل کنند.

<!DOCTYPE html>
<html>
<head>
<noscript>Secure Bank</noscript>
</head>
<body>
<h1>Welcome to Secure Bank</h1>
<form action="/login" method="post">
<label for="username">Username:</label>
<input type="text" name="username" id="username">
<br>
<label for="password">Password:</label>
<input type="password" name="password" id="password">
<br>
<input type="submit" value="Login">
</form>
<iframe src="http://evil-website.com/clickjack"></iframe>
</body>
</html>

حمله‌کننده می‌تواند یک صفحه‌ی وب ایجاد کند (مثلاً با نام clickjack.html) که با استفاده از CSS و مخفی کردن عنصر‌ها، طرح‌بندی متفاوتی از صفحه‌ی Secure Bank را ایجاد کند:

<!DOCTYPE html>
<html>
<head>
<noscript>Evil Website</noscript>
<style>
iframe {
opacity: 0;
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
#fake-button {
position: absolute;
top: 300px;
left: 450px;
background-color: transparent;
border: none;
font-size: 18px;
color: transparent;
}
</style>
</head>
<body>
<h1>Welcome to Evil Website</h1>
<form action="http://secure-bank.com/login" method="post">
<label for="username">Username:</label>
<input type="text" name="username" id="username">
<br>
<label for="password">Password:</label>
<input type="password" name="password" id="password">
<br>
<button id="fake-button" onclick="document.getElementById('real-button').click()">Click Here</button>
<input type="submit" id="real-button" style="display:none;">
</form>
</body>
</html>

وقتی کاربر به صفحه Secure Bank مراجعه می‌کند، حمله‌کننده این دو صفحه (Secure Bank و Evil Website) را در یک iframe قرار می‌دهد و کاربر اصلاً آگاه نیست که عملیات احراز هویت را انجام می‌دهد. به عبارت دیگر، حمله‌کننده با نمایش دکمه‌ای در صفحه Evil Website که به نظر می‌رسد از سایت Secure Bank است، کاربر را به تایید عملیات احراز هویت ترغیب می‌کند. در واقعیت، کلیک بر روی دکمه‌ی مخفی (fake-button)، عملیات کلیک بر روی دکمه‌ی واقعی (real-button) در صفحه Secure Bank را اجرا می‌کند و حمله‌کننده به اطلاعات احراز هویت کاربر دسترسی پیدا می‌کند.

روش های جلوگیری:

1- تنظیم سیاست امنیتی "X-Frame-Options" در سرور وب که مشخص می‌کند آیا اجازه‌ی نمایش صفحه در یک iframe به صورت دیگری مجاز است یا خیر.
X-Frame-Options: DENY
OR
X-Frame-Options: SAMEORIGIN


2- تنظیم سیاست امنیتی "Content Security Policy" که محدودیت‌هایی برای اجازه‌ی اجرای اسکریپت‌ها و فرم‌ها در صفحه‌ها تعیین می‌کند.
Content-Security-Policy: frame-ancestors 'self';

3- اسکریپت‌های جاوا اسکریپت که با شناسایی Clickjacking تلاش می‌کنند iframe‌ ها را نمایش ندهند یا صفحه‌ای را در پنجره‌ی کامل باز کنند.
<noscript>
if (window.self !== window.top) {
window.top.location = window.self.location;
}
</noscript>

4- برخی مرورگرها از فناوری‌های جدید مانند "Frame Ancestors" در CSP یا "Content-Security-Policy-Report-Only" برای گزارش‌دهی تنظیمات امنیتی پشتیبانی می‌کنند که می‌توانند کمک کنند به تشخیص و جلوگیری از Clickjacking.

.
#security #bug
دسته بندی Authentication and Session Management
Vulnerabilities

باگ Broken Authentication and Session Management یک نوع باگ امنیتی است که زمانی رخ می‌دهد که مکانیزم‌های احراز هویت و مدیریت نشست‌ها در برنامه‌ها و وب‌سایت‌ها به درستی پیاده‌سازی نشده‌اند. این باگ باعث می‌شود که حمله‌کننده بتواند بدون نیاز به نام کاربری و رمزعبور یا با بهره‌گیری از آسیب‌پذیری‌های موجود در احراز هویت و نشست‌ها، به حساب‌ها و محتواهای کاربران دسترسی پیدا کند.

مثال:

فرض کنید یک وب‌سایت دارای سیستم احراز هویت است که کاربران باید با نام کاربری و رمزعبور وارد شوند. برنامه به طور نادرستی رمزعبور‌ها را به صورت رمزنگاری‌نشده در دیتابیس ذخیره می‌کند.

همچنین، وب‌سایت از یک مکانیزم نشست‌ها برای نگه‌داری حالت ورود کاربران استفاده می‌کند و توکن‌های نشست را در کوکی‌های قابل خواندن ارسال می‌کند.

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = $_POST['username'];
$password = $_POST['password'];

$hashed_password = md5($password);

// Authenticate user with username and password
}

session_start();
if (isset($_SESSION['user_id'])) {
// The user is logged in and has access to the content
}

حمله‌کننده می‌تواند با استفاده از آسیب‌پذیری‌های احراز هویت و مدیریت نشست‌ها، به صورت زیر بدون نیاز به نام کاربری و رمزعبور به حساب کاربری دسترسی پیدا کند:

1- حمله‌کننده می‌تواند مستقیماً رمزعبور‌های رمزنگاری‌نشده را از دیتابیس یا فایل‌ها به دست بیاورد و به حساب‌های کاربری دسترسی پیدا کند.

2- حمله‌کننده می‌تواند یک شناسه نشست را به کاربر تزریق کند و درخواست اجرای نشست فرضی کند، یا برعکس از نشست فرضی که خود ایجاد کرده استفاده کند.

روش های جلوگیری:

1- رمزعبور‌ها را با الگوریتم‌های رمزنگاری قوی (مانند bcrypt یا Argon2) رمزنگاری کنید.

2- از کتاب‌خانه‌ها و مکانیزم‌های احراز هویت آماده استفاده کنید تا خطاهای احتمالی در احراز هویت کاربران حداقل شود.

3- اطمینان حاصل کنید که ورودی‌های کاربران به طور دقیق اعتبارسنجی و فیلترسازی شده‌اند تا از تزریق‌ها و حملات احتمالی جلوگیری شود.

4- به جای استفاده از توکن‌های نشست قابل خواندن از توکن‌های امنیتی استفاده کنید که مقدار آن‌ها به صورت اتصالی و غیرقابل پیش‌بینی تولید شود.

5- همواره برنامه‌ها و کتاب‌خانه‌ها را به‌روزرسانی کنید تا آسیب‌پذیری‌های احتمالی در احراز هویت و مدیریت نشست‌ها برطرف شود.

.
#security #bug
دسته بندی
Authentication and Session Management Vulnerabilities

باگ Insecure Deserialization یک نوع باگ امنیتی است که در آن داده‌های سریالایز شده به صورت ناامن به شئ ها یا داده‌های قابل استفاده تبدیل می‌شوند. این باگ معمولاً زمانی رخ می‌دهد که برنامه‌ها از ساختار‌های مانند JSON، XML، یا دیگر فرمت‌های سریالایز شده شده برای انتقال و ذخیره‌سازی داده‌ها استفاده می‌کنند و نقاط ضعفی در تجزیه و تحلیل این داده‌ها دارند.

مثال:

فرض کنید یک وب‌سایت فروشگاهی از ساختار JSON برای ذخیره و نمایش محصولات استفاده می‌کند. در این صورت می‌تواند از یک متد ساده برای تجزیه و تحلیل داده‌های JSON و نمایش محصولات استفاده کند.

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$data = $_POST['data'];
$decoded_data = json_decode($data);

foreach ($decoded_data['products'] as $product) {
echo 'Product Name : ' . $product['name'] . '<br>';
echo 'Price: ' . $product['price'] . '<br>';
echo '----------------------<br>';
}
}

حمله‌کننده می‌تواند با تغییر داده‌های JSON و اضافه کردن فیلدهای جدید، داده‌های تقلبی (مثل تغییر قیمت یک محصول به مقدار منفی) ارسال کند:

{"products": [{"name": "LapTop", "price": 15000000}, {"name": "Mobile", "price": -5000000}]}

وقتی برنامه‌ این داده‌ها را تجزیه و تحلیل می‌کند و به شئ تبدیل می‌کند، مقدار منفی قیمت گوشی را نیز نمایش می‌دهد که باعث ایجاد اطلاعات تقلبی یا اشکال در سیستم می‌شود.

روش های جلوگیری:

1- از زبان‌های محدود و امکانات نیمه‌ای استفاده کنید تا دسترسی حساس به سیستم را محدود کنید.

2- داده‌های ارسالی از سمت کاربر را اعتبارسنجی کنید و تنها داده‌های معتبر و مجاز را تجزیه و تحلیل کنید.

3- از کتاب‌خانه‌ها و ابزارهای امنیتی مخصوص تجزیه و تحلیل داده‌ها استفاده کنید.

4- از ساختار‌های سریالایزینگ محدود و امن استفاده کنید که دسترسی به محتوای حساس را محدود کند.

5- مطمئن شوید که سطح دسترسی کاربران و نقش‌های مختلف محدود شده‌اند و به کاربران فقط دسترسی‌های لازم را اعطا کنید.

.
#security #bug
دسته بندی Access Control and Data Exposure

باگ Insecure Direct Object References (IDOR) یک نوع باگ امنیتی است که زمانی رخ می‌دهد که یک برنامه‌ی وب (یا نرم‌افزار دیگر) به شئ ها یا منابع مستقیما با استفاده از مقادیر قابل تغییر توسط کاربر ارجاع داده می‌شود. این ارجاع‌ها می‌توانند به داده‌ها یا منابع حساس در سیستم دسترسی پیدا کنند که قرار است توسط کاربران دیگر قابل دسترسی نباشند.

مثال:

فرض کنید یک وب‌سایت فروشگاهی به کاربران اجازه می‌دهد که به فاکتورهای خرید خود دسترسی پیدا کنند و آن‌ها را مشاهده کنند. فاکتورها با استفاده از یک شناسه یکتا (مثل شماره فاکتور) شناسایی می‌شوند و کاربران با ارسال این شناسه‌ها می‌توانند فاکتورهای خود را مشاهده کنند.

$invoice_id = $_GET['invoice_id'];

حمله‌کننده می‌تواند با تغییر شناسه فاکتور در URL، به فاکتورهای دیگر که مربوط به او نیستند، دسترسی پیدا کند:
https://example.com/view_invoice.php?invoice_id=123456
و با تغییر شناسه به شکل زیر:
https://example.com/view_invoice.php?invoice_id=987654

به فاکتورهای دیگری دسترسی پیدا کند که ممکن است مربوط به کاربران دیگری باشند و اطلاعات حساس را نمایش دهد.

روش های جلوگیری:

1- اطمینان حاصل کنید که نشانه‌ها یا شناسه‌ها برای دسترسی به منابع موثق هستند و به صورت تصادفی و قابل حدس نیستند.

2- قبل از ارجاع به یک منبع یا شئ، اعتبارسنجی دسترسی کاربر به منبع را انجام دهید و مطمئن شوید که کاربر مجاز به دسترسی به آن منبع است.

3- از مقادیری برای شناسایی منابع استفاده کنید که غیرقابل پیش‌بینی باشند و نتوان از تغییر یا حدس آن‌ها به منابع حساس دسترسی پیدا کرد.

4- تعیین سطح دسترسی به منابع مختلف بر اساس نقش‌ها و مجوزها و محدود کردن دسترسی‌ها به منابع بر اساس آن‌ها.

5- با استفاده از مکانیزم‌های توسعه‌یافته تحت عنوان
RBAC (Role-Based Access Control) یا ABAC (Attribute-Based Access Control)
می‌توانید سطح دسترسی‌ها را بهبود دهید.

.
💔1
#security #bug
دسته بندی Access Control and Data Exposure

باگ Security Misconfiguration زمانی رخ میدهد که تنظیمات نادرست یا ناکافی در برنامه‌ها یا سیستم‌ها پیکربندی می‌شوند. این باگ امنیتی می‌تواند باعث افشای اطلاعات حساس، آسیب به سیستم، دسترسی ناکافی یا دیگر آسیب‌های امنیتی شود.

مثال:

فرض کنید یک وب‌سایت اطلاعات مشتریان را در دیتابیس ذخیره می‌کند و برای مدیریت این اطلاعات از یک پنل مدیریتی استفاده می‌کند. پنل مدیریتی باید تنها برای کاربران مخصوصی قابل دسترسی باشد. اما به دلیل تنظیمات نادرست، پنل مدیریتی برای همه در دسترس قرار گرفته است.

session_start();

if (!isset($_SESSION['isAdmin']) || $_SESSION['isAdmin'] !== true) {
header("Location: /login.php");
exit;
}

حمله‌کننده می‌تواند به سادگی با دسترسی به فایل admin_panel.php از طریق URL به پنل مدیریتی دسترسی پیدا کند حتی اگر از قبل وارد شده نباشد:
https://example.com/admin_panel.php

این امر باعث می‌شود حتی کاربرانی که دسترسی به پنل مدیریتی ندارند، اطلاعات مشتریان و دیگر اطلاعات حساس را مشاهده کنند.

روش‌های جلوگیری:

1- از توصیه‌ها و اصول بهینه‌سازی امنیتی برای پیکربندی سیستم و برنامه‌ها استفاده کنید.

2- مطمئن شوید که اطلاعات حساس مانند رمزها، کلیدها و اطلاعات مشتریان به درستی محافظت می‌شوند و به عنوان متغیر محیطی یا فایل‌های تنظیمات به‌روزرسانی نمی‌شوند.

3- دسترسی به منابع حساس را محدود کنید و از مکانیزم‌های احراز هویت و اجازه‌های دسترسی استفاده کنید.

4- تنظیمات پیش‌فرض و مثال‌های غیرامن را از برنامه‌ها و سیستم‌ها حذف کنید تا از امکانات خطرناک استفاده نشود.

5- تیم توسعه‌دهنده‌ها و مدیران سیستم را در مورد تنظیمات امنیتی آموزش دهید و از توصیه‌های امنیتی به‌روزرسانی نمایند.
.
1
#security #bug
دسته بندی Access Control and Data Exposure

باگ File Inclusion Vulnerabilities به معنای آسیب‌پذیری‌های مرتبط با اضافه کردن فایل‌ها به یک برنامه یا سیستم است. دو نوع رایج از این آسیب‌پذیری‌ها عبارتند از:

1- Local File Inclusion (LFI):
در این حمله، حمله‌کننده سعی می‌کند فایل‌های محلی از روی سرور را به برنامه اضافه کند.
2- Remote File Inclusion (RFI):
در این حمله، حمله‌کننده به برنامه اجازه می‌دهد فایل‌های از راه دور (از سرور‌های دیگر) را به برنامه اضافه کند.

مثال:

فرض کنید یک وب‌سایت دارای صفحه‌ای با پارامتر مانند "page" است که فایل‌های HTML مختلف را به عنوان صفحه نمایش می‌دهد. بدون احراز هویت صحیح، کاربر می‌تواند از هر فایل HTML از روی سرور استفاده کند.
$page = $_GET['page'];
include($page . '.html');

حمله‌کننده می‌تواند با تنظیم پارامتر "page" به یک مسیر محلی یا فایل مخرب، به فایل‌های محلی یا خارجی دسترسی پیدا کند:
https://example.com/index.php?page=../../etc/passwd

با این دستور، حمله‌کننده می‌تواند به فایل /etc/passwd دسترسی پیدا کرده و اطلاعات مهمی از سرور را به دست آورد.

روش‌های جلوگیری:

1- همواره ورودی‌های ارسالی از کاربر را تأیید کنید و محدودیت‌های معتبری برای آن‌ها تعریف کنید.

2- بهتر است از مسیرهای ثابت برای فایل‌های مورد استفاده استفاده کنید تا از حملات LFI جلوگیری شود.

3- تنظیمات دسترسی را در سیستم بهینه کنید تا کاربران توانایی دسترسی به فایل‌های حساس را نداشته باشند.

4- فایل‌ها را تنها به کاربرانی که دارای دسترسی معتبر هستند نمایش دهید.

.
👍1
#security #bug
دسته بندی Access Control and Data Exposure

باگ Cross-Origin Resource Sharing (CORS) Misconfiguration یک آسیب‌پذیری مرتبط با تنظیمات امنیتی در برنامه‌های وب است که می‌تواند منجر به دسترسی غیر مجاز به منابع مختلف (مثل فایل‌های جاوا اسکریپت یا داده‌های API) در دامنه‌های دیگر شود. این امر ممکن است باعث حملات امنیتی نظیر Cross-Site Request Forgery (CSRF) و دسترسی غیرمجاز از طریق Cross-Site Scripting (XSS) شود.

مثال:

فرض کنید شما یک وب‌سایت با دامنه‌ی example.com دارید که از یک API با دامنه‌ی api.example.org برای دریافت داده‌ها استفاده می‌کند. برای اجازه دسترسی به API، باید تنظیمات CORS در سرور API به درستی تنظیم شده باشد. اما اگر این تنظیمات نادرست باشد، حمله‌کننده می‌تواند از جاوااسکریپت نادرست در وب‌سایت‌های مخرب استفاده کند تا اطلاعات محرمانه‌ی دیگر کاربران یا حتی دسترسی به حساب کاربری آن‌ها را به دست آورد.

// attacker-site.com - Attacking site
<noscript>
fetch('https://api.example.org/user_data', {
method: 'GET',
headers: {
'Origin': 'https://attacker-site.com'
}
})
.then(response => response.json())
.then(data => {
// Performing malicious operations with received data
})
.catch(error => {
// Error handling
});
</noscript>

اگر سرور API به‌طور نادرست تنظیمات CORS خود را تنظیم کند و همه‌ی منابع به صورت دسترسی‌پذیر (wildcard) مجاز شوند (مثل Access-Control-Allow-Origin: *)، کد مخرب اجازه دسترسی به داده‌های کاربران از دامنه‌ی مخرب خود را دریافت می‌کند.

روش‌های جلوگیری :

1- سرور API را به‌طور دقیق تنظیم کنید تا تنها به دامنه‌های مجاز به دسترسی دسترسی داشته باشد.
Access-Control-Allow-Origin: https://example.com

2- به جای استفاده از '*' (همه) در هدر Access-Control-Allow-Origin، از دامنه‌های مجاز به دسترسی خودتان استفاده کنید.
Access-Control-Allow-Origin: https://example.com

3- فقط به دامنه‌های مجاز دسترسی دهید و دامنه‌های غیرمجاز را محدود کنید.
Access-Control-Allow-Origin: https://example.com, https://trusted-domain.com

4- تنظیمات CORS را دوره‌ای بررسی کنید و اطمینان حاصل کنید که تنظیمات درستی دارید و منابع مجاز به دسترسی به API شما دسترسی دارند.

.
👍1
#security #bug
دسته بندی Access Control and Data Exposure

Insufficient Transport Layer Protection (Insecure SSL/TLS) 
به مشکلات امنیتی مرتبط با تضعیف یا نادرست از پروتکل‌های امنیتی SSL/TLS در ارتباطات اینترنتی اشاره دارد. استفاده نادرست از SSL/TLS می‌تواند منجر به دسترسی غیرمجاز به اطلاعات حساس کاربران، حملات "Man-in-the-Middle" و دیگر ریسک‌های امنیتی شود.

مثال:

یک وب‌سایت حاوی صفحه‌ای برای ورود کاربران به حساب کاربری است. این صفحه از ارتباط امن با استفاده از HTTPS استفاده می‌کند. اما تنظیمات نادرست SSL/TLS باعث شده تا اطلاعات ارسالی بین مرورگر کاربر و سرور به خوبی رمزگذاری نشود، به صورت دسته به مهاجم فاش شود.

در این حالت، حمله‌کننده می‌تواند با تجزیه و تحلیل ترافیک شبکه یا بهره‌برداری از نقاط ضعف پروتکل SSL/TLS، اطلاعات کاربران ارسالی به فرم ورود را بخواند و به دست آورد.

روش‌های جلوگیری:

1- از پروتکل HTTPS (SSL/TLS) برای ارتباطات حساس استفاده کنید تا اطلاعات بین مرورگر و سرور به‌خوبی رمزگذاری شود.

2- تنظیمات SSL/TLS سرور خود را به‌روز کنید و مطمئن شوید که از مشکلات معروف امنیتی مثل آسیب‌پذیری‌های ناشی از Cipher Suite ضعیف جلوگیری شده است.

3- معتبر بودن گواهی‌نامه SSL/TLS سرور را تأیید کنید تا از حملات "Man-in-the-Middle" جلوگیری شود.

4- تنظیمات سرور را طوری تنظیم کنید که از پروتکل‌های SSL و TLS ضعیف‌تر پشتیبانی نکند و از پروتکل‌های به‌روز و امن‌تر استفاده کند.

.
#security #bug
دسته بندی Remote Code Execution (RCE)

باگ Remote Code Execution (RCE) یکی از خطرناک‌ترین باگ‌های امنیتی است که به حمله‌کننده اجازه می‌دهد کد مخرب یا دستورات خود را بر روی سرور یا برنامه‌ای اجرا کند. این باگ می‌تواند به دسترسی نامحدود به سیستم یا دسترسی به اطلاعات حساس منجر شود.

مثال:

فرض کنید یک وب‌سایت با یک فرم جستجو دارید که کاربران می‌توانند در آن عبارت مورد نظر خود را وارد کنند. این عبارات سپس به‌عنوان پارامترها به یک برنامه‌ی سمت سرور ارسال می‌شوند. اگر تأمین اطلاعات ورودی کافی نباشد و بدون اعتبارسنجی و فیلترینگ، ورودی‌ها به عنوان کد اجرایی در نظر گرفته شوند، حمله‌کننده می‌تواند کد مخرب خود را در ورودی وارد کند و با اجرای آن، کنترل کامل بر سرور را به دست آورد.

$query = $_GET['query']; 
$result = exec("grep " . $query . " data.txt");
echo "نتایج جستجو: " . $result;

حالت بدیهی این است که اگر حمله‌کننده ورودی‌هایی مخرب مانند "data.txt; rm -rf /" وارد کند، دستورات خطرناک مانند حذف همه‌ی فایل‌ها روی سرور اجرا خواهند شد.

روش‌های جلوگیری:

1- هرگز ورودی‌ها را به‌صورت مستقیم به عنوان کد اجرایی در نظر نگیرید. اطمینان حاصل کنید که ورودی‌ها مورد اعتبارسنجی و فیلترینگ قرار گیرند.

2- از توابع و روش‌های امن در اجرای دستورات استفاده کنید. به عنوان مثال، اگر از PHP استفاده می‌کنید، از توابع مانند escapeshellcmd() یا escapeshellarg() برای اجرای دستورات استفاده کنید.

2- بخش‌های مختلف کد خود را از یکدیگر تفکیک کنید و اجازه ندهید ورودی‌های کاربری به عنوان بخش‌های اجرایی تلقی شوند.

3- از مکانیزم‌های اجرایی امن و محدود بهره ببرید. به‌عنوان مثال، به جای استفاده از exec() در PHP، از توابع دیگری مانند shell_exec() استفاده کنید.

————-
از دیگر باگ های امنیتی این دسته بندی میتوان به Code Injection اشاره کرد که قبلا توضیح داده شده. (مشاهده)
.
#security #bug
دسته بندی Denial of Service (DoS) Attacks

این پست رو باگ نمیشه گفت یه نوع حمله هست ولی خب باید توضیح داد
حملات Denial of Service (DoS) و Distributed Denial of Service (DDoS) حملاتی هستند که هدف آن‌ها قطع یا اختلال در دسترسی به یک سرویس یا منبع خاص است. در حملات DoS، یک حمله‌کننده ترافیک زیادی به یک سرویس ارسال می‌کند تا سرویس موردنظر را به‌طور موقت یا کامل غیرفعال کند. در حملات DDoS، از یک شبکه‌ی بزرگ از دستگاه‌ها (به عنوان مثال بدافزارها) برای ارسال ترافیک مخرب به هدف استفاده می‌شود.

مثال:

فرض کنید یک وب‌سایت دارید که قابلیت پرداخت آنلاین دارد. حمله‌کننده در یک حمله DoS با استفاده از بیشترین تعداد درخواست‌های پرداخت ممکن، ترافیک زیادی به سرور ارسال می‌کند. به علت این ترافیک زیاد، سرور ممکن است قادر به پردازش تمام درخواست‌ها نباشد و دسترسی کاربران به سرویس پرداخت ممکن است به‌طور موقت قطع شود.

روش‌های جلوگیری :

1- محدودیت‌های ترافیکی را تنظیم کنید تا درخواست‌های مخرب را مهار کنید. به‌عنوان مثال، ایجاد محدودیت‌های دسترسی برای هر IP یا نرخ ترافیک.

2- سیستم‌هایی مانند Intrusion Detection Systems (IDS) یا Intrusion Prevention Systems (IPS) را برای تشخیص و جلوگیری از ترافیک مخرب استفاده کنید.

3- از مکانیزم‌های (Load Balancing) برای توزیع درخواست‌ها به صورت متوازن بین سرورهای مختلف استفاده کنید.

4- از شبکه‌های توزیع محتوا (CDN) استفاده کنید تا ترافیک از جاهای مختلف توزیع شود و باعث کاهش اثر حملات DDoS شود.

5- شبکه‌های خود را به‌طور مناسب طراحی کنید تا حملات DDoS به‌طور کلی تشخیص داده شده و متوقف شوند.

6- ترافیک شبکه و رفتار سرورها را به‌صورت مداوم مانیتور کنید تا هر تغییر غیرمعمولی شناسایی شود.

7- از سرویس‌های امنیتی مثل Web Application Firewall (WAF) استفاده کنید تا حملات DDoS تشخیص داده و مهار شوند.

.
#security #bug
دسته بندی Information Leakage

باگ Information Disclosure Vulnerabilities به مشکلات امنیتی اشاره دارد که به حمله‌کنندگان اجازه می‌دهد اطلاعات حساس، مهم یا مخرب را از سیستم یا برنامه‌ی هدف دریافت کنند. این نوع باگ می‌تواند اطلاعات کاربران، تنظیمات داخلی سیستم، رمزها و سایر جزئیات حساس را آشکار کند.

مثال:

یک وب‌سایت حاوی یک صفحه‌ی ورود است که کاربران باید نام کاربری و رمز عبور خود را وارد کنند. اما اگر در صفحه ورود پیام‌های خطا با جزئیات حساس مانند "نام کاربری اشتباه" یا "رمز عبور نادرست" نشان داده شوند، حمله‌کننده می‌تواند اطلاعات دقیق راجع به نام‌های کاربری موجود و یا تلاش‌های احتمالی برای ورود به حساب کاربری‌ها را به دست آورد.

روش‌های جلوگیری :

1- پیام‌های خطا نباید حاوی جزئیات حساس باشند. به جای آن، پیام‌های کلی و مشخص کننده برای کاربران نمایش داده شوند.

2- اطلاعات حساس در پاسخ‌ها، لاگ‌ها و خروجی‌های دیگر فیلتر شوند یا به‌طور مناسب مخفی شوند.

3- اطلاعات حساس در حالت عادی به‌صورت پنهانی نمایش داده نشوند و فقط در صورت ضرورت، مانند حالت اشتباه در ورود اطلاعات، نمایش داده شوند.

4- اطمینان حاصل کنید که تنظیمات و پیکربندی‌ها (مانند فایل‌های تنظیمات) به‌طور صحیح تنظیم شده‌اند تا اطلاعات حساس منتشر نشود.

5- اطلاعات داخلی سیستم یا برنامه به کاربران عادی نمایش داده نشوند. این اطلاعات تنها برای اشخاصی با دسترسی مناسب قابل دسترسی باشند.

.
#security #bug
دسته بندی Business Logic Errors

مشکلی که توی این پست بهش پرداخته شده خیلی مهمه و خیلی ها بهش توجه نمیکنن و آخر کار چیزی که تحویل میدن 20 درصدش پروژه س بقیه ش باگ.

خطای Business Logic Errors به خطاهایی اشاره دارند که در منطق کسب و کار و عملیات اصلی یک برنامه یا سیستم وجود دارند. این نوع از خطاها معمولاً به دلیل نقص در طراحی یا پیاده‌سازی منطق کسب و کار به وجود می‌آیند و می‌توانند منجر به عملکرد نادرست یا ناپایدار سیستم شوند.

مثال:

یک وب‌سایت فروشگاهی داریم که به مشتریان اجازه می‌دهد محصولات را به سبد خرید خود اضافه کنند و سپس سفارش خود را نهایی کنند. اما در این وب‌سایت یک باگ منطقی وجود دارد که به مشتریان اجازه می‌دهد تعداد نامحدودی از محصولات را به سبد خرید خود اضافه کنند و در نتیجه تعدادی از محصولات را به صورت رایگان دریافت کنند.

روش‌های جلوگیری:

1- قبل از شروع پیاده‌سازی، منطق کسب و کار را به‌دقت تحلیل کنید تا از وجود خطاهای منطقی پیشگیری شود.

2- منطق کسب و کار را به‌صورت دقیق تست کنید تا اطمینان حاصل شود که به‌طور صحیح کار می‌کند.

3- محدودیت‌های منطقی در سیستم اعمال کنید تا به کاربران اجازه عملیات‌های نامعقول ندهید. به‌عنوان مثال، تعداد حداکثری محصولاتی که می‌توانند به سبد خرید اضافه کنند.

4- برای تغییرات در منطق کسب و کار از واحد‌های تراکنشی استفاده کنید تا تغییرات منطقی به تمامی بخش‌های مرتبط اعمال شود.

5- کدها را به‌صورت دوره‌ای بازبینی کنید تا از وجود خطاهای منطقی غافل نشوید.

6- تست‌های منطقی و عملکردی را به‌صورت مداوم اجرا کنید تا از صحت و عملکرد صحیح منطق کسب و کار اطمینان حاصل شود.

.
#security #bug

دسته بندی Cryptographic Vulnerabilities

باگ Cryptographic Vulnerabilities به مشکلات امنیتی اشاره دارند که در مورد استفاده از الگوریتم‌های رمزنگاری و مکانیزم‌های امنیتی مربوط به حفاظت از اطلاعات مهم و حساس به وجود می‌آیند. اشتباهات در استفاده از رمزنگاری می‌توانند به حملاتی مانند دسترسی غیرمجاز به اطلاعات یا تخریب امنیت دسترسی منجر شوند.

مثال:

فرض کنید یک وب‌سایت داریم که از الگوریتم رمزنگاری نیافته و به جای آن از رمزنگاری خودساخته استفاده می‌کند. این رمزنگاری خودساخته به عنوان "ترکیبی" از چند الگوریتم ضعیف تشکیل شده و تا حد زیادی پیچیدگی‌های رمزنگاری را نادیده می‌گیرد.

یک حمله‌کننده با تجزیه و تحلیل دقیق بر روی این رمزنگاری خودساخته می‌تواند به‌طور نسبتاً آسان ترکیبی را بشکند و اطلاعات مهم مانند رمز‌های عبور کاربران را به‌طور غیرمجاز بدست آورد.

روش‌های جلوگیری:

1- از الگوریتم‌های رمزنگاری استاندارد و بازیابی شده با تست‌های امنیتی استفاده کنید.

2- از کتابخانه‌ها و ابزارهای معتبر و تاییدشده برای انجام عملیات رمزنگاری استفاده کنید.

3- از الگوریتم‌های رمزنگاری با امنیت بالا و تاثیر ثابت مانند AES استفاده کنید.

4- از رمزنگاری خودساخته و ترکیب‌های مختلف استفاده نکنید، زیرا ممکن است ضعف‌های جدی در رمزنگاری ایجاد شود.

5- به جز رمزنگاری، سایر اجزای سیستم را نیز به درستی محافظت کنید تا امنیت کلی تضمین شود.

6- کدها را بازبینی کرده و با تست‌های امنیتی الگوریتم‌ها و مکانیزم‌های رمزنگاری را ارزیابی کنید.

7- از مدیریت مناسب کلید‌ها و مواد رمزنگاری استفاده کنید تا از دسترسی غیرمجاز به اطلاعات جلوگیری شود.

.
#security #bug

دسته بندی Privilege Escalation Vulnerabilities

باگ Privilege Escalation Vulnerabilities به مشکلات امنیتی اشاره دارد که به حمله‌کننده اجازه می‌دهد سطح دسترسی خود را از سطح کاربر عادی به سطح دسترسی بیشتر (مانند مدیر سیستم) ارتقاء دهد. این نوع از حملات می‌توانند منجر به دسترسی غیرمجاز به منابع و عملیات حساس شوند.

مثال:

فرض کنید یک سیستم عامل با معماری چندکاربره داریم که کاربران مختلف با سطوح دسترسی متفاوت می‌توانند وارد سیستم شوند. هر کاربر به منابع معینی دسترسی دارد و کاربران معمولاً به منابع دیگر دسترسی ندارند.

اما حالتی رخ می‌دهد که یک کاربر معمولی، به نحوی آسیب‌پذیری در سیستم را کشف می‌کند که او را قادر می‌سازد (Token) یک کاربر با سطح دسترسی مدیریتی را بدست آورد.

کاربر معمولی با بهره‌گیری از این آسیب‌پذیری، توانایی اجرای عملیات‌هایی که به کاربران معمولی دسترسی ندارند را پیدا می‌کند. این عمل به نوعی ارتقاء دسترسی از سطح کاربر عادی به سطح دسترسی مدیریتی به شمار می‌رود. در نتیجه، این کاربر معمولی قادر است به منابع حساسی دسترسی یابد و عملیات‌هایی را انجام دهد که اصلاحات یا حتی خرابی‌های جدی در سیستم ایجاد می‌کند.

روش‌های جلوگیری:

1- به کاربران و سیستم‌ها تنها دسترسی‌های لازم را اختصاص دهید تا حداقل اصول "کمترین دسترسی" رعایت شود.

2- از مکانیزم‌های قوی احراز هویت و دسترسی استفاده کنید تا از افراز و انتقال دسترسی‌های غیرمجاز جلوگیری شود.

3- مجوزها و نقش‌ها را به‌دقت بررسی کنید و اطمینان حاصل کنید که هیچ کاربری دسترسی به منابع یا عملیات حساس ندارد.

4- تست‌های امنیتی مرتب روی سیستم‌ها و نرم‌افزارها اجرا کنید تا از وجود آسیب‌پذیری‌های احتمالی آگاه شوید.

5- نرم‌افزارها، سیستم‌ها و کتابخانه‌ها را به‌روزرسانی کنید تا از مشکلات امنیتی اجتناب شود.

6- اجازه ندهید که کدهای اجرایی یا اسکریپت‌ها با دسترسی‌های بالا اجرا شوند.

7- از دیباگرها و ورودی‌های دیباگ مختلف برای تجزیه و تحلیل سیستم‌ها استفاده کنید تا آسیب‌پذیری‌ها کشف شوند.

.
#security #bug

دسته بندی Race Conditions

باگ Race Conditions به مشکلاتی در برنامه‌نویسی اشاره دارد که در آن ترتیب اجرای دستورات توسط برنامه توسط عوامل خارجی تعیین می‌شود. این موقعیت‌ها به حمله‌کنندگان اجازه می‌دهند تا در مواقعی که همزمانی اجرای دستورات در حالی که از منابع مشترک استفاده می‌کنند، ضعیفی ایجاد کنند و به نحوی اطلاعات را تغییر دهند یا منابع را دسترسی‌پذیر کنند.

مثال:

فرض کنید یک برنامه ساده با قسمتی برای افزایش موجودی حساب کاربری داریم. این برنامه به گونه‌ای طراحی شده است که هر بار که یک کاربر درخواست افزایش موجودی حساب خود را می‌دهد، برنامه مقدار موجودی حساب را از دیتابیس بخواند، مقدار جدید را محاسبه و سپس در دیتابیس ذخیره کند.

حالا فرض کنید دو کاربر به طور همزمان درخواست افزایش موجودی حساب خود را می‌دهند. در صورتی که برنامه ما قابلیت همزمانی (Concurrency) را به خوبی مدیریت نکند، دو کاربر ممکن است در همان لحظه مقدار موجودی را بخوانند، هر دو مقدار جدید را محاسبه کنند و در نهایت مقدار موجودی را با توجه به محاسبات خود به روزرسانی کنند. اینجاست که Race Conditions ایجاد می‌شود؛ اگر هر دو کاربر به همان زمان به دیتابیس نوشته خود دسترسی داشته باشند، ممکن است یکی از آن‌ها تغییرات دیگری که توسط دیگری انجام داده شده است را پوشش ندهد.

روش‌های جلوگیری:

1- برای عملیات‌هایی که به منابع مشترک دسترسی دارند، مکانیزم‌های به‌روزرسانی انحصاری (Locking) را به‌کار ببرید تا فقط یک نخ اجازه دسترسی و تغییر منبع را داشته باشد.

2- در مواردی که از پایگاه داده استفاده می‌کنید، از تراکنش‌ها برای محدود کردن دسترسی‌ها و به‌روزرسانی‌ها استفاده کنید.

3- از مکانیزم‌های Semaphore و Mutex برای مدیریت دسترسی‌های همزمانی در برنامه‌ها استفاده کنید.

4- در زبان‌های برنامه‌نویسی که از نخ‌ها (Threads) استفاده می‌کنند، از مکانیزم‌های Thread-safe مانند synchronized استفاده کنید.

5- در زبان‌های برنامه‌نویسی که از متغیرهای اتمی پشتیبانی می‌کنند، از آنها برای جلوگیری از مشکلات Race Conditions استفاده کنید.

6- طراحی مناسب و اجرای کد با رعایت اصول همزمانی و به‌روزرسانی منابع مشترک، مشکلات Race Conditions را کاهش می‌دهد.

.
خب این مبحث باگ های امنیتی هم تموم شد
فک کنم ۲۳ تا شد
خیلی داشت خسته کننده میشد که از ۴۰ تا ممبر عزیز ۵ تاشون لفت دادن😂

در نتیجه بهتره از هر مبحث تعداد کمتری توضیح داد که خسته کننده نشه

ایده ایی برای مبحث جدید ندارم
پس تو این چند روز پست زیادی نیست

شاید فکر کنید چرا با ۳۵ تا عضو باز هم پست میزارم😂
ولی خب از همین ۳۵ تا ۱ نفر هم چیز جدیدی یاد بگیره برای من کافیه
و دوم اینکه خودم هم با نوشتن هر پست چیز های جدیدی یاد میگیرم

در اخر اگه مشکلی توی پست ها بود بگید
و اگه نظری برای مبحث جدید داشتید اون رو هم بگید❤️

‌.
4
چطور توی php اکستنشن خودمون رو بسازیم؟

یه موضوعی که شاید براتون جالب باشه اکستنشن های php هست
قطعا کسایی که با php کار میکنن با این اکستنشن ها آشنا هستن
مثل curl , gd , pdo , mysqli و....
و یک سری ابزار توسعه داده شده به زبان های C یا C++ هستند که قابلیت هایی رو به php اضافه میکنن.
هدف این پست تعریف اکستنشن ها نیست بلکه ساخت یک اکستنشن شخصی هست که میتونه جالب باشه برای همه.

1- در مرحله اول باید محیط توسعه رو آماده کنیم
من توی این آموزش از یک دبین بیس (WSL-Ubuntu) استفاده کردم که کاربر های ویندوزهم میتونن با wsl کار کنن
و از کامپایلر GCC، ادیتور هم که اهمیتی نداره
در ادامه ابزار رو نصب میکنیم
sudo apt-get install build-essential php8.0 php8.0-dev

2- در مرحله بعد باید فایل کانفیگ اکستنش رو درست بکنیم به نام config.m4 با مقادیر زیر:
PHP_ARG_ENABLE(php_helloworld, Whether to enable the HelloWorldPHP extension, [ --enable-helloworld-php Enable HelloWorldPHP])

if test "$PHP_HELLOWORLD" != "no"; then
PHP_NEW_EXTENSION(php_helloworld, php_helloworld.c, $ext_shared)
fi

3- در مرحله سوم شروع به کد زدن اکستنشن خودمون میکنیم (این اکستنشن صرفا یه تابع helloworld درست میکنه)
کد ها توی دو فایل php_helloworld.h و php_helloworld.h نوشته میشن که در ادامه کد هارو میبینید:

php_helloworld.h:
// we define Module constants
#define PHP_HELLOWORLD_EXTNAME "php_helloworld"
#define PHP_HELLOWORLD_VERSION "0.0.1"

// then we declare the function to be exported
PHP_FUNCTION(helloworld_php);

php_helloworld.c:
// include the PHP API itself
#include <php.h>
// then include the header of your extension
#include "php_helloworld.h"

// register our function to the PHP API
// so that PHP knows, which functions are in this module
zend_function_entry helloworld_php_functions[] = {
PHP_FE(helloworld_php, NULL)
{NULL, NULL, NULL}
};

// some pieces of information about our module
zend_module_entry helloworld_php_module_entry = {
STANDARD_MODULE_HEADER,
PHP_HELLOWORLD_EXTNAME,
helloworld_php_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
PHP_HELLOWORLD_VERSION,
STANDARD_MODULE_PROPERTIES
};

// use a macro to output additional C code, to make ext dynamically loadable
ZEND_GET_MODULE(helloworld_php)

// Finally, we implement our "Hello World" function
// this function will be made available to PHP
// and prints to PHP stdout using printf
PHP_FUNCTION(helloworld_php) {
php_printf("Hello World! (from our extension)\n");
}

4- حالا نوبت build کردنش هست:
اول محیط ساخت رو آماده میکنیم
phpize
سپس بیلد رو کانفیگ میکنیم و افزونه رو فعال می کنیم:
./configure --enable-php-helloworld

ور در نهایت بیلدش میکنیم
make
sudo make install
5- حالا نوبت تست هست
میتونید extension=php_helloworld رو به فایل php.ini خودتون اضافه کنید و سپس تابع helloworld_php() رو توی یک فایل php فراخوانی کنید یا در ترمینال خودتون درستور زیر رو بزنید
php -d extension=php_helloworld.so -r 'helloworld_php();'
و در نهایت زیبایی رو میبینید
Result:
Hello World! (from our extension)

منبع
.

سلام رفقا 👋🏻
توی این فولدر تلگرام ی سری کانال های خوب برنامه نویسی رو اد کردم.
روش بزنید تا به پوشه های تلگرامتون اضافه بشه

📁
t.me/addlist/NvmUA9kgu8w3NWY0

اگر شما هم کانال برنامه نویسی دارید برای اضافه شدن کانالتون به این لیست، اینجا بهم پیام بدید
🔥4
#composer
شاید پیش اومده باشه پکیج یا کتابخونه ایی رو توسعه داده باشید و قصد داشته باشید اون رو به کامپوزر اضافه کنید.
کار پیچیده ایی نیست!

اول توجه داشته باشید که پروژه تون روی جایی مثل گیت هاب به صورت پابلیک وجود داشته باشه
(من فقط با گیتهاب کارکردم و برای بقیه سایت های مشابه گیت هاب تست نکردم اطلاعی ندارم اگر میدونید بگید)

در مرحله اول باید کامپوزر رو روی سیستمتون نصب کنید که میتونید از این لینک استفاده کنید.

سپس یک اکانت توی packagist بسازید، بهتره با گیت هابتون لاگین کنید.

در مرحله بعد یک ترمینال باز کنید و وارد روت پروژه خودتون بشید و کامند زیر رو بزنید:
composer init

چند سوال ازتون میپرسه که به ترتیب بررسی میکنیم:
1- سوال اول اسم پکیج شمارو میخواد که از دو بخش وندور و نام پیکیج تشکیل میشه و باید فرمت زیر رو داشته باشه
vendor/name 
قسمت vendor رو یوزرنیم گیت هابتون بزارید
و قسمت name هم نام ریوزیتوری که پروژه تون داخلش قرار داره
به عنوان مثال برای آدرس زیر
github.com/myGithub/myLibrary
مقدار ریز رو وارد کنید
myGithub/myLibrary

2- سوال دوم ازتون توضیحات پروژه رو میخواد
3- سوال سوم ناشر پروژه
4- سوال چهارم Minimum Stability هست که میتونید یکی از موارد زیر رو بسته به پروژه بزنید یا خالی بزارید
stable, RC, beta, alpha, dev

5- سوال پنجم نوع پیکج هست که میتونه یکی از موارد زیر بر اساس پروژه باشه یا خالی بزارید
library, project, metapackage, composer-plugin

6- سوال ششم لایسنس پروژه رو میخواد که باز میتونید خالی بزارید

سوال هفتم و هشتم میگه میخواید دپندنسی های پروژه رو اضافه کنید
میتونید اضافه کنید یا no بزنید و بعدا اضافه کنید

سوال نهم namespace هایی که میخواید autoload بشه رو میخواد که باز هم میتونید skip کنید و بعدا اضافه کنید.

در نهایت یک نمایی از کانفیگ ساخته شده رو به شما میده و شما با زدن Enter تاییدش میکنید.

پروژه رو مجدد کامیت و پوش کنید تا موارد ساخته شده مربوط به کامپوزر آپدیت بشه و وارد packagist بشید، از منو بالا Submit رو بزنید و آدرس کامل ریپوزیتوری پروژه تون رو وارد کنید و Check رو بزنید.

اگر اروری نداشته باشید با موفقیت اضافه میشه و بعد از اون از طریق composer میتونید پروژه رو دانلود کنید.

برای مدیریت ورژن های پروژه میتونید هر ورژن رو توی branch جدا با نام ورژن قرار بدید.
سوال یا اشکالی بود بپرسید

.
🔥2
درود به همه
اگر مبحث یا موردی مد نظرتون هست بگید توضیح بدیم

مهم نیست چی باشه فقط توی حوزه برنامه نویسی باشه

اگر بلد بودم توضیح میدم، بلدهم نبودم با هم یاد میگیریم🫂

.
5