| AmirHossein |
چند وقتی هست که روی یک پروژه کار میکنم یه کتابخونه برای ربات های تلگرامی قابلیت ها: - پشتیبانی از الوکوئنت لاراول - - مدل - - مایگریشن - پشتیبانی از openSwoole و AMPHP - - کوروتین - - و Swoole Table - پشتیبانی از Telegram Bot Api Server - پشتیبانی از…
کتابخانه LaraGram از طریق Composer در دسترس است!
.
composer create-project laraxgram/laragram:dev-master@dev my-bot
گیت هاب.
👍1
دو مبحث هست که دوست دارم راجع بهش توضیح بدم
یک : معرفی ۱۰ تا دیزاین پترن و آموزششون
دو : روش های نفوذپذیری وب و جلوگیری ازش
فقط نمیدونم کدوم رو اول بگم
هر دو مبحث طولانی و زمان بر هست
همین یکی دو روز آینده یکیش رو شروع میکنم
نظری داشتید خوشحال میشم در میون بزارید❤️
یک : معرفی ۱۰ تا دیزاین پترن و آموزششون
دو : روش های نفوذپذیری وب و جلوگیری ازش
فقط نمیدونم کدوم رو اول بگم
هر دو مبحث طولانی و زمان بر هست
همین یکی دو روز آینده یکیش رو شروع میکنم
نظری داشتید خوشحال میشم در میون بزارید❤️
❤2👍1
متسفانه به دلیل مسائل امنیتی که توی کامیت های LaraGram به وجود اومده بود مجبور به حذف ریپوزیتوری شدم
و خب 72 کامیت که داشت به علاوه استار ها حذف شدند
برای اینکه از این نوع مسائل براتون پیش نیاد میتونه خوب باشه که قابلیت Secret scanning رو فعال کنید
این قابلیت قبل از Push کردن کد رو بررسی میکنه و اگر حاوی توکن و امثالش باشه بهتون هشدار میده
برای فعال کردنش
Setting >> Code security and analysis :
Secret scanning : Enable
Push protection : Enable
در نهایت هم اگر دوست داشتید و براتون مقدور بود مجدد به ریپوزیتوری استار بدید❤️🙏
https://github.com/laraXgram/LaraGram
.
و خب 72 کامیت که داشت به علاوه استار ها حذف شدند
برای اینکه از این نوع مسائل براتون پیش نیاد میتونه خوب باشه که قابلیت Secret scanning رو فعال کنید
این قابلیت قبل از Push کردن کد رو بررسی میکنه و اگر حاوی توکن و امثالش باشه بهتون هشدار میده
برای فعال کردنش
Setting >> Code security and analysis :
Secret scanning : Enable
Push protection : Enable
در نهایت هم اگر دوست داشتید و براتون مقدور بود مجدد به ریپوزیتوری استار بدید❤️🙏
https://github.com/laraXgram/LaraGram
.
👍3❤1
#design_patterns
خب، قرار شد که 10 تا از دیزاین پترن های پرکاربرد رو معرفی و توضیح بدیم
اما قبل از اینکه شروع کنیم اول باید بدونیم دیزاین پترن چیه
دیزاین پترن (
مجموعهای از قواعد و الگوهایی است که در فرآیند طراحی نرمافزارها مورد استفاده قرار میگیرند. این الگوها برای حل مشکلات معمول در طراحی نرمافزارها، بهبود قابلیتها و کاهش پیچیدگی استفاده میشوند.
چند تا از کاربرد های اصلی دیزاین پترن ها :
1- افزایش قابلیت خوانایی و درک کد: از اونجایی که دیزاین پترن ها یک ساختار مشخص و قابل فهم دارند، قابلیت خوانایی کد رو هم برای برنامه نویس پروژه و هم سایر برنامه نویسان افزایش میدن.
2- کاهش پیچیدگی: دیزاین پترن با ارائه یک روش ساختارمند برای حل مشکلات معمول، پیچیدگی طراحی را کاهش میدهند و فرآیند توسعه نرمافزار را سادهتر میکنند.
3- افزایش قابلیت استفاده دوباره: دیزاین پترن با ارائه الگوهای استاندارد برای حل مسائل مشترک، امکان استفاده مجدد کد را افزایش میدهند و زمان و هزینههای توسعه را کاهش میدهند.
4- افزایش انعطافپذیری: دیزاین پترن با ایجاد ساختارهای قابل تغییر و گسترش، انعطافپذیری نرمافزار را افزایش میدهند و امکان تغییرات و بهبودهای آتی را فراهم میکنند.
5- استانداردسازی و هماهنگسازی: این الگوها به توسعهدهندگان کمک میکنند تا مشکلات معمول در طراحی نرمافزارها را حل کنند و به ساختار و عملکرد بهینه نرمافزارها دست پیدا کنند.
تا اینجا با برخی خواص دیزاین پترن ها آشنا شدیم
لیستی از دیزاین پترن هایی که قصد دارم در ادامه توضیح بده :
این الگو ها معمولا در بقیه زبان ها هم کاربرد دارند اما مثال ها با
.
خب، قرار شد که 10 تا از دیزاین پترن های پرکاربرد رو معرفی و توضیح بدیم
اما قبل از اینکه شروع کنیم اول باید بدونیم دیزاین پترن چیه
دیزاین پترن (
Design Patterns) :مجموعهای از قواعد و الگوهایی است که در فرآیند طراحی نرمافزارها مورد استفاده قرار میگیرند. این الگوها برای حل مشکلات معمول در طراحی نرمافزارها، بهبود قابلیتها و کاهش پیچیدگی استفاده میشوند.
چند تا از کاربرد های اصلی دیزاین پترن ها :
1- افزایش قابلیت خوانایی و درک کد: از اونجایی که دیزاین پترن ها یک ساختار مشخص و قابل فهم دارند، قابلیت خوانایی کد رو هم برای برنامه نویس پروژه و هم سایر برنامه نویسان افزایش میدن.
2- کاهش پیچیدگی: دیزاین پترن با ارائه یک روش ساختارمند برای حل مشکلات معمول، پیچیدگی طراحی را کاهش میدهند و فرآیند توسعه نرمافزار را سادهتر میکنند.
3- افزایش قابلیت استفاده دوباره: دیزاین پترن با ارائه الگوهای استاندارد برای حل مسائل مشترک، امکان استفاده مجدد کد را افزایش میدهند و زمان و هزینههای توسعه را کاهش میدهند.
4- افزایش انعطافپذیری: دیزاین پترن با ایجاد ساختارهای قابل تغییر و گسترش، انعطافپذیری نرمافزار را افزایش میدهند و امکان تغییرات و بهبودهای آتی را فراهم میکنند.
5- استانداردسازی و هماهنگسازی: این الگوها به توسعهدهندگان کمک میکنند تا مشکلات معمول در طراحی نرمافزارها را حل کنند و به ساختار و عملکرد بهینه نرمافزارها دست پیدا کنند.
تا اینجا با برخی خواص دیزاین پترن ها آشنا شدیم
لیستی از دیزاین پترن هایی که قصد دارم در ادامه توضیح بده :
Singleton Factory Observer MVC Repository Strategy Facade Dependency Injection
Template Method
Iterator این الگو ها معمولا در بقیه زبان ها هم کاربرد دارند اما مثال ها با
PHP خواهند بود..
🔥3
#design_patterns
یکی از معروف ترین و ساده ترین دیزان پترن ها
دیزان پترن
ساختارش به این صورت هست:
این کلاس دارای یک پراپرتی
زمانی که متد
در صورتی که نمونه ساخته نشده باشد(پراپرتی
با استفاده از این دیزاین پترن درصورتی که صد ها بار هم از کلاس
database connected
.
یکی از معروف ترین و ساده ترین دیزان پترن ها
Singleton هست.دیزان پترن
Singleton برای ایجاد یک کلاسی استفاده میشود که تنها یک نمونه از آن در سراسر برنامه وجود دارد. این الگو برای اطمینان از اینکه تمام اجزای برنامه از یک نمونه واحد استفاده میکنند، مفید است.ساختارش به این صورت هست:
class DatabaseConnection {
private static $instance;
private function __construct() {
echo "database connected";
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new DatabaseConnection();
}
return self::$instance;
}
}
در مثال بالا یک کلاس برای اتصال به دیتابیس داریم.این کلاس دارای یک پراپرتی
instance هست که یا null است یا حاوی یک نمونه از کلاس، و یک متد getInstance.زمانی که متد
getInstance فراخوانی شود چک می کند که آیا از قبل نمونه ایی از کلاس ساخته شده یا خیر، این کار را با بررسی مقدار پراپرتی instance انجام می دهد که آیا null هست یا حاوی یک نمونه از کلاس.در صورتی که نمونه ساخته نشده باشد(پراپرتی
instance برابر null باشد) یک نمونه جدید می سازد و در صورتی که از قبل نمونه وجود داشته باشد(پراپرتی instance برابر نمونه ایی از کلاس باشد) همان نمونه قبلی را استفاده می کند.با استفاده از این دیزاین پترن درصورتی که صد ها بار هم از کلاس
DatabaseConnection نمونه بسازید فقط و فقط یک بار ساخته می شود.DatabaseConnection::getInstance();Result:
DatabaseConnection::getInstance();
DatabaseConnection::getInstance();
DatabaseConnection::getInstance();
database connected
.
❤3👍1
#design_patterns
مورد بعدی دیزاین پترن
این دیزاین پترن در
مثال:
در نهایت، کلاس
برای استفاده از الگوی
yellow
red
با استفاده از الگوی
.
مورد بعدی دیزاین پترن
Factory هست.این دیزاین پترن در
PHP برای ایجاد شئ ها به صورت پویا و بر اساس نیازها و شرایط مختلف استفاده میشود. این الگو به شما اجازه میدهد که بدون نیاز به دستکاری کد اصلی، شئ های مختلف را ایجاد کنید.مثال:
interface Fruit {
public function color();
}
class Banana implements Fruit {
public function color() {
echo "yellow";
}
}
class Apple implements Fruit {
public function color() {
echo "red";
}
}
class FruitFactory {
public function createFruit($fruitName) {
if ($fruitName === 'banana') {
return new Banana();
} elseif ($fruitName === 'apple') {
return new Apple();
}
}
}
در مثال بالا، ابتدا یک اینترفیس Fruit تعریف شده است که توابعی مانند color را برای میوه ها تعریف میکند. سپس دو کلاس Banana و Apple ایجاد شدهاند که از رابط Fruit ارثبری میکنند و توابع color را پیادهسازی میکنند.در نهایت، کلاس
FruitFactory تعریف شده است که به عنوان یک فکتوری برای ایجاد شیءهای میوه عمل میکند. متد createFruit در این کلاس یک نوع میوه را به عنوان ورودی دریافت میکند و بر اساس نوع میوه مورد نظر، یک شئ مربوطه را ایجاد و برمیگرداند.برای استفاده از الگوی
Factory به روش زیر عمل می کنیم:$factory = new FruitFactory();Result:
$banana = $factory->createFruit('banana');
$banana->color();
yellow
$apple = $factory->createFruit('apple');
$apple->color();
Result:red
با استفاده از الگوی
Factory، ما میتوانیم به راحتی شئ های مختلف را ایجاد کنیم، بدون اینکه بخشهای دیگر برنامه را تغییر دهیم. این الگو به ما امکان میدهد به سادگی از تغییرات در ایجاد شئ ها برای موارد خاص استفاده کنیم..
👍2
#design_patterns
دیزاین پترن بعدی
دیزاین پترن
در دیزاین پترن
مثال:
همچنین، یک کلاس مشترککننده
Received data: Hello Banana!
Received data: Hello Banana!
در مثال بالا، ابتدا یک شئ
دیزاین پترن
.
دیزاین پترن بعدی
Observer که به معنی مشاهده گر هست.دیزاین پترن
Observer برای برقراری ارتباط بین اجزای نرمافزار به منظور رصد و پاسخ به تغییرات استفاده میشود. در این الگو، یک شئ ارائه دهنده اطلاعات مرتبط (مشترک) به تعدادی از شئ های مشاهدهکننده وابسته است. وقتی که وضعیت شئ ارائه دهنده اطلاعات تغییر میکند، تمام شئ های مشاهدهکننده مطلع میشوند و عملیاتی را براساس تغییرات انجام میدهند.در دیزاین پترن
Observer، ارتباط بین ارائه دهنده اطلاعات (موضوع) و شئ های مشاهدهکننده (مشترکین) به وسیله رابط یا کلاسی که شئ های مشاهدهکننده را نگهداری میکند (مشترککننده) برقرار میشود.مثال:
interface Observer {
public function update($data);
}
class Subject {
private $observers = [];
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function detach(Observer $observer) {
$index = array_search($observer, $this->observers);
if ($index !== false) {
unset($this->observers[$index]);
}
}
public function notify($data) {
foreach ($this->observers as $observer) {
$observer->update($data);
}
}
}
class ConcreteObserver implements Observer {
public function update($data) {
echo "Received data: " . $data . "\n";
}
}
در مثال بالا، اینترفیس Observer تعریف شده است که تابع update را میشود پیادهسازی کرد. سپس کلاس Subject ایجاد شده است که شئ های Observer را نگهداری میکند. متد attach برای اضافه کردن شئ های Observer، متد detach برای حذف آنها و متد notify برای اطلاعرسانی تغییرات به تمام Observer ها استفاده میشود.همچنین، یک کلاس مشترککننده
ConcreteObserver تعریف شده است که روش update را پیادهسازی میکند. وقتی که تغییری در Subject رخ میدهد و تابع notify فراخوانی میشود، تمام مشترککنندهها (شئ های Observer) به طور خودکار تابع update را اجرا کرده و تغییرات را دریافت میکنند.$subject = new Subject();Result:
$observer1 = new ConcreteObserver();
$subject->attach($observer1);
$observer2 = new ConcreteObserver();
$subject->attach($observer2);
$subject->notify("Hello Banana!");
Received data: Hello Banana!
Received data: Hello Banana!
در مثال بالا، ابتدا یک شئ
Subject ایجاد شده و دو شئ ConcreteObserver به آن الحاق شدهاند. سپس با فراخوانی تابع notify روی Subject و ارسال پیام Hello Banana!، تمام مشترککنندهها این پیام را دریافت و نمایش میدهند.دیزاین پترن
Observer زمانی مفید است که یک تغییر در یک شئ منجر به تغییراتی در شئ های دیگر میشود و ارتباط ضعیف بین اجزا مد نظر است. این الگو باعث جداسازی اجزا و افزایش انعطافپذیری در نرمافزار میشود..
👍2
#design_patterns
دیزاین پترن MVC یا معماری MVC که مخفف Model, View, Controller هست و تقریبا همتون باهاش آشنایی دارید.
دیزاین پترن MVC یکی از دیزاین پترن های ساختاری است که برای سازماندهی و جداسازی بخشهای مختلف یک برنامه مورد استفاده قرار میگیرد. MVC متدولوژی معماری محبوبی در توسعه نرمافزار است که به برنامهها انعطافپذیری، قابلیت تست و قابلیت نگهداری بیشتری میبخشد.
مدل (Mpdel): مدل مسئولیتی را بر عهده دارد که دادهها و منطق برنامه را مدیریت کند. مدلها معمولاً شامل کلاسها و ساختارهای دادهای هستند که دادهها را نگهداری و عملیاتی روی آنها را انجام میدهند. مثالهایی از مدلها شامل کلاسهای مرتبط با پایگاه داده، کلاسهای مدیریت کننده داده و کلاسهای مرتبط با قوانین برنامه هستند.
ویو یا نما (View): نما مسئولیت نمایش دادهها را دارد و بر اساس دادههایی که از مدل دریافت میکند، اطلاعات را به کاربر نمایش میدهد. نما معمولاً شامل تمپلیتها، صفحات و بخشهای واسط کاربری است که برای نمایش اطلاعات به کاربر استفاده میشود. نما مستقیماً با کاربر در ارتباط است و تغییرات در نما بر اثر ورودی کاربر اتفاق میافتد.
کنترلر یا کنترل کننده (Controller): کنترلکننده مسئولیت هدایت جریان کار بین مدل و نما را بر عهده دارد. وظیفه کنترلکننده این است که ورودیهای کاربر را دریافت کرده، عملیات لازم را بر روی مدل انجام دهد و سپس نمایش مناسب را به نما بدهد. به عبارتی، کنترلکننده پلی بین مدل و نما است. مثالهایی از عملیاتی که کنترلکننده انجام میدهد، شامل بررسی validate کردن ورودیها، انجام تغییرات در مدل و انتقال دادهها به نما است.
در معماری MVC، نمایش دادهها و همچنین منطق برنامه جدا از یکدیگر میشوند. این امکان را به توسعهدهندگان میدهد تا بخشهای مختلف برنامه را به صورت مستقل توسعه دهند و تغییرات را در بخشهای دیگر تأثیر ندهد. همچنین، جدا کردن منطق برنامه از نمایش دادهها باعث سادهسازی فرآیند تست و نگهداری میشود.
مثال :
Data: Hello, World!
در مثال بالا، مدل (Model) مسئولیتی برای نگهداری و مدیریت دادهها دارد. نما (View) وظیفه نمایش دادهها را دارد و کنترلکننده (Controller) وظیفه هدایت جریان کار بین مدل و نما را بر عهده دارد. با استفاده از کنترلکننده، داده ورودی (Hello, World!) به مدل داده شده، سپس از مدل خوانده شده و در نما نمایش داده میشود.
این معماری به توسعهدهندگان امکان میدهد که به صورت جداگانه بر روی هر بخش (مدل، نما و کنترلکننده) کار کنند و به سادگی تغییرات را اعمال کنند. همچنین، این الگوی طراحی باعث میشود برنامه ماژولارتر و قابل تستتر باشد.
.
دیزاین پترن MVC یا معماری MVC که مخفف Model, View, Controller هست و تقریبا همتون باهاش آشنایی دارید.
دیزاین پترن MVC یکی از دیزاین پترن های ساختاری است که برای سازماندهی و جداسازی بخشهای مختلف یک برنامه مورد استفاده قرار میگیرد. MVC متدولوژی معماری محبوبی در توسعه نرمافزار است که به برنامهها انعطافپذیری، قابلیت تست و قابلیت نگهداری بیشتری میبخشد.
مدل (Mpdel): مدل مسئولیتی را بر عهده دارد که دادهها و منطق برنامه را مدیریت کند. مدلها معمولاً شامل کلاسها و ساختارهای دادهای هستند که دادهها را نگهداری و عملیاتی روی آنها را انجام میدهند. مثالهایی از مدلها شامل کلاسهای مرتبط با پایگاه داده، کلاسهای مدیریت کننده داده و کلاسهای مرتبط با قوانین برنامه هستند.
ویو یا نما (View): نما مسئولیت نمایش دادهها را دارد و بر اساس دادههایی که از مدل دریافت میکند، اطلاعات را به کاربر نمایش میدهد. نما معمولاً شامل تمپلیتها، صفحات و بخشهای واسط کاربری است که برای نمایش اطلاعات به کاربر استفاده میشود. نما مستقیماً با کاربر در ارتباط است و تغییرات در نما بر اثر ورودی کاربر اتفاق میافتد.
کنترلر یا کنترل کننده (Controller): کنترلکننده مسئولیت هدایت جریان کار بین مدل و نما را بر عهده دارد. وظیفه کنترلکننده این است که ورودیهای کاربر را دریافت کرده، عملیات لازم را بر روی مدل انجام دهد و سپس نمایش مناسب را به نما بدهد. به عبارتی، کنترلکننده پلی بین مدل و نما است. مثالهایی از عملیاتی که کنترلکننده انجام میدهد، شامل بررسی validate کردن ورودیها، انجام تغییرات در مدل و انتقال دادهها به نما است.
در معماری MVC، نمایش دادهها و همچنین منطق برنامه جدا از یکدیگر میشوند. این امکان را به توسعهدهندگان میدهد تا بخشهای مختلف برنامه را به صورت مستقل توسعه دهند و تغییرات را در بخشهای دیگر تأثیر ندهد. همچنین، جدا کردن منطق برنامه از نمایش دادهها باعث سادهسازی فرآیند تست و نگهداری میشود.
مثال :
class Model {
private $data;
public function setData($data) {
$this->data = $data;
}
public function getData() {
return $this->data;
}
}
class View {
public function render($data) {
echo "Data: " . $data;
}
}
class Controller {
private $model;
private $view;
public function __construct(Model $model, View $view) {
$this->model = $model;
$this->view = $view;
}
public function processData($data) {
$this->model->setData($data);
$data = $this->model->getData();
$this->view->render($data);
}
}
$model = new Model();
$view = new View();
$controller = new Controller($model, $view);
$controller->processData("Hello, World!");
Result:Data: Hello, World!
در مثال بالا، مدل (Model) مسئولیتی برای نگهداری و مدیریت دادهها دارد. نما (View) وظیفه نمایش دادهها را دارد و کنترلکننده (Controller) وظیفه هدایت جریان کار بین مدل و نما را بر عهده دارد. با استفاده از کنترلکننده، داده ورودی (Hello, World!) به مدل داده شده، سپس از مدل خوانده شده و در نما نمایش داده میشود.
این معماری به توسعهدهندگان امکان میدهد که به صورت جداگانه بر روی هر بخش (مدل، نما و کنترلکننده) کار کنند و به سادگی تغییرات را اعمال کنند. همچنین، این الگوی طراحی باعث میشود برنامه ماژولارتر و قابل تستتر باشد.
.
#design_patterns
دیزاین پترن
فرض کنید که شما در حال توسعه یک برنامهی وب برای مدیریت اطلاعات کاربران هستید. اطلاعات کاربران (مانند نام، ایمیل، رمزعبور و ...) در یک پایگاه دادهی رابطهای (مثل
مثال :
ابتدا یک
.
دیزاین پترن
Repository یکی از الگوهای معماری مورد استفاده در توسعه نرمافزار است که به عنوان واسطی بین بخشهای دادهی دائمی (مثل دیتابیس) و بخشهای کد برنامه مورد استفاده قرار میگیرد. هدف اصلی این دیزاین پترن، جداسازی لایههای داده از لایههای برنامهنویسی و ایجاد یک واسط یکسان برای دسترسی و مدیریت دادهها می باشد.فرض کنید که شما در حال توسعه یک برنامهی وب برای مدیریت اطلاعات کاربران هستید. اطلاعات کاربران (مانند نام، ایمیل، رمزعبور و ...) در یک پایگاه دادهی رابطهای (مثل
MySQL) ذخیره میشود. به جای اینکه در کد برنامهی خود مستقیماً با پایگاه داده ارتباط برقرار کنید، از دیزاین پترن Repository استفاده میکنیم.مثال :
ابتدا یک
Interface برای Repository تعریف میکنیم که متدهایی برای ایجاد (create)، خواندن (read)، بروزرسانی (update) و حذف (delete) اطلاعات کاربران داشته باشد.interface UserRepositoryInterface {
public function create(array $data): bool;
public function read(int $id): array;
public function update(int $id, array $data): bool;
public function delete(int $id): bool;
}
حالا یک کلاس برای Repository برای دیتابیس MySQL ایجاد میکنیم و متدهای Interface را پیادهسازی میکنیم.class MySQLUserRepository implements UserRepositoryInterface {
private $connection;
public function __construct(mysqli $connection) {
$this->connection = $connection;
}
public function create(array $data): bool {
// Code to create user
return true;
}
public function read(int $id): array {
// Code to select user by id
$data = ['userDataFromDb'];
return $data;
}
public function update(int $id, array $data): bool {
// Code to update user
return true;
}
public function delete(int $id): bool {
// Code to delete user
return true;
}
}
حالا میتوانیم در برنامهی خود از Repository استفاده کنیم.// create connection and repository
$connection = new mysqli("localhost", "username", "password", "database_name");
$userRepository = new MySQLUserRepository($connection);
// create new user
$newUser = [
'name' => 'John Doe',
'email' => 'john@example.com',
'password' => 'hashed_password'
];
$userRepository->create($newUser);
// select user by id
$userData = $userRepository->read(1);
print_r($userData);
// update user by id
$updatedUser = [
'name' => 'Jane Doe',
'email' => 'jane@example.com',
'password' => 'new_hashed_password'
];
$userRepository->update(1, $updatedUser);
// delete user
$userRepository->delete(1);
در این مثال، با استفاده از اینترفیس UserRepositoryInterface، وابستگیهای کد به پایگاه داده جدا میشود. سپس با پیادهسازی کلاس MySQLUserRepository، کار با پایگاه دادهی MySQL به صورت مستقیم در Repository انجام میشود. این جداسازی باعث میشود تا میتوانیم با تغییر پایگاه داده، کد برنامهی خود را به راحتی تغییر داده و با اطمینان از عملکرد درست نرمافزار خود مطمئن شویم. همچنین، این کار باعث میشود که مدیریت دادهها و دسترسی به آنها به صورت مجزا و قابل مدیریتتری صورت گیرد..
👍1
#design_patterns
دیزاین پترن
فرض کنید که شما یک برنامه برای محاسبه قیمت نهایی محصولات در یک فروشگاه آنلاین طراحی میکنید. قیمت نهایی هر محصول بسته به شرایط مختلف میتواند به روشهای مختلفی محاسبه شود. مثلاً برخی از محصولات ممکن است با تخفیفهای ویژهای به فروش برسند، برخی دیگر با توجه به نوع مشتری (حقیقی یا حقوقی) با قیمت متفاوت عرضه شوند و برخی ممکن است به صورت ثابت به فروش برسند.
مثال:
ابتدا یک اینترفیس برای استراتژیها تعریف میکنیم که متد محاسبه قیمت نهایی محصول را دارد.
Final Price: 90
در این مثال، از دیزاین پترن
.
دیزاین پترن
Strategy یکی از دیزاین پترن های رایج معماری نرمافزاری است که در آن یک خانواده از الگوریتمها یا روشهای مختلف ارائه میشود و این امکان را به کاربر میدهد که در زمان اجرای برنامه، یکی از این الگوریتمها را انتخاب کند و از آن استفاده کند.فرض کنید که شما یک برنامه برای محاسبه قیمت نهایی محصولات در یک فروشگاه آنلاین طراحی میکنید. قیمت نهایی هر محصول بسته به شرایط مختلف میتواند به روشهای مختلفی محاسبه شود. مثلاً برخی از محصولات ممکن است با تخفیفهای ویژهای به فروش برسند، برخی دیگر با توجه به نوع مشتری (حقیقی یا حقوقی) با قیمت متفاوت عرضه شوند و برخی ممکن است به صورت ثابت به فروش برسند.
مثال:
ابتدا یک اینترفیس برای استراتژیها تعریف میکنیم که متد محاسبه قیمت نهایی محصول را دارد.
interface PricingStrategy {
public function calculateFinalPrice(float $price): float;
}
سپس برای هر روش محاسبه قیمت نهایی محصول، یک کلاس را پیادهسازی میکنیم که از این اینترفیس ارثبری کند و متد محاسبه قیمت را به شکل متناسب با الگوریتمهای خود پیادهسازی کند.class RegularPricingStrategy implements PricingStrategy {
public function calculateFinalPrice(float $price): float {
return $price;
}
}
class DiscountPricingStrategy implements PricingStrategy {
private $discountPercentage;
public function __construct(float $discountPercentage) {
$this->discountPercentage = $discountPercentage;
}
public function calculateFinalPrice(float $price): float {
$discountAmount = $price * ($this->discountPercentage / 100);
return $price - $discountAmount;
}
}
class SpecialCustomerPricingStrategy implements PricingStrategy {
private $specialPrice;
public function __construct(float $specialPrice) {
$this->specialPrice = $specialPrice;
}
public function calculateFinalPrice(float $price): float {
return $this->specialPrice;
}
}
حالا میتوانیم در برنامهی خود از دیزاین پترن استراتژی استفاده کنیم و به راحتی یکی از روشهای محاسبه قیمت را برای هر محصول انتخاب کنیم.$strategy = new SpecialCustomerPricingStrategy(10);Result:
$price = 100;
$finalPrice = $strategy->calculateFinalPrice($price);
echo "Final Price: $finalPrice";
Final Price: 90
در این مثال، از دیزاین پترن
Strategy برای جداسازی الگوریتمهای مختلف محاسبه قیمت نهایی محصول استفاده کردیم. با استفاده از این الگو، میتوانیم به راحتی یکی از روشهای مختلف محاسبه قیمت را انتخاب کنیم و از آن استفاده کنیم، بدون اینکه نیاز به تغییر در کد برنامهی خود داشته باشیم. همچنین، با اضافه کردن استراتژیهای جدید، میتوانیم به سادگی قابلیتهای جدید به برنامهی خود اضافه کنیم بدون تغییر در کد موجود..
❤1
فریم ورک
این فریم ورک برای توسعه اپلیکیشن های دسکتابی با استفاده از زبان
برای توسعه فرانت اپ های دسکتابی از
نکته ی جالب تر اینه که این فریم ورک در حال حاضر فقط با لاراول کار میکنه، ولی گفته شده در آینده میشه جدا از لاراول هم استفاده بشه.
این که بر پایه لاراول باشه خودش یک مزیته، یعنی شما وب سایت خودتون رو با لاراول بنویسید و یک خروجی دسکتاپ هم از وب سایتتون بگیرید!
نکته جالب تر، از اونجایی که فرانت کار با
سعی کردم که یک تست ازش بگیرم، شروع به نصبش کردم و موقع اجرا با اروری برخورد کردم.
بعد از سرچ متوجه شدم که در حال حاظر فایل های باینری ایی برای ویندوز نداره و حتی روی لینوکس هم کار نمیکنه، وفعلا فقط روی مک کار میکنه درنتیجه باید منتظر موند.
در کل میتونه چیز جالبی باشه، البته که نه برای پروژه های بزرگ ولی در حد خروجی یک وب سایت اداری و حسابداری که نسخه دسکتابی هم داشته باشه.
بقیه مستندات رو از داکیمونت رسمیش بخونید.
و همینطور صفحه گیت هاب.
.
nativephp که چیزی از انتشارش نگذشته و در حال حاظر نسخه آلفا هست.این فریم ورک برای توسعه اپلیکیشن های دسکتابی با استفاده از زبان
php توسعه داده شده که واقعا میتونه چیز جالبی باشه.برای توسعه فرانت اپ های دسکتابی از
Html, Css, Js استفاده می کنه و این یعنی توسعه اپ دسکتاپ برای توسعه دهنده های وب به سادگی آب خوردنه.نکته ی جالب تر اینه که این فریم ورک در حال حاضر فقط با لاراول کار میکنه، ولی گفته شده در آینده میشه جدا از لاراول هم استفاده بشه.
این که بر پایه لاراول باشه خودش یک مزیته، یعنی شما وب سایت خودتون رو با لاراول بنویسید و یک خروجی دسکتاپ هم از وب سایتتون بگیرید!
نکته جالب تر، از اونجایی که فرانت کار با
Html, Css, Js هست شما میتونید از react یا vue هم استفاده کنید یا حتی bootstrap و tailwindcss.سعی کردم که یک تست ازش بگیرم، شروع به نصبش کردم و موقع اجرا با اروری برخورد کردم.
بعد از سرچ متوجه شدم که در حال حاظر فایل های باینری ایی برای ویندوز نداره و حتی روی لینوکس هم کار نمیکنه، وفعلا فقط روی مک کار میکنه درنتیجه باید منتظر موند.
در کل میتونه چیز جالبی باشه، البته که نه برای پروژه های بزرگ ولی در حد خروجی یک وب سایت اداری و حسابداری که نسخه دسکتابی هم داشته باشه.
بقیه مستندات رو از داکیمونت رسمیش بخونید.
و همینطور صفحه گیت هاب.
.
👍3
| AmirHossein |
فریم ورک nativephp که چیزی از انتشارش نگذشته و در حال حاظر نسخه آلفا هست. این فریم ورک برای توسعه اپلیکیشن های دسکتابی با استفاده از زبان php توسعه داده شده که واقعا میتونه چیز جالبی باشه. برای توسعه فرانت اپ های دسکتابی از Html, Css, Js استفاده می کنه و…
خب با مک بوک هم سعی کردم تست بکنم ولی باگ های زیادی فعلا داره و تقریبا بی استفاده هست.
در نتیجه به بحث دیزاین پترن ها ادامه میدیم تا ورژن های جدید تر بیاد.🤝
.
در نتیجه به بحث دیزاین پترن ها ادامه میدیم تا ورژن های جدید تر بیاد.🤝
.
#design_patterns
دیزاین پترن
فرض کنید که شما یک برنامهی پرداخت آنلاین برای یک فروشگاه آنلاین طراحی میکنید. فرآیند پرداخت شامل چند مرحله پیچیدهتر مثل ارتباط با سرور بانک، بررسی اعتبار کارت، ذخیره تراکنشها و ... است. به جای اینکه کلیه جزئیات پیچیده این فرآیند را در هر جای برنامه تکرار کنید، از دیزان پترن
مثال :
ابتدا یک کلاس
Transaction Successful
در این مثال، با استفاده از الگوی طراحی
.
دیزاین پترن
Facade یکی از الگوهای معماری نرمافزاری است که به انتزاع کردن یک رابط سادهتر برای دسترسی به ساب سیستم های پیچیدهتر کمک میکند. این الگو، واسطی سادهتر برای اجزای پیچیدهتر سیستم ایجاد میکند تا به کاربران اجازه دهد با سیستم برخورد کنند بدون اینکه جزئیات پیچیده را مد نظر قرار دهند.فرض کنید که شما یک برنامهی پرداخت آنلاین برای یک فروشگاه آنلاین طراحی میکنید. فرآیند پرداخت شامل چند مرحله پیچیدهتر مثل ارتباط با سرور بانک، بررسی اعتبار کارت، ذخیره تراکنشها و ... است. به جای اینکه کلیه جزئیات پیچیده این فرآیند را در هر جای برنامه تکرار کنید، از دیزان پترن
Facade استفاده میکنیم.مثال :
ابتدا یک کلاس
Facade برای فرآیند پرداخت ایجاد میکنیم که به عنوان واسط سادهتر با کاربران ارتباط برقرار میکند.class PaymentFacade {
private $paymentGateway;
private $transactionLogger;
public function __construct() {
$this->paymentGateway = new PaymentGateway();
$this->transactionLogger = new TransactionLogger();
}
public function processPayment($creditCard, $amount) {
// Communication with the bank server through PaymentGateway
$response = $this->paymentGateway->makePayment($creditCard, $amount);
// Register the transaction in the TransactionLogger
$this->transactionLogger->logTransaction($creditCard, $amount, $response);
return $response;
}
}
سپس برای هر یک از اجزای پیچیدهتر که در فرآیند پرداخت استفاده میشوند، یک کلاس را پیادهسازی میکنیم.class PaymentGateway {
public function makePayment($creditCard, $amount) {
// Connect to the bank server and make payment
return "Transaction Successful";
}
}
class TransactionLogger {
public function logTransaction($creditCard, $amount, $response) {
// Record the transaction in the database or log file
}
}
حالا میتوانیم در برنامهی خود از کلاس Facade استفاده کنیم و با استفاده از یک متد سادهتر فرآیند پرداخت را انجام دهیم.$paymentFacade = new PaymentFacade();Result:
$creditCard = '1234-5678-9012-3456';
$amount = 100;
$response = $paymentFacade->processPayment($creditCard, $amount);
echo $response;
Transaction Successful
در این مثال، با استفاده از الگوی طراحی
Facade، کار با فرآیند پرداخت به سادگی انجام میشود. تمام جزئیات پیچیدهتر مثل ارتباط با بانک و ثبت تراکنشها، در داخل کلاسهای جداگانه پنهان شده است. این کلاسها با هم ترکیب شدهاند تا یک رابط سادهتر را ارائه دهند که کاربر میتواند به راحتی از آن استفاده کند. این الگو مزیتهای افزودن اجزا و جداسازی اجزا را به برنامه میدهد..
👍2
#design_patterns
دیزان پترن
فرض کنید که شما یک کلاس برای ارسال ایمیل در برنامه خود دارید. این کلاس ممکن است نیاز به ارتباط با سرویسهای ارسال ایمیل مختلف داشته باشد، مانند ارسال ایمیل از طریق
مثال:
به جای اینکه کلاس ایمیل از خود به دلیل نیاز به سرویسهای ارسال ایمیل، این وابستگیها را بخود ایجاد کند، آنها به عنوان پارامترهایی از طریق کانستراکتور دریافت میکند.
ادامه در پست بعدی ...
.
دیزان پترن
Dependency Injection یکی از دیزان پترن های نرمافزاری است که به کاهش وابستگیها (Dependencies) در بین کلاسها کمک میکند. این الگو، از جمله اصول اصلی SOLID است که به عنوان یک راهنمای خوب برای طراحی کد قابلخواندن، قابلتغییر و قابلتست در نظر گرفته میشود.فرض کنید که شما یک کلاس برای ارسال ایمیل در برنامه خود دارید. این کلاس ممکن است نیاز به ارتباط با سرویسهای ارسال ایمیل مختلف داشته باشد، مانند ارسال ایمیل از طریق
SMTP یا از طریق API های خارجی. اما شما نمیخواهید که کلاس اصلی ایمیل وابستگی مستقیم به این سرویسها داشته باشد. بلکه میخواهید وابستگیها را به شکلی منعطف و از خارج کلاس تعریف کنید.مثال:
به جای اینکه کلاس ایمیل از خود به دلیل نیاز به سرویسهای ارسال ایمیل، این وابستگیها را بخود ایجاد کند، آنها به عنوان پارامترهایی از طریق کانستراکتور دریافت میکند.
class EmailSender {
private $mailer;
public function __construct(MailerInterface $mailer) {
$this->mailer = $mailer;
}
public function sendEmail($to, $subject, $body) {
// Send email using $this->mailer
// ...
}
}
ابتدا یک Interface برای سرویس ارسال ایمیل تعریف میکنیم که تمام کلاسهایی که میخواهیم از آنها استفاده کنیم، باید از این Interface ارثبری کنند.interface MailerInterface {
public function send($to, $subject, $body);
}
حالا میتوانیم کلاسهای مختلفی برای سرویسهای ارسال ایمیل ایجاد کنیم که از اینترفیس MailerInterface ارثبری میکنند.class SmtpMailer implements MailerInterface {
public function send($to, $subject, $body) {
// Send email via SMTP
}
}
class ExternalApiMailer implements MailerInterface {
public function send($to, $subject, $body) {
// Send email via external API
}
}
// etc. for other email delivery services
حالا میتوانیم در زمان ایجاد شئ ایمیل، یکی از سرویسهای ارسال ایمیل را به عنوان وابستگی تزریق کنیم.// Use SmtpMailerدر این مثال، با استفاده از دیزاین پترن
$smtpMailer = new SmtpMailer();
$emailSender = new EmailSender($smtpMailer);
$emailSender->sendEmail('user@example.com', 'Test Subject', 'Test Body');
// Use ExternalApiMailer
$externalApiMailer = new ExternalApiMailer();
$emailSender = new EmailSender($externalApiMailer);
$emailSender->sendEmail('user@example.com', 'Test Subject', 'Test Body');
Dependency Injection، کلاس ایمیل از خود وابستگی به سرویسهای ارسال ایمیل را حذف کرده است و به جای آن از پارامترهای تزریق شده از طریق کانستراکتور برای ارتباط با سرویسها استفاده میکند. این کار باعث میشود که کلاس ایمیل قابلتغییر و باز است و ما میتوانیم به راحتی سرویسهای دیگر را برای ارسال ایمیل به برنامه اضافه کنیم بدون نیاز به تغییر در کلاس ایمیل خود. همچنین، این الگو به ما کمک میکند که کلاسهایمان را قابلتست کنیم.ادامه در پست بعدی ...
.
#design_patterns
... ادامه پست قبلی
در مثال بالا با تزریق وابستگی ها از طریق کاستراکتور آشنا شدیم، اما راه های دیگری نیز وجود دارد. شامل:
1 -
در این روش، به جای تزریق وابستگیها از طریق کانستراکتور، از متدهای
2 -
در این روش، وابستگیها را به صورت آرگومانهای ورودی به متدها تزریق میکنیم.
3 -
در این روش، از یک کانتینر (
.
... ادامه پست قبلی
در مثال بالا با تزریق وابستگی ها از طریق کاستراکتور آشنا شدیم، اما راه های دیگری نیز وجود دارد. شامل:
1 -
Setter Injection :در این روش، به جای تزریق وابستگیها از طریق کانستراکتور، از متدهای
Setter کلاس استفاده میکنیم تا وابستگیها را تنظیم کنیم.class EmailSender {
private $mailer;
public function setMailer(MailerInterface $mailer) {
$this->mailer = $mailer;
}
public function sendEmail($to, $subject, $body) {
}
}
$smtpMailer = new SmtpMailer();
$emailSender = new EmailSender();
$emailSender->setMailer($smtpMailer);
$emailSender->sendEmail('user@example.com', 'Test Subject', 'Test Body');
————2 -
Method Injection :در این روش، وابستگیها را به صورت آرگومانهای ورودی به متدها تزریق میکنیم.
class EmailSender {
public function sendEmail($to, $subject, $body, MailerInterface $mailer) {
}
}
$smtpMailer = new SmtpMailer();
$emailSender = new EmailSender();
$emailSender->sendEmail('user@example.com', 'Test Subject', 'Test Body', $smtpMailer);
————3 -
Container (IoC) Injection :در این روش، از یک کانتینر (
Container) نرمافزاری برای ایجاد شئ ها و تزریق وابستگیها استفاده میشود. این کانتینر مسئول ایجاد و مدیریت شئ ها و تزریق وابستگیها به طور خودکار است.$container = new Container();تمام این روشها برای تزریق وابستگیها مناسب هستند و انتخاب بین آنها بستگی به نیازها و معماری کد شما دارد. استفاده از
$container->register('mailer', SmtpMailer::class);
$container->register('emailSender', EmailSender::class)->withArgument('mailer');
$emailSender = $container->get('emailSender');
$emailSender->sendEmail('user@example.com', 'Test Subject', 'Test Body');
Dependency Injection باعث کاهش وابستگیها و افزایش انعطافپذیری و قابلیت تست کد میشود..
👍2
#design_patterns
دیزاین پترن
فرض کنید که میخواهیم یک کلاس برای ساخت یک نوشیدنی دمنوش تعریف کنیم که از دو مرحله پیشتهیه (
مثال:
ابتدا این کلاس یک الگوریتم اصلی برای ساخت نوشیدنی دمنوش ارائه میدهد که شامل مراحل Prepare و Brew است.
Boiling water...
Steeping the tea...
Pouring into cup...
Adding lemon...
Boiling water...
Dripping coffee through filter...
Pouring into cup...
Adding sugar and milk...
در این مثال، با استفاده از دیزاین پترن
.
دیزاین پترن
Template Method یکی از الگوهای رفتاری است که در طراحی نرمافزارها مورد استفاده قرار میگیرد. این الگو به شما امکان میدهد یک چارچوب اصلی برای یک الگوریتم تعریف کنید که بخشهایی از آن را به کلاسهای زیرمجموعه خود میسپارید تا به صورت مستقل اجرا شوند. با این روش، تغییرات در الگوریتم اصلی به کلاسهای زیرمجموعه انتقال پیدا نمیکند و همچنین از دسترسی به متدهای مشترک و ارتباط موثر با آنها برخوردار خواهید بود.فرض کنید که میخواهیم یک کلاس برای ساخت یک نوشیدنی دمنوش تعریف کنیم که از دو مرحله پیشتهیه (
Prepare) و تهیه (Brew) تشکیل شده است. این کلاس باید اجازه دهد که بخشهایی از فرآیند دمنوشسازی توسط subclass ها (نمونهها) اجرا شوند.مثال:
ابتدا این کلاس یک الگوریتم اصلی برای ساخت نوشیدنی دمنوش ارائه میدهد که شامل مراحل Prepare و Brew است.
abstract class Beverageسپس
{
public function makeBeverage()
{
$this->boilWater();
$this->brew();
$this->pourInCup();
$this->addCondiments();
}
public function boilWater()
{
echo "Boiling water...\n";
}
public function pourInCup()
{
echo "Pouring into cup...\n";
}
// Methods required by subclasses must be defined here
abstract public function brew();
abstract public function addCondiments();
}
subclass ها با توجه به نوشیدنی موردنظر، متدهای brew و addCondiments را پیادهسازی میکنند.class Tea extends Beverageحالا میتوانیم از کلاسها و زیرکلاسهای آنها برای ساخت نوشیدنی دمنوش استفاده کنیم.
{
public function brew()
{
echo "Steeping the tea...\n";
}
public function addCondiments()
{
echo "Adding lemon...\n";
}
}
class Coffee extends Beverage
{
public function brew()
{
echo "Dripping coffee through filter...\n";
}
public function addCondiments()
{
echo "Adding sugar and milk...\n";
}
}
$tea = new Tea();Result:
$tea->makeBeverage();
Boiling water...
Steeping the tea...
Pouring into cup...
Adding lemon...
$coffee = new Coffee();Result:
$coffee->makeBeverage();
Boiling water...
Dripping coffee through filter...
Pouring into cup...
Adding sugar and milk...
در این مثال، با استفاده از دیزاین پترن
Template Method، یک چارچوب اصلی برای ساخت نوشیدنی دمنوش با مراحل مشترک boilWater و pourInCup تعریف کردیم و بخشهای خاص هر نوشیدنی را در subclass ها تعیین کردیم. این الگو باعث از دست رفتن تکرار کد، افزایش قابلیت توسعه و حفظ ساختار یکپارچهای در کلاسها میشود..
🔥1
#design_patterns
دیزاین پترن
فرض کنید که یک کلاس به نام MyList داریم که یک لیست از اشیاء را نمایش میدهد. برای دسترسی به عناصر لیست به صورت مرتب شده و به ترتیب، از الگوی طراحی
مثال:
این کلاس یک لیست از اشیاء را نگهداری میکند و اجازه دسترسی به اشیاء به ترتیب را از طریق
Item 0: Item 1
Item 1: Item 2
Item 2: Item 3
در این مثال، با استفاده از دیزاین پترن
.
دیزاین پترن
Iterator یکی از الگوهای رفتاری است که در طراحی نرمافزارها مورد استفاده قرار میگیرد. این الگو به شما امکان میدهد روشی را تعریف کنید تا از طریق آن بتوانید یک مجموعه از اشیاء را به ترتیبی مرتب کنید و به آنها به ترتیب دسترسی داشته باشید بدون اینکه نیاز به دستکاری یا اطلاع از ساختار داخلی مجموعه داشته باشید.فرض کنید که یک کلاس به نام MyList داریم که یک لیست از اشیاء را نمایش میدهد. برای دسترسی به عناصر لیست به صورت مرتب شده و به ترتیب، از الگوی طراحی
Iterator استفاده میکنیم.مثال:
این کلاس یک لیست از اشیاء را نگهداری میکند و اجازه دسترسی به اشیاء به ترتیب را از طریق
Iterator مرتبشده ارائه میدهد.class MyListIterator implements Iteratorحالا میتوانیم از کلاس
{
private $list;
private $index = 0;
public function __construct(MyList $list)
{
$this->list = $list;
}
public function rewind()
{
$this->index = 0;
}
public function valid()
{
return $this->index < count($this->list->getItems());
}
public function current()
{
return $this->list->getItems()[$this->index];
}
public function key()
{
return $this->index;
}
public function next()
{
$this->index++;
}
}
class MyList
{
private $items = [];
public function addItem($item)
{
$this->items[] = $item;
}
public function getItems()
{
return $this->items;
}
public function getIterator()
{
return new MyListIterator($this);
}
}
MyList برای دسترسی به اشیاء به ترتیب از طریق Iterator استفاده کنیم.$list = new MyList();Result:
$list->addItem('Item 1');
$list->addItem('Item 2');
$list->addItem('Item 3');
$iterator = $list->getIterator();
foreach ($iterator as $index => $item) {
echo "Item $index: $item\n";
}
Item 0: Item 1
Item 1: Item 2
Item 2: Item 3
در این مثال، با استفاده از دیزاین پترن
Iterator، یک Iterator به نام MyListIterator ایجاد کردیم که اجازه دسترسی به اشیاء لیست MyList را به ترتیب فراهم میآورد. این الگو باعث از دست رفتن وابستگیهای زیرکلاسها به لیست و مرتبسازی اشیاء میشود و اجازه دسترسی مستقل و ترتیبدار به عناصر لیست را فراهم میکند..
🔥2
خب مبحث دیزاین پترن ها اینجا تموم شد.
البته که تعداد دیزاین پترن ها خیلی بیشتر از این ۱۰ تا هست، ولی خب خودم زیاد کار نکردم که بخوام توضیحی بدم، در نتیجه این مبحث اینجا تموم میشه و احتمالا در آینده اگه فعالیتم ادامه پیدا کرد بازم توضیح میدم راجبشون.
ولی به عنوان مبحث بعدی قرار شد راجب انواع باگ های امنیتی و جلوگیری ازشون توضیح بدم.
تعداد باگ هایی که قراره توضیح بدم بیشتر از ۲۰ تا هست که طبیعتا زمان بره، ولی خب با هم پیش میریم.
فقط امیدوارم بخونید مطالب رو ...
.
البته که تعداد دیزاین پترن ها خیلی بیشتر از این ۱۰ تا هست، ولی خب خودم زیاد کار نکردم که بخوام توضیحی بدم، در نتیجه این مبحث اینجا تموم میشه و احتمالا در آینده اگه فعالیتم ادامه پیدا کرد بازم توضیح میدم راجبشون.
ولی به عنوان مبحث بعدی قرار شد راجب انواع باگ های امنیتی و جلوگیری ازشون توضیح بدم.
تعداد باگ هایی که قراره توضیح بدم بیشتر از ۲۰ تا هست که طبیعتا زمان بره، ولی خب با هم پیش میریم.
فقط امیدوارم بخونید مطالب رو ...
.
❤4
خب باگ هارو دسته بندی کردم و هر روز یکی از این دسته هارو توضیح میدم، مگر اینکه دسته بندی بزرگی باشه.
دسته بندی باگ ها به صورت زیر هست:
1-
دسته بندی باگ ها به صورت زیر هست:
1-
Injection Attacks
2- Cross-Site Attacks
3- Authentication and Session Management Vulnerabilities
4- Access Control and Data Exposure
5- Remote Code Execution (RCE)
6- Denial of Service (DoS) Attacks
7- Information Leakage
8- Business Logic Errors
9- Cryptographic Vulnerabilities
10- Privilege Escalation Vulnerabilities
11- Race Conditions
.🔥1
#security #bug
دسته بندی
این باگ یک نوع باگ امنیتی است که در وبسایتها و برنامههایی که با دیتابیس ها ارتباط برقرار میکنند، رخ میدهد. در این حمله، حملهکننده با وارد کردن کدهای مخرب به فیلدهای ورودی یا پارامترهای
مثال:
فرض کنید یک وبسایت دارای صفحهای است که کاربران میتوانند با وارد کردن نام کاربری خود، اطلاعات حساب کاربری خود را مشاهده کنند. وبسایت ممکن است از دیتابیسی استفاده کند که دارای جدولی با نام "
روش های جلوگیری:
1- استفاده از
2- برنامهنویسان باید ورودیها را با دقت فیلتر سازی و تقویت کنند. این کار شامل حذف و یا اسکیپ کردن کاراکترهای غیرمجاز است.
3- اطمینان حاصل کنید که کاربران و برنامهها فقط به سطح دسترسی لازم برای انجام کارهای خود دسترسی دارند.
4- اطلاعات خطا در وبسایتها نباید جزئیاتی از دیتابیس یا سیستم را فاش کند.
5- مطمئن شوید که نسخههای مورد استفاده از دیتابیس و کتابخانههای آن بهروز هستند.
.
دسته بندی
Injection Attacks
باگ SQL Injection یکی از معروف ترین باگ ها هست که احتمالا اسمش به گوشتون خورده.این باگ یک نوع باگ امنیتی است که در وبسایتها و برنامههایی که با دیتابیس ها ارتباط برقرار میکنند، رخ میدهد. در این حمله، حملهکننده با وارد کردن کدهای مخرب به فیلدهای ورودی یا پارامترهای
URL وبسایت، توانایی اجرای دستورات SQL مخرب را به دیتابیس مییابد. این کار میتواند منجر به دسترسی غیرمجاز به اطلاعات حساس، حذف دادهها یا انجام عملیاتهای خرابکارانه شود.مثال:
فرض کنید یک وبسایت دارای صفحهای است که کاربران میتوانند با وارد کردن نام کاربری خود، اطلاعات حساب کاربری خود را مشاهده کنند. وبسایت ممکن است از دیتابیسی استفاده کند که دارای جدولی با نام "
users" است. حالا فرض کنید کد PHP این صفحه به صورت زیر باشد:$username = $_POST['username'];حملهکننده میتواند در فیلد ورودی نام کاربری خود را وارد کند و در عین حال یک دستور
$query = "SELECT * FROM users WHERE username='$username'";
SQL مخرب به طور همزمان وارد کند. به عنوان مثال:' OR '1'='1' --پس از اجرای کوئری، دستور
SQL به شکل زیر تبدیل میشود:SELECT * FROM users WHERE username='' OR '1'='1' --'این دستور
SQL به معنی "انتخاب همه ردیفها از جدول کاربران (users) در صورتی که '1' برابر با '1' باشد" است. همچنین، بخش -- کامنت کننده باقیماندهی دستور SQL است و هر چیزی پس از آن نادیده گرفته میشود.روش های جلوگیری:
1- استفاده از
Prepared Statements میتواند از تزریقهای SQL جلوگیری کند. در Prepared Statements، جدا از دستور SQL اصلی، پارامترها به صورت جداگانه ارسال میشوند و در زمان اجرای کوئری جایگزین مقادیر ورودی میشوند.2- برنامهنویسان باید ورودیها را با دقت فیلتر سازی و تقویت کنند. این کار شامل حذف و یا اسکیپ کردن کاراکترهای غیرمجاز است.
3- اطمینان حاصل کنید که کاربران و برنامهها فقط به سطح دسترسی لازم برای انجام کارهای خود دسترسی دارند.
4- اطلاعات خطا در وبسایتها نباید جزئیاتی از دیتابیس یا سیستم را فاش کند.
5- مطمئن شوید که نسخههای مورد استفاده از دیتابیس و کتابخانههای آن بهروز هستند.
.
👍1