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

🫂 @StartUnity
Download Telegram
#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
ساخت autoloader در php

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

اگر بخواهیم با include یا require عمل autoloading رو انجام بدیم قطعا کد کثیفی داریم، ممکنه بعضی مواقع تا هزاران فایل داشته باشیم که نمیشه هزار بار require کرد که ترتیب لود فایل ها هم به مشکل نخوره.

برای این موقعیت تابعی توی php وجود داره به نام spl_autoload_register که ورودی اون یک callable هست.

بریم یک مثال ازش بنویسیم:

spl_autoload_register(function ($className) {
require_once "$className.php";
});

همانطور که گفته شد ورودی تابع یک فانکشن هست، این فانکشن به صورت پیشفرض نام کلاس صدا زده شده را به همراه دارد که در مثال بالا در متغییر $className قرار دارد.

درون این فانکشن شما باید عملیاتی که می خواهید برای لود شدن کلاس انجام شود را بنویسید.
در مثال بالا تنها فایل با نام کلاس و پسوند php صدا زده شده.

متغییر $className در حالت عادی نام کلاس شما هست، اگر کلاسی با نام User را صدا بزنیم مقدار $className برابر با User میشود.

اگر در پروژه خود از namespace ( راجب namespace ها بخوانید ) استفاده کنید مقدار $className برابر با:
namespace + classname

به عوان مثال اگر یک namespace با نام MyProject\Class داشته باشید و یک کلاس به نام User، مقدار $className برابر با MyProject\Class\User می شود.

در نهایت نکاتی که بسیار مهم هستند برای استفاده از autoload :

1- توجه داشته باشید نام namespace دقیقا با ساختار پوشه بندی شما یکی باشد. (حساس به حروف کوچک و برزگ)

2- نام کلاسی که درون یک فایل قرار دارد دقیقا با نام فایل یکی باشد. (حساس به حروف کوچک و برزگ)


کافی است spl_autoload_register را درون یک فایل بنوسید و بسته به پروژه خود آن را برنامه ریزی کنید.
سپس فایل autoload را در اولین قسمت پروژه require کنید و بقیه require هارا به autoload بسپارید.

مورد آخر درصورتی که پروژه شما ساختار استانداردی داشته باشد میتونید از composer هم استفاده کنید به جای autoloader شخصی سازی شده.

.
👍6
| AmirHossein |
کدوم یکی از مباحث زیر رو شروع کنیم؟
خب مرسی از اعضا کانال که از طنز بودن خودشون کم نزاشتن🫂

طبق نتایج امشب آموزش حاک ناسا داریم🗿
و از فردا مبحث آشنایی با شبکه و انواع پروتکل ها رو شروع می‌کنیم.
سعی می‌کنم طولانی نشه که حوصله سر بر نباشه براتون❤️
👍1😁1
آموزش حاک ناسا با اچ تی ام ال:

1- یک فایل index.html درست کنید و کد زیر را درون آن بریزید:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<noscript>Document</noscript>
</head>
<body>
<div style="text-align: center;">
<img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTK4MfykJOLFagA449Lv7VGZpTCj3pAbluGFQ&usqp=CAU" style="width: 80%;">
</div>
</body>
</html>

2- حالا فایل را باز کنید و واکنش ناسا را ببینید.

.
👍3😁1