#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
#security #bug
دسته بندی
مثال :
فرض کنید یک برنامه وب با زبان
روش های جلوگیری:
1- همانند
2- برنامهنویسان باید ورودیها را با دقت فیلتر سازی و تقویت کنند. این کار شامل حذف و یا اسکیپ کردن کاراکترهای غیرمجاز است.
3- باید از تابعها و دستوراتی که میتوانند کدها را اجرا کنند، بهعنوان ورودی در برنامه استفاده نکنید.
4- اطمینان حاصل کنید که برنامهها فقط به فایلهای مورد نیاز دسترسی دارند و به فایلهای حساس و اجرایی دسترسی ندارند.
5- مطمئن شوید که برنامهها و کاربران فقط به کمترین دسترسی لازم برای انجام کارهای خود دسترسی دارند.
6- اطلاعات خطا در برنامهها نباید جزئیاتی از ساختار دیتابیس یا کدهای خطرناک را فاش کند.
.
دسته بندی
Injection Attacks
باگ Code Injection یک نوع باگ امنیتی است که در برنامهها و نرمافزارها رخ میدهد و اجازه میدهد که حملهکننده کد مخرب یا دستورات اجرایی را به طور غیرمجاز در برنامه اجرا کند. این حمله معمولاً به وسیلهی متغیرهای تزریقشده و ورودیهای ناامن به برنامه انجام میشود. با استفاده از Code Injection، حملهکننده میتواند برنامه را کنترل کرده و اطلاعات محرمانه را فاش کند، دستورات اجرایی را اجرا کند یا عملیاتهای خرابکارانه دیگر انجام دهد.مثال :
فرض کنید یک برنامه وب با زبان
PHP نوشته شده است و قصد دارد یک فایل متنی را با استفاده از نام فایل که کاربر وارد میکند، نمایش دهد. کد PHP به صورت زیر است:$filename = $_GET['filename'];حملهکننده میتواند نام فایل خود را به صورت کد اجرایی وارد کند تا اجرای کد مخرب را فراهم آورد. به عنوان مثال:
$file_contents = file_get_contents('/path/to/files/' . $filename);
echo $file_contents;
my_file.txt'; echo "Hello, I am an attacker!"; exit; //پس از اجرای برنامه، کد
PHP به شکل زیر تبدیل میشود:$filename = 'my_file.txt'; echo "Hello, I am an attacker!"; exit; //';این باعث اجرای کد مخرب
$file_contents = file_get_contents('/path/to/files/' . $filename);
echo $file_contents;
"Hello, I am an attacker!" میشود و برنامه به پایان میرسد.روش های جلوگیری:
1- همانند
SQL Injection، استفاده از Prepared Statements میتواند از تزریقهای کد و جلوگیری از Code Injection جلوگیری کند.2- برنامهنویسان باید ورودیها را با دقت فیلتر سازی و تقویت کنند. این کار شامل حذف و یا اسکیپ کردن کاراکترهای غیرمجاز است.
3- باید از تابعها و دستوراتی که میتوانند کدها را اجرا کنند، بهعنوان ورودی در برنامه استفاده نکنید.
4- اطمینان حاصل کنید که برنامهها فقط به فایلهای مورد نیاز دسترسی دارند و به فایلهای حساس و اجرایی دسترسی ندارند.
5- مطمئن شوید که برنامهها و کاربران فقط به کمترین دسترسی لازم برای انجام کارهای خود دسترسی دارند.
6- اطلاعات خطا در برنامهها نباید جزئیاتی از ساختار دیتابیس یا کدهای خطرناک را فاش کند.
.
👍3
#security #bug
دسته بندی
مثال :
فرض کنید یک برنامه وب با زبان
source_file:
روش های جلوگیری:
1- همانند
2- برنامهنویسان باید ورودیها را با دقت فیلتر سازی و تقویت کنند. این کار شامل حذف و یا اسکیپ کردن کاراکترهای غیرمجاز است.
3- از فراخوانیهای محدود یا محدودسازیشده که فقط اجازه فراخوانی دستورات سیستم مشخص را به برنامهها میدهد، استفاده کنید.
4- مطمئن شوید که برنامهها و کاربران فقط به کمترین دسترسی لازم برای انجام کارهای خود دسترسی دارند.
5- اطلاعات خطا در برنامهها نباید جزئیاتی از ساختار سیستم عامل یا کدهای خطرناک را فاش کند.
.
دسته بندی
Injection Attacks
باگ Command Injection یک نوع باگ امنیتی است که در برنامهها و نرمافزارها رخ میدهد و اجازه میدهد که حملهکننده دستورات سیستم عامل را به طور غیرمجاز در برنامه اجرا کند. این حمله معمولاً به وسیلهی متغیرهای تزریقشده و ورودیهای ناامن به برنامه انجام میشود. با استفاده از Command Injection، حملهکننده میتواند برنامه را کنترل کرده و اطلاعات محرمانه را فاش کند، دستورات سیستمی اجرا کند یا عملیاتهای خرابکارانه دیگر انجام دهد.مثال :
فرض کنید یک برنامه وب با زبان
PHP نوشته شده است که قصد دارد یک سیستم پشتیبانگیری را اجرا کند و فایلهای مورد نیاز را از یک مسیر خاص به مسیر دیگر کپی کند. کد PHP به صورت زیر است:$source_file = $_POST['source_file'];حملهکننده میتواند در فیلدهای ورودی، دستورات سیستم عامل را به صورت تزریقشده وارد کند. به عنوان مثال:
$destination_path = $_POST['destination_path'];
$command = "cp $source_file $destination_path";
$output = shell_exec($command);
echo "File copied successfully.";
source_file:
/etc/passwd
destination_path: /var/www/html/
پس از اجرای برنامه، دستورات سیستم عامل به شکل زیر تبدیل میشود:cp /etc/passwd /var/www/html/این دستور کپی فایل /
etc/passwd (که یک فایل حاوی اطلاعات حسابهای کاربری سیستم است) به مسیر /var/www/html/ اجرا میشود و حملهکننده ممکن است به اطلاعات حسابهای کاربری سیستم دسترسی پیدا کند.روش های جلوگیری:
1- همانند
SQL Injection و Code Injection، استفاده از Prepared Statements میتواند از تزریقهای دستور سیستم عامل جلوگیری کند.2- برنامهنویسان باید ورودیها را با دقت فیلتر سازی و تقویت کنند. این کار شامل حذف و یا اسکیپ کردن کاراکترهای غیرمجاز است.
3- از فراخوانیهای محدود یا محدودسازیشده که فقط اجازه فراخوانی دستورات سیستم مشخص را به برنامهها میدهد، استفاده کنید.
4- مطمئن شوید که برنامهها و کاربران فقط به کمترین دسترسی لازم برای انجام کارهای خود دسترسی دارند.
5- اطلاعات خطا در برنامهها نباید جزئیاتی از ساختار سیستم عامل یا کدهای خطرناک را فاش کند.
.
🔥1
#security #bug
دسته بندی
مثال:
فرض کنید یک وبسرویس با فرمت
روش های جلوگیری:
1- تعیین پارامتر
3- همانند سایر باگهای امنیتی، اعتبارسنجی دقیق ورودیها و فیلتر سازی آنها برای جلوگیری از درج موجودیتهای خارجی ضروری است.
4- استفاده از کتابخانهها و ابزارهایی که امکان تشخیص و جلوگیری از
.
دسته بندی
Injection Attacks
باگ XML External Entity (XXE) Injection یک نوع باگ امنیتی است که در برنامهها و سیستمهایی که با فرمت XML کار میکنند، رخ میدهد. در این حمله، حملهکننده با درج موجودیتهای خارجی (External Entity) در فایلهای XML، توانایی اجرای کدها و دستورات سیستمی را به طور غیرمجاز به برنامه میدهد. این کار میتواند منجر به دسترسی به فایلها و منابع حساس، اجرای دستورات سیستمی، یا نقض حریم خصوصی وبسرویسها شود.مثال:
فرض کنید یک وبسرویس با فرمت
XML برای پردازش درخواستها ایجاد شده است. درخواستها از کلاینتها به صورت یک فایل XML ارسال میشوند و سپس وبسرویس اطلاعات مورد نیاز را از فایل XML استخراج میکند. کد PHP وبسرویس به صورت زیر است:$xml = $_POST['xml'];حملهکننده میتواند در فایل
$dom = new DOMDocument();
$dom->loadXML($xml);
$data = simplexml_import_dom($dom);
$username = $data->username;
$password = $data->password;
// ...
XML خود موجودیتهای خارجی (External Entity) را درج کند و از طریق آنها تلاش کند به فایلهای سرور دسترسی پیدا کند. به عنوان مثال:<?xml version="1.0" encoding="UTF-8"?>وقتی وبسرویس این فایل
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM "file:///etc/passwd">]>
<user>
<username>&xxe;</username>
<password>malicious_password</password>
</user>
XML را پردازش میکند، موجودیتهای خارجی باعث میشود که محتوای فایل /etc/passwd (که شامل اطلاعات حسابهای کاربری سیستم است) به جای &xxe; در فیلد username قرار گیرد. در نتیجه، محتوای فایل /etc/passwd به عنوان نام کاربری دریافت میشود و این اطلاعات محرمانه نمایش داده میشود.روش های جلوگیری:
1- تعیین پارامتر
LIBXML_NOENT در زمان پردازش XML برای غیرفعالسازی خودکار موجودیتهای خارجی.libxml_disable_entity_loader(true);2- بهجای دریافت
XML از ورودی کاربران، بهتر است کاربران فایل XML را آپلود کنند و برنامه از مسیر فایل آپلود شده XML استفاده کند.3- همانند سایر باگهای امنیتی، اعتبارسنجی دقیق ورودیها و فیلتر سازی آنها برای جلوگیری از درج موجودیتهای خارجی ضروری است.
4- استفاده از کتابخانهها و ابزارهایی که امکان تشخیص و جلوگیری از
XXE را فراهم میآورند..
#security #bug
دسته بندی
مثال:
فرض کنید یک وبسایت دارای صفحهای است که کاربران میتوانند نظرات خود را ارسال کنند و این نظرات در صفحه نمایش داده میشوند. صفحه
روش های جلوگیری:
1- برنامهنویسان باید ورودیها را با دقت فیلترسازی و تقویت کنند. این کار شامل حذف و یا اسکیپ کردن کدهای خطرناک است.
2- همواره برای نمایش مقادیر متغیرها در صفحات
3- استفاده از کتابخانه ها مانند
4- اعتبارسنجی دقیق اجازهها و محدودیتهایی را برای منابع اجرایی (
5- اجازه دسترسی به کوکیها را به دامنههای مشخص محدود کنید تا از کلاهبرداری کوکی جلوگیری شود.
6- برای کوکیهایی که توسط جاوااسکریپت به دسترسی نیاز ندارند، از
.
دسته بندی
Cross-Site Attacks
باگ Cross-Site Scripting (XSS) یک نوع باگ امنیتی است که در برنامههای وب رخ میدهد. در XSS، حملهکننده با درج کدهای مخرب یا اسکریپتها در صفحات وب، میتواند اجرای این کدها را بر روی مرورگر کاربران دیگر فراهم کند. این کار میتواند منجر به دزدیدن کوکیها، اطلاعات حساب کاربری و حتی اجرای دستورات مخرب بر روی دستگاه کاربران شود.مثال:
فرض کنید یک وبسایت دارای صفحهای است که کاربران میتوانند نظرات خود را ارسال کنند و این نظرات در صفحه نمایش داده میشوند. صفحه
HTML به صورت زیر است:<body>حملهکننده میتواند کد
<h1>Comments</h1>
<div id="comments">
<?php
$comment = $_POST['comment'];
echo $comment;
?>
</div>
<form action="" method="post">
<textarea name="comment"></textarea>
<br>
<input type="submit" value="Submit">
</form>
</body>
XSS را در فیلد نظرات وارد کند. به عنوان مثال:<noscript>وقتی کاربر دیگری صفحه را باز میکند و این نظر را مشاهده میکند، اسکریپت ناامن اجرا میشود و یک پیغام هشدار نمایش داده میشود.
alert('You have been hacked!');
</noscript>
روش های جلوگیری:
1- برنامهنویسان باید ورودیها را با دقت فیلترسازی و تقویت کنند. این کار شامل حذف و یا اسکیپ کردن کدهای خطرناک است.
2- همواره برای نمایش مقادیر متغیرها در صفحات
HTML از نقلقول دوگانه استفاده کنید.3- استفاده از کتابخانه ها مانند
HTML Purifier که یک کتابخانه PHP است که از HTML ناامن و ویژگیهای خطرناک جلوگیری میکند و امنیت نمایش محتوا را تضمین میکند.می توانید برای زبان های دیگر جست و جو کنید و با ما به اشتراک بگزارید.4- اعتبارسنجی دقیق اجازهها و محدودیتهایی را برای منابع اجرایی (
noscripts, stylesheets و غیره) در صفحات HTML مشخص میکند.5- اجازه دسترسی به کوکیها را به دامنههای مشخص محدود کنید تا از کلاهبرداری کوکی جلوگیری شود.
6- برای کوکیهایی که توسط جاوااسکریپت به دسترسی نیاز ندارند، از
HTTP Only Flag استفاده کنید. همچنین برای کوکیهایی که باید از طریق ارتباط امن انتقال یابند، از Secure Flag استفاده کنید..
👍1🔥1
#security #bug
دسته بندی
مثال:
فرض کنید یک برنامه وب وجود دارد که کاربران میتوانند با استفاده از فرمی مبلغی را به حساب خود اضافه کنند. کد
روش های جلوگیری:
1- اضافه کردن یک توکن
2- بررسی
3- اجازه دسترسی به کوکیها تنها به دامنههای مشخص داده شود.
4- فقط از متود
.
دسته بندی
Cross-Site Attacks
باگ Cross-Site Request Forgery (CSRF) یک نوع باگ امنیتی است که در برنامهها و وبسایتها رخ میدهد. در CSRF، حملهکننده با استفاده از اجرای برخی از درخواستها از طریق کاربران، عملیاتهای خطرناک را با اجازهی کاربر اجرا میکند. به عبارت دیگر، کاربر در وبسایتی وارد شده است که مخرب است و بدون اطلاع از آن، عملیاتهای خطرناک را در سایتها و برنامهها دیگر اجرا میکند.مثال:
فرض کنید یک برنامه وب وجود دارد که کاربران میتوانند با استفاده از فرمی مبلغی را به حساب خود اضافه کنند. کد
PHP به صورت زیر است:<?phpحملهکننده میتواند یک صفحه مخرب (مثلاً با نام
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$amount = $_POST['amount'];
$user_id = $_SESSION['user_id'];
// Add amount to user account
}
?>
<!DOCTYPE html>
<html>
<head>
<noscript>Account Page</noscript>
</head>
<body>
<h1>Welcome, User!</h1>
<form action="" method="post">
<label for="amount">Amount:</label>
<input type="text" name="amount" id="amount">
<input type="submit" value="Add">
</form>
</body>
</html>
csrf.html) ایجاد کند و کد مخرب زیر را در آن قرار دهد:<html>وقتی کاربری که وارد برنامهی مخرب حملهکننده شده است، از طریق مرورگر به صفحه
<body>
<form action="http://victim-website.com" method="post">
<input type="hidden" name="amount" value="1000">
</form>
<noscript>
document.forms[0].submit();
</noscript>
</body>
</html>
csrf.html میرود، این صفحه یک درخواست POST به آدرس victim-website.com ارسال میکند و مبلغ 1000 به حساب کاربر در این وبسایت اضافه میشود.روش های جلوگیری:
1- اضافه کردن یک توکن
CSRF به فرمها تا اطمینان حاصل شود که درخواستها توسط خود کاربر ارسال میشوند و نه از طریق حملهکننده.2- بررسی
Referer Header که نشان میدهد از کدام سایت درخواست ارسال شده است. اگر نشاندهنده سایت خارجی باشد، درخواست رد شود.3- اجازه دسترسی به کوکیها تنها به دامنههای مشخص داده شود.
4- فقط از متود
POST برای عملیاتهایی که تغییرهای حسابهای کاربری میآورند، استفاده کنید..