<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهدی مومنی</title>
        <link>https://virgool.io/feed/@mehdee81</link>
        <description>مهدی مومنی هستم علاقه مند به برنامه نویسی وب ، بیشتر از دو سال که python و django کار می کنم و دوست دارم چیز هایی که یاد میگیرم را با بقیه به اشتراک بزارم ....  وبسایت شخصی من https://mahdimomeni.ir</description>
        <language>fa</language>
        <pubDate>2026-04-14 22:18:02</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/756872/avatar/dHzrOX.jpeg?height=120&amp;width=120</url>
            <title>مهدی مومنی</title>
            <link>https://virgool.io/@mehdee81</link>
        </image>

                    <item>
                <title>استفاده از jwt در django Rest Framework</title>
                <link>https://virgool.io/@mehdee81/%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-jwt-%D8%AF%D8%B1-django-rest-framework-motskga2qnxd</link>
                <description>به نام خدا django jwt authenticationسریع بریم سر اصل مطلب.ما از JWT یا json web token برای Authentication استفاده میکنیم تا هرکسی نتونه به api ما دسترسی پیدا کنه .خب من یه پروژه جنگو دارم که داخلش از rest framework استفاده کردم .برای اینکه به view هامون پرمیشن بدیم و اجازه ندیم هیچکس بدون Authenticate ازش استفاده کنه کافیه که ماژول IsAuthenticated رو به صورت زیر در فایل view ایمپورت کنیم from rest_framework.permissions import IsAuthenticatedو حالا درست یک خط بعد از class هامون permission_classes = [IsAuthenticated] رو اضافه میکنیم تا اگه کاربر لاگین نکرده بود بقیه کد ها اجرا نشوند .حالا میریم سراغ نصب jwt در جنگو : کافیه متن زیر رو داخل ترمینال اجرا کنید pip install djangorestframework_simplejwtحالا این اپ رو به قسمت installed app داخل ستینگ پروژه اضافه میکنیم &#x27;rest_framework_simplejwt&#x27;و کد زیر رو توی ستینگ پروژه اضافه میکنیم تا شیوه اتنتیکیت ما jwt باشه : REST_FRAMEWORK = {
&#039;DEFAULT_AUTHENTICATION_CLASSES&#039;: (
&#039;rest_framework_simplejwt.authentication.JWTAuthentication&#039;,
)
}حالا وارد قسمت urls میشویم و ماژول های زیر رو ایمپورت میکنیم :from rest_framework_simplejwt.views import (
TokenObtainPairView,
TokenRefreshView,
)و کد های زیر رو توی قسمت urlpatterns مینویسیم :path(&#039;token/&#039;, TokenObtainPairView.as_view(), name=&#039;token_obtain_pair&#039;),
path(&#039;token/refresh/&#039;, TokenRefreshView.as_view(), name=&#039;token_refresh&#039;),حالا وقتی وارد مصیر token  بشیم  از ما یک username و password میخواد که با وارد کردن یوزرنیم و پسورد یک کاربر میتوانیم دوتا token یکی برای access و یکی برای refresh بگیریم استفاده از access token : چون من من سوپریوزر پروژم admin و پسوردشم admin هست و یوزر دیگه ای ندارم از همین به عنوان یوزرنیم و پسورد استفاده میکنم  .وقتی یوزرنیم و پسورد رو وارد کنیم به ما دوتا توکن میده که یکیش access و یکیش refresh هست توکن access بعد از یه مدت کوتاه فکر کنم 5 دقیقه expire میشه و با توکن refresh میتونیم اون رو تمدید کنیم jwt django tokenدر تصویر بالا من از توکن استفاده نکردم و همونطور که میبینید اجازه مشاهده دیتاهارو به من ندادهحالا برای استفاده از توکن access من از postman استفاده میکنمدامنه رو داخل postman وارد میکنیم و در قسمت header یک کلید Authorization میدهیم و مقدار آن را با Bearer Token پر میکنیمبرای مثالBearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjc2Mzg1MjIzLCJpYXQiOjE2NzYzODQ5MjMsImp0aSI6IjZjMDkzNGYzZWM0ZDQ4MTJhMGUxMjg5NzI4NzQzZDFmIiwidXNlcl9pZCI6MX0.nYqX0ZcSY4sCy9YPIxOXTFeV0vCkYJjggvbOi1B6ZWo jwt django tokenحالا در تصویر دوم میبینید که من داخل headers در پستمن توکن رو ارسال کردم و دیتاهارو بهم نشون داده .ساخت token جدید با پست من(postman) :لینک رو با متد پست ارسال میکنیمو داخل قسمت body یوزرنیم و پسورد رو وارد میکنیممنبع : https://django-rest-framework-simplejwt.readthedocs.io/en/latest/getting_started.html</description>
                <category>مهدی مومنی</category>
                <author>مهدی مومنی</author>
                <pubDate>Tue, 14 Feb 2023 19:00:04 +0330</pubDate>
            </item>
                    <item>
                <title>پایگاه داده و امنیت آن : Database - Database Security</title>
                <link>https://virgool.io/@mehdee81/%D9%BE%D8%A7%DB%8C%DA%AF%D8%A7%D9%87-%D8%AF%D8%A7%D8%AF%D9%87-%D9%88-%D8%A7%D9%85%D9%86%DB%8C%D8%AA-%D8%A2%D9%86-database-database-security-gq46g0ozqisu</link>
                <description>به نام خدا ......اصلا Database یا پایگاه داده یا بانک اطلاعاتی چیه ؟!...پایگاه داده مجموعه ای منظم و سازمان یافته از داده‌ه (اطلاعات) ذخیره شده  الکترونیکی از سیستم رایانه ای است. در جایی که پایگاه داده‌ها پیچیده‌تر هستند، آنها اغلب با استفاده از تکنیک‌های طراحی رسمی و مدل‌سازی توسعه می‌یابند .( تکنیک های مدلسازی داده یا Data modelling : یک مدل داده معمولاً شبیه دیاگرامی است که بوسیله توصیف­های متنی پشتیبانی می­شود. این مدل اجزائی را که برای کسب و کار مهم هستند (مانند افراد، مکان­ها، چیزها و تبادلات کسب و کار)، ویژگی­های مرتبط با آنها و روابط مهم میان آنها را بصورت تصویری به نمایش می­ گذارد. مدل­های داده بطور گسترده­ ای هم در استخراج و تحلیل و طراحی الزامات و هم برای پشتیبانی از اجرا و بهبود مستمر بکار گرفته می­شوند. )اصلا بیاید ببینیم داده ( Data ) یعنی چی !...به طور کلی همه دانسته‌ها، آگاهی‌ها، داشته‌ها، آمارها، شناسه‌ها، پیشینه‌ ها و پنداشته‌ها داده که به انگلیسی معادل کلمه Data هست محسوب می‌شود.به اعداد، حروف و علائم که جهت درک و فهم مشترک از انسان‌ها یا رایانه سرچشمه می‌گیرند داده می‌گویند( مثلا اسم یک شخص یک داده محسوب می شود ) داده‌ها معمولاً از سوی انسان‌ها به صورت حروف، اعداد، علائم و در رایانه به صورت نمادهایی (همان رمزهای صفر و یک) قراردادی ارائه می‌شوند.انواع پایگاه داده (Database)پایگاه داده رابطه‌ایپایگاه داده NoSQLپایگاه داده مبتنی بر فضای ابریپایگاه داده ستونیپایگاه داده ستون گستردهپایگاه داده شی‌گراپایگاه داده کلید مقدارپایگاه داده سلسله مراتبیپایگاه داده گرافیپایگاه داده سری زمانیبه اختصار چندتا از انواع پایگاه داده را توضیح می دهیم :پایگاه داده رابطه ای :Relational Database پایگاه داده‌های رابطه‌‌ای از دهه ۱۹۷۰ تا به امروز مورد استفاده قرار می‌گیرند. پایگاه داده رابطه‌ای روشی است که در آن داده‌ها در چندین جدول مرتبط ذخیره می‌شوند. درون این جدول‌ها، داده‌ها در سطرها و ستون‌های مختلف قرار دارند. سیستم مدیریت پایگاه داده رابطه‌ای (RDBMS) یک برنامه است که به واسطه آن، امکان ایجاد، به‌روزرسانی و مدیریت پایگاه داده رابطه‌ای فراهم می‌شود.زبان پرس و جو ساختاریافته (Structured Query Language | SQL) رایج‌ ترین زبان برای خواندن، ایجاد، به‌روز‌رسانی و حذف داده‌ها است. پایگاه داده‌ رابطه‌ای بسیار قابل اعتماد است و در آن‌، از استاندارد ACID پیروی می‌شود. منظور از ACID مجموعه‌ای از استانداردها است که با کمک آن‌ها، تراکنش‌های پایگاه داده قابل‌اعتماد خواهند شد. واژه ACID از مفاهیمی همچون اتمی بودن (Atomicity)، سازگاری (Consistency)، جداسازی (Isolation) و دوام (Durability) برگرفته شده است.از جمله مثال‌های پایگاه داده رابطه‌ای می‌توان به Microsoft SQL Server، پایگاه داده اوراکل، MySQL، پایگاه داده PostgreSQL و IBM Db2 اشاره کرد .پایگاه داده NoSQL : پایگاه داده NoSQLپایگاه های داده NoSQL داده ها را در اسناد به جای جداول رابطه ای ذخیره می کنند .بر این اساس، ما آنها را به عنوان &quot;نه تنها SQL&quot; طبقه بندی می کنیم و آنها را بر اساس انواع مدل های داده انعطاف پذیر تقسیم می کنیم .انواع پایگاه‌های داده NoSQL شامل پایگاه‌های داده اسناد خالص، فروشگاه‌های ارزش کلیدی، پایگاه‌های داده با ستون گسترده است . و پایگاه های داده گراف پایگاه های داده NoSQL از ابتدا برای ذخیره و پردازش حجم وسیعی از داده ها در مقیاس های خیلی بزرگ ساخته شده اند و تعداد رو به رشدی از مشاغل مدرن را پشتیبانی می کنند.RDBMS : Relational Database Management Systemسیستم مدیریت پایگاه داده رابطه ایبیاید بریم سراغ زبان SQL ببینیم اصلا چیه !...در مدل رابطه‌ای داده‌ها، زبان پرسمان ساخت‌یافته (به انگلیسی: Structured Query Language) با کوته‌نوشت SQL نوعی زبان خاص دامنه در برنامه‌نویسی است که برای مدیریت داده‌های نگهداری‌شده در سیستم مدیریت پایگاه‌داده رابطه‌ای (RDBMS) یا برای پردازش‌های جریانی در سیستم مدیریت جریان داده رابطه‌ای (RDSMS) طراحی شده‌است .این زبان مخصوصاً برای رسیدگی به داده ساخت‌یافته مفید می‌باشد (یعنی داده‌ای که رابطه بین موجودیت‌ها و متغیرها را در خود گنجانده‌است) .اس کیو ال ( SQL ) دو مزیت اصلی نسبت به رابط‌های کاربردی خواندن-نوشتن قدیمی تر مثل ISAM یا VSAM دارد ، اولا SQL مفهوم دسترسی به چندین رکورد با یک دستور منفرد را معرفی کرده‌است، و دوما SQL نیاز به تعیین آنکه «چگونه» باید به یک رکورد رسید را حذف نموده‌است .واژه‌های کلیدی اس‌کیوال به گروه‌های مختلفی تقسیم می‌گردد، در زیر به برخی از آن‌ها اشاره می‌کنیم آن‌هایی که آشنا تر هستند را تنها با یک مثال شرح می‌دهیم:دستور بازیابی داده‌ها: SELECTدستورهای عملیات داده‌ها: INSERT,UPDATE,MERGE,TRUNCAT, DELETEدستورهای تراکنش داده‌ها: COMMIT و ROLLBACKدستورهای تعریف داده‌ها: CREATE وDROPدستورهای کنترل داده‌ها: GRANT و REVOKEمثالی برای دستور های SQL :با دستور پایین یک یا چند داده را از جدول table_name پیدا میکنیم :SELECT column1, column2, ...FROM table_name;با دستور زیر چند داده را به یک سطر از جدول table_name اضافه میکنیم :INSERT INTO table_name (column1, column2, column3, ...)VALUES (value1, value2, value3, ...);با دستور زیر یک سطر از جدول table_name  را با شرط condition حذف میکنیم :DELETE FROM table_name WHERE condition;امنیت پایگاه داده !!!واژه «امن» یعنی بی گزند و بی آسیب و دارای آرامش. امنیت هم یعنی بی گزندی و بی آسیبی یا حالتی که در آن گزند و خطر و آسیب راه ندارد و آرامش در آن برقرار است.همانطور که از معنای واژه امنیت پیداست ، ما باید کار هایی انجام دهیم تا اطلاعات یا داده های ما که به منزله با ارزش ترین سرمایه های هر سازمانی تلقی میشود در امان بماند .اما برای اینکار ما نیاز داریم تا اول راه های نفوذ به پایگاه داده و روش های سرقت داده ها را بشناسیم .اما اشتباه نکنید همیشه انسان ها نیستند که پایگاه داده ی مارا به خطر می اندازند  :ما علاوه بر بستن راه نفوذ گران باید به دنبال راه هایی برای پشتیبانی گیری از داده های خود باشیمزیرا سخت افزار و وسیله برقی هر لحظه احتمال خراب شدن و نابودی را دارد که با نابودی شرکت یا سازمان برابر است .پس بهتر است که در دوره های کوتاه مدت از داده های خود پشتیبان گیری کنیم .چرا امنیت پایگاه داده مهم است ؟تمام دارایی یک سازمان داده های آن است که معموال در پایگاه داده ذخیره می شوند( اطالعات حساب های بانکی ) اطالعات کارت اعتباری (  اطالعات شخصی )همچون نام، آدرس، شماره تلفن  آدرس ایمیل ، نام کاربری و کلمه عبورنقض امنیت داده های یک سازمان ممکن است پیامدهای جبران ناپذیری را برای آن سازمان به بار آورد.امینت پایگاه داده عبارت است از :جلوگیری از افشای غیرمجاز دادهجلوگیری از تغییر غیرمجاز دادهحفظ اطالعات و پایداری پایگاه دادهبرخی از روش های نفوذ به اپلیکیشن و دیتابیس (تهدیدات دیتابیس):1 - فیشینگ (Phishing) یا مهندسی اجتماعی :phishingفیشینگ نوعی حمله مهندسی اجتماعی است که عموماً از طریق ایمیل و با هدف سرقت اطلاعات ورود به سیستم و سایر اطلاعات حساس مانند اطلاعات کارت اعتباری برای سرقت هویت افراد انجام می شود.یکی از ویژگیهای قابل توجه فیشینگ، عنصر سورپرایز است! این ایمیلها زمانی دریافت می شوند که قربانی انتظارش را ندارد. مهاجمان می توانند ایمیل ها را زمانبندی کنند تا قربانیان در شرایط حواس پرتی با چیزهای دیگر  مانند کار، آنها را دریافت کنند. تمرکز و توجه دائمی به ایمیل های مشکوک غیرممکن است و کلاهبرداران این را خوب می دانند.نفوذگر میتواند با سرقت اطلاعات ادمین یا مدیر سازمان وارد دیتابیس شود و اطلاعات را سرقت کند .2 - حملات انکار سرویس (DDoS) :حملات DOSو DDOSیکی از خطرناک ترین و جدیدترین حملاتی است که در بستر اینترنت انجام می‌شود. DDOS مخفف چیست؟ کلمه DDOSمخفف عبارت Distributed Denial of Service است و هدف از این حملات خراب کردن سرویس مورد نظر نیست بلکه شبکه و سرور مورد نظر را وادار به ناتوانی در ارائه سرویس عادی با هدف قرار دادن پهنای باند شبکه یا اتصال پذیری می‌نماید. این حملات با ارسال بسته‌های داده به قربانی انجام می‌شود که شبکه یا ظرفیت پردازشی قربانی را غرق در بسته‌های اطلاعاتی می‌کند و مانع دستیابی کاربران و مشتریان به سرویس می‌شود.3 - تزریق کد اس کیو ال SQL Injection :SQL Injectionحمله SQL Injection روشی است که به هکر اجازه می‌دهد از طریق حفره‌های امنیتی در لایه دیتابیس یک نرم‌افزار نفوذ کند. معمولن این نوع حمله روی صفحات وب و از طریق تزریق کدهای مخرب به پایگاه داده رخ می‌دهد. به‌عنوان مثال هکر می‌تواند در زمان پر کردن فیلدهای یک فرم روی یک وب‌سایت، به جای نام، از یک Query استفاده و آن را ثبت و به سمت SQL ارسال کند تا بتواند پاسخ مورد نظرش را از دیتابیس دریافت و دسترسی‌های غیرمجاز را به داده‌های موجود به‌دست بیاورد.اولین قدم در حمله که یافتن وب‌سایت آسیب‌پذیر است، بیش‌ترین زمان را از هکر می‌گیرد. از زمانی که این حفره امنیتی روی پایگاه داده SQL شناسایی شده است، بیش‌تر وب‌سایت‌ها تمهیداتی برای مصون نگه‌داشتن خود در مقابل این حمله‌ی سایبری در نظر گرفته‌اند که کار مهاجم را دشوارتر کرده است.4 - حملات اسکریپت نویسی بین سایتی (XSS) : XSS attackحمله XSS یا Cross Site Scripting یکی از رایج‌ترین حمله‌های سایبری تحت‌وب است که در میان انواع حملات وب در جایگاه بالایی قرار دارد. مخفف این عبارت CSS است اما برای آنکه با زبان برنامه‌نویسی اشتباه گرفته نشود به آن XSS گویند. روش حمله از طریق تزریق کدهای مخرب به صفحه‌ی وب قربانی و اجرای این کدهای جاوا اسکریپت توسط مرورگر است که در نهایت منجر به دسترسی غیرمجاز به اطلاعاتی مثل مشخصات کاربری یا اطلاعات حساب قربانی خواهد شد.پرکاربردترین روش نفوذ، افزودن کدهای مخرب به انتهای URL است که با کلیک بر روی لینک‌های مختلف توسط کاربر اجرا می‌شود. همچنین هکر با دسترسی به دیتابیس وب‌سایت و قرار دادن اسکریپت، امکان آلوده‌کردن صفحه‌ی وب را در مقیاسی بزرگ‌تر دارد.5 - حملات بروت فورس Brute Force :Brute Forceحمله Brute Force  تلاشی برای شکستن رمز عبور، یافتن نام کاربری، یافتن یک صفحه وب پنهان یا یافتن کلید مورد استفاده برای رمزگذاری پیام با استفاده از یک روش آزمون و خطا و بررسی تمام حالات ممکن است. این روش به میزان زیادی از امیدواری نیز نیاز دارد تا در نهایت رمز عبور را به‌درستی حدس زده شود. Brute force حمله‌ای قدیمی اما هم‌چنان محبوب و موثر است.6 - سرقت کوکی ها Cookie theft :نوعی حمله هکری است که طی  آن نفوذگر دسترسی غیرمجاز به اطلاعاتی محرمانه به شیوه ای تسهیل نشده توسط کاربر و یا به session های غیرایمن دست پیدا می کند. برخی روش‌های کنترل امنیت اطلاعات پایگاه داده :کنترل دسترسیرهگیری پایگاه داده (Database auditing)اصالت سنجیرمزگذارییکپارچگی دادهفرایند پشتیبان گیریامنیت نرم افزار (Application security)بررسی حمله SQL injection :حمله SQL Injection یا تزریق کد اس کیو ال از معروف ترین روش های تست نفوز به وب اپلیکیشن ها است :هدف از انجام این نوع تست نفوذ ، دستیابی مستقیم به رکورد های داخل پایگاه داده است . برای اینکه عملیات SQL Injection به درستی عمل کند، بدیهی است که اولین گام، تشخیص آن است. برای انجام ایـن کـار، نفوذگر ابتدا باید بعضی انواع از نشانه هایی که دلالت بر وجود خطاها در سیستم است، ایجاد کند . اگرچه، پیام های خطا خودشان نمایش داده نمی شوند، application باید توانایی جدا کردن صحیح (یک درخواست صحیح) را از باطل (یک درخواست غیرمعتبر) داشته باشد و نفوذگر به راحتی می آموزد که چطور این آثار را بشناسد، خطاها را پیدا کند و تشخیص دهد آیا آنها به SQL مربوط می باشند یا خیر .بحث Error handling یا رسیدگی به خطاها باعث می شود که خیلی از خطا های نرم افزار با روشی که برنامه نویس تعین میکند نمایش داده شود و این امر باعث میشود نفوذگر فرایند سخت تری را در پیش بگیرد .کنترل های امنیتی پایگاه داده  :مرحله اول: مشخص نمودن خط مشی امنیتی سازمان مشخص شدن خط مشی امنیتی سیستم اطالعاتی مشخص کردن نحوه ی کنترل کاربران مرحله دوم: تعیین کنترل های امنیتی مورد نیاز اقدامات امنیتی پیشگیرانه اقدامات امنیتی تشخیص اقدامات امنیتی جرم شناسیمشخص نمودن خط مشی امنیتی سازمان :خط مشی امنیتی سازمانمشخص کردن خط مشی امنیتی : • مشخص کردن اطالعاتی که نیاز به محافظت دارند • دسته بندی اطالعات براساس اهمیت آن ها • شناسایی تهدیدات • ارزیابی ریسک • تعریف نقش های کاربران پایگاه داده • تعریف حساب های کاربرای بر اساس نقش ها وکاربران • تخصیص مجوزهای دسترسی به آنها با توجه به نیاز آنها• بازبینی نقش ها و مجوزهای دسترسی به طور مداوم برای اطمینان از مناسب بودن آنها با توجه به شرایط فعلی پس از اعمال هر گونه تغییر در سازمان•تعریف خط مشی برای ثبت فعالیت ها • مشخص کردن هدف از ثبت اطالعات • تعریف خط مشی برای ثبت فعالیت ها  اطالعات سیستم عامل، برنامه کاربردی، پایگاه داده • مشخص کردن نوع دسترسی ها و شرایط رخ دادن آن ها زمان، اطالعات درخواست شده، ورود به سیستم• مشخص کردن جزئیات اطالعات ثبت شده زمان، شناسه ی کاربر، آدرس IP• مشخص کردن نحوه ی نگهداری اطالعات ثبت شده و کنترل دسترسی به آن هانحوه ی کنترل کاربران :تبیین قوانین امنیتی برای کاربران سیستم  منع دسترسی به اطالعات بدون انجام مجازشماری منع ذخیره ی اطالعات در جایی غیر از رسانه های مجاز منع نوشتن شناسه/کلمه عبور در حالی که به صورت آشکار قابل مشاهده باشد عدم تخصیص نقش مدیر پایگاه داده و اپراتور سیستم تفکیک وظایفالزام کاربران به امضای توافق نامه های نوشته شده موافقت با قوانین امنیتیتبیین قوانین انضباطی برای متخلفان مدیریت پایگاه داده  آگاه بودن دنبال کردن وقوع حوادث امنیتی که شامل آخرین پایگاه داده سازمان هستند و اصالحاتی که برای آن ها ارائه شده اند. مجازشماری فعالیت های مدیریتی ثبت فعالیت های مدیریتی چرخش دوره ای مدیران سیستم اختیاریتبیین قوانین انضباطی برای متخلفان مدیریت پایگاه دادهآگاه بودن دنبال کردن وقوع حوادث امنیتی که شامل آخرین پایگاه داده سازمان هستند و اصالحاتی که برای آن ها ارائه شده اند. مجازشماری فعالیت های مدیریتی ثبت فعالیت های مدیریتی چرخش دوره ای مدیران سیستم اختیاریآموزش کارکنان و همکارانکنترل های امنیتی پایگاه داده در قبال دسترسی غیرمجازکنترل های امنیتی – اقدامات پیشگیرانه :پیکربندی اولیهنصب آخرین وصله های امنیتی ارائه شده انتخاب و نصب حداقل ویژگی های مورد نیاز و حذف ویژگی های اضافی محدود کردن دسترسی پایگاه دادهاحراز هویتمدیریت حساب های کاربری ایجاد حساب های مورد نیاز حذف حساب های اضافه مسدود کردن ورودهای ناموفق مدیریت کلمه عبور پیچیدگی کلمه عبور تغییر دوره ای کلمه عبور تعیین تاریخ انقضا برای کلمه عبوررمزنگاری :رمزنگاری داده های در حال انتقال بین کارگزار و کارخواه SSL/TLS  رمزنگاری داده های ذخیره شده در پایگاه داده فایل های داده فایل های ثبت فایل های پشتیبان مدیریت کلیدهای رمزنگاریکنترل دسترسی :اطمینان از مجاز بودن دسترسی به داده مولفه های کنترل دسترسی خط مشی دسترسی: مشخص کننده ی دسترسی های مجاز به سیستم مکانیزم کنترل دسترسی: پیاده سازی و اعمال خط مشی دسترسی کنترل دسترسی اختیاری کنترل دسترسی اجباری کنترل دسترسی نقش مبناکنترل های امنیتی – اقدامات تشخیص و جرم شناسی :تهیه ی گزارش های مناسب برای تشخیص مشکل و تحلیل جرم مدیریت اطالعات ثبت شده Logs محافظت از اطالعات ثبت شده تشخیص چالش برای دسترسی غیرمجاز تحلیل اطالعات ثبت شده برای مشخص شدن نقص امنیتینتیجه گیری : امنیت پایگاه داده به متد های بسیار زیاد و مختلفی بستگی دارد که باید همه آنها به درستی بررسی ، مطالعه و پیاده سازی شوند .اما با این حال اگر تمام کار ها به درستی پیش برود ، باز هم یک شعار وجود دارد که می گوید ، امنیت هیچوقت صد در صد نیست .منابع : wikipedia.orgcouchbase.comw3schools.comfaradars.orgمرکز آپا دانشگاه یزد : cert.yazd.ac.irمرکز آپا دانشگاه صنعتی شریف : cert.sharif.eduمهدی مومنی موفق و پیروز باشید .......</description>
                <category>مهدی مومنی</category>
                <author>مهدی مومنی</author>
                <pubDate>Fri, 27 May 2022 00:23:09 +0430</pubDate>
            </item>
                    <item>
                <title>آپلود فایل در لاراول با livewire</title>
                <link>https://virgool.io/laravel-community/%D8%A2%D9%BE%D9%84%D9%88%D8%AF-%D9%81%D8%A7%DB%8C%D9%84-%D8%AF%D8%B1-%D9%84%D8%A7%D8%B1%D8%A7%D9%88%D9%84-%D8%A8%D8%A7-livewire-cnunh6aiwcup</link>
                <description>به نام خدا . برای آپلود فایل ابتد باید یک فرم Html داشته باشیم .&lt;form wire:submit.prevent=&amp;quotstore&amp;quot&gt;
        &lt;label&gt; file: &lt;/label&gt;
        &lt;input type=&amp;quotfile&amp;quot wire:model=&amp;quotimage&amp;quot&gt;
        &lt;button type=&amp;quotsubmit&amp;quot&gt;Submit&lt;/button&gt;
&lt;/form&gt;حالا وارد کامپوننت مربوطه می شویم .1) قطعه کد زیر را بیرون از کلاس کامپوننت می نویسیم :use Livewire\WithFileUploads;2) و قطعه کد زیر را داخل کلاس کامپوننت می نویسیم :use WithFileUploads;داخل فایل مادل مربوط به دیتابیس جدول مربوطه را بشناسانید : مثلا $table = &amp;quotposts&amp;quotدر اینجا posts اسم جدولی است که میخواهیم مادل به آن وصل شود و نام عکس در ان ذخیره شود.حالا مایگریشن را اماده میکنیم و ان را migrate میکنیم فرض کنید جدول پست فقط دو ستون به اسم های image و id دارد.آی دی اتو انکریمنت است .داخل کلاس کامپوننت کد زیر را می نویسیم :public $image;
public function store()
{
$post = new Post();
$imageName = Carbon::now()-&gt;timestamp.&#039;.&#039;.&#039;jpg&#039;;
$this-&gt;image-&gt;storeAs(&#039;img&#039;,$imageName);
$post-&gt;image = $this-&gt;image;
$post-&gt;save();
return redirect(route(&#039;index&#039;));
} حالا وارد مصیر زیر شود :config/filesystems.phpدر disks / local ،  روت (root) را پیدا کنید . میبینید که کد زیر نوشته شده است : &#039;root&#039; =&gt; storage_path(&#039;app&#039;)آن را حذف کنید و کد زیر را بنویسید :&#039;root&#039; =&gt; public_path(&#039;assets&#039;) حالا وارد مصیر زیر شوید :public/assetsاگر در public پوشه ای به اسم assets ندارید یکی بسازید و داخل آن یک پوشه جدید به اسم img بسازید تا عکس ها داخل آن ذخیره شوند .پیروز و موفق باشید .مهدی مومنی</description>
                <category>مهدی مومنی</category>
                <author>مهدی مومنی</author>
                <pubDate>Fri, 30 Jul 2021 14:48:04 +0430</pubDate>
            </item>
                    <item>
                <title>ثبت (Insert) اطلاعات در دیتابیس با لایووایر بدون رفرش صفحه</title>
                <link>https://virgool.io/laravel-community/%D8%AB%D8%A8%D8%AA-insert-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%AF%D8%B1-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D8%A8%D8%A7-%D9%84%D8%A7%DB%8C%D9%88%D9%88%D8%A7%DB%8C%D8%B1-%D8%A8%D8%AF%D9%88%D9%86-%D8%B1%D9%81%D8%B1%D8%B4-%D8%B5%D9%81%D8%AD%D9%87-w5m1orjf9qze</link>
                <description>به نام خدا .Laravel-Livewire Framework1) ابتدا یک مایگریشن و مادل میسازیم .php artisan make:model Articles -m 2) حالا داخل فایل مادل خودمون جدول Articles را معرفی می کنیم.Protected $table = &amp;quotArticles&quot;3) مایگریشن را آماده می کنیم  و بعد دستور زیر را اجرا می کنیم .php artisan migrate:fresh4) حالا که دیتابیس ما آمادست می ریم سراغ فرم و کامپوننتمون .با دستور زیر یک کامپوننت می سازیم.php artisan make:lvewire ArticleComponent5) ابتدا وارد view مربوطه می شویم و فرم ثبت اطلاعات را میسازیم .&lt;form wire:submit.prevent = &amp;quotstore&amp;quot&gt;
&lt;input type=&amp;quottext&amp;quot wire:model=&amp;quottitle&amp;quot&gt;
&lt;input type=&amp;quottext&amp;quot wire:model=&amp;quotdescription&amp;quot&gt;
&lt;button type=&amp;quotsubmit&amp;quot&gt;ثبت&lt;/button&gt;
&lt;/form&gt;6) حالا وارد فایل کامپوننت مربوطه می شویم و کدهای ثبت اطلاعات را می نویسیم.&lt;?php
namespace App\Http\Livewire;
use App\Models\Article;
use Livewire\Component;
class AddArticleComponent extends Component
{
public function render()
{
return view(&#039;livewire.add-article-component&#039;)
&gt;layout(&#039;layouts.app&#039;, [&#039;pagetitle&#039; =&gt; &#039;Add New Article&#039;]);
}
public $title;
public $description;
public function store()
{
$article = new Article();
$article-&gt;title = $this-&gt;title;
$article-&gt;description  = $this-&gt;description;
$article-&gt;save();
}
}موفق و سربلند باشید .انجمن php ایران .............................Channel : https://t.me/IR_PHP_Dev_Community_channelGroup     : https://t.me/IR_PHP_Developers_Community</description>
                <category>مهدی مومنی</category>
                <author>مهدی مومنی</author>
                <pubDate>Sat, 24 Jul 2021 16:57:25 +0430</pubDate>
            </item>
                    <item>
                <title>ساخت ماشین حساب BMI (شاخص توده بدنی) با php</title>
                <link>https://virgool.io/@mehdee81/%D8%B3%D8%A7%D8%AE%D8%AA-%D9%85%D8%A7%D8%B4%DB%8C%D9%86-%D8%AD%D8%B3%D8%A7%D8%A8-bmi-%D8%B4%D8%A7%D8%AE%D8%B5-%D8%AA%D9%88%D8%AF%D9%87-%D8%A8%D8%AF%D9%86%DB%8C-%D8%A8%D8%A7-php-pdzu3jdech9r</link>
                <description>به نام خداوند مهربان .قبل از هر چیزی باید بدونیم که فرمول  حساب کردن شاخص توده بدنی (BMI) چیست وزن / قد(متر) به توان 2مثال:وزن = 70قد = 1.77 ===به توان 2===&gt; 3.1329BMI = 70 / 3.1329خب بریم سراغ کدنویسی -----------------------------&gt;قبل از هر چیزی باید یک فرم html برای دریافت اطلاعات از کاربر بسازیم .&lt;div class=&amp;quotsite-section bg-light&amp;quot id=&amp;quotcontact-section&amp;quot&gt;
&lt;div class=&amp;quotcontainer&amp;quot&gt;
&lt;div class=&amp;quotrow justify-content-center&amp;quot&gt;
&lt;div class=&amp;quotcol-md-7&amp;quot&gt;
&lt;div class=&amp;quotpt-5&amp;quot&gt;
&lt;div class=&amp;quotcomment-form-wrap pt-5&amp;quot&gt;
&lt;h3 style=&amp;quottext-align: center;&amp;quot class=&amp;quotmb-5&amp;quot&gt;ماشین حساب BMI&lt;/h3&gt;
&lt;form method=&amp;quotPOST&amp;quot class=&amp;quotp-5 bg-light&amp;quot&gt;
&lt;div class=&amp;quotform-group&amp;quot&gt;
&lt;label for=&amp;quotname&amp;quot&gt;قد (متر)&lt;/label&gt;
&lt;input required type=&amp;quottext&amp;quot dir=&amp;quotltr&amp;quot placeholder=&amp;quot1.75&amp;quot name=&amp;quotqad&amp;quot class=&amp;quotform-control&amp;quot
id=&amp;quotname&amp;quot&gt;
&lt;/div&gt;
&lt;div class=&amp;quotform-group&amp;quot&gt;
&lt;label for=&amp;quotname&amp;quot&gt;وزن (کیلوگرم)&lt;/label&gt;
&lt;input required type=&amp;quottext&amp;quot dir=&amp;quotltr&amp;quot placeholder=&amp;quot75&amp;quot name=&amp;quotvazn&amp;quot class=&amp;quotform-control&amp;quot
id=&amp;quotname&amp;quot&gt;
&lt;/div&gt;
&lt;div class=&amp;quotform-group&amp;quot&gt;
&lt;input type=&amp;quotsubmit&amp;quot name=&amp;quotok&amp;quot value=&amp;quotدریافت نتیجه&amp;quot class=&amp;quotbtn btn-primary&amp;quot&gt;
&lt;/div&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;حالا باید بریم سراق کنترلرمون و کد های اون بخش را بنویسیم .&lt;?php
class BMI
{
function calculator($vazn, $qad)
{
$number =  $vazn / ($qad * $qad);
return $number;
}
function vaziat($number)
{
if ($number &lt; 18.5) {
$mahdoode = &#039;کمبود وزن&#039;;
}
if ($number &gt; 18.5 and $number &lt;= 25) {
$mahdoode = &#039;وزن ایده آل&#039;;
}
if ($number &gt; 25 and $number &lt;= 30) {
$mahdoode = &#039;اضافه وزن&#039;;
}
if ($number &gt; 30 and $number &lt;= 35) {
$mahdoode = &#039;چاقی نوع ۱&#039;;
}
if ($number &gt; 35 and $number &lt;= 40) {
$mahdoode = &#039;چاقی نوع ۲&#039;;
}
if ($number &gt; 40) {
$mahdoode = &#039;چاقی نوع ۳ (بیمارگونه)&#039;;
}
return $mahdoode;
}
function goodman($qad)
{
if ($qad &gt; 152) {
$ideal = (($qad - 152) * 1.1) + 48;
} else {
$ideal = (-(152 - $qad) * 1.1) + 48;
}
return $ideal;
}
function goodwoman($qad)
{
if ($qad &gt; 152) {
$ideal = (($qad - 152) * 1.1) + 43;
} else {
$ideal = (-(152 - $qad) * 1.1) + 43;
}
return $ideal;
}
}یک کلاس ساختیم که داخلس چهار تا متد وجود داره ، حالا بیاید بررسی کنیم هر کدوم از این متدا چیکار می کنن .متد اول :calculator()این متد میاد با توجه به دوتا ورودی که داره ( قد ، وزن ) ، BMI (شاخص توده بدنی) را با همون فرمولی که بالا نوشتم محاسبه می کنه .متد دوم : vaziat()همون طور که از اسمش مشخصه با توجه به فیلتر خود BMI مشخص می کنه که وزن کاربر در چه محدوده ای قرار داره و در آخر وضعیت را از تابع return می کند .متد سوم :goodman()این متد محاسبه می کنه که وزن مناسب برای مرد باتوجه به (قد) ورودی کاربر چقدره .متد چهارم :goodwoman()این متد محاسبه می کنه که وزن مناسب برای خانم باتوجه به (قد) ورودی کاربر چقدره .حالا می رسیم به قسمت دریافت اطلاعات از سرور و نمایش آن .ابتدا از کلاس BMI که ساختیم یک شی جدید تعریف می کنیم ، سپس با گذاشتن شرط ، اطلاعات را از کاربر گرفته و متد ها را فراخانی می کنیم .تابع ()round که نوشتم کارش چیه ؟وقتی ما BMI رو حساب کردیم بعد عدد خروجی را میدیم به تابع ()round ، تابع () round میاد عدد رو میگیره و تا 1 یک رقم اعشار نمایش میده همونطور که ماخودمون تو آرگومان دومش نوشتیم 1 .مثلا اگر به جای 1 ، x میزاشتیم توی خروجی  تا x رقم اعشار نمایش میداد .مثلا عدد ما اینه : 21.65564564وقتی میدیمش به تابع round :echo round( 21.65764564,3);==================&gt; 21.658بعد متدهای دیگه رو صدا زدیم و دونه دونه توی خروجی نمایششون دادیم .موفق و پیروز باشید .مهدی مومنی برای پرسیدن سوال های php خود و حل مشکلاتتان به گروه انجمن php ایران بپیوندید .https://t.me/IR_PHP_Developers_Communityکانال انجمن :https://t.me/IR_PHP_Dev_Community_channel</description>
                <category>مهدی مومنی</category>
                <author>مهدی مومنی</author>
                <pubDate>Tue, 06 Jul 2021 20:50:11 +0430</pubDate>
            </item>
                    <item>
                <title>ساخت کوتاه کننده لینک با php</title>
                <link>https://virgool.io/@mehdee81/%D8%B3%D8%A7%D8%AE%D8%AA-%DA%A9%D9%88%D8%AA%D8%A7%D9%87-%DA%A9%D9%86%D9%86%D8%AF%D9%87-%D9%84%DB%8C%D9%86%DA%A9-%D8%A8%D8%A7-php-do9tjyeusm3k</link>
                <description>به نام خدامیخوایم یک اسکریپت php بنویسیم  که یک url بزرگ و طولانی را تبدیل به یک لینک کوتاه و مختصر کند .برای پرسیدن سوال های php خود و حل مشکلاتتان به گروه انجمن php ایران بپیوندید .https://t.me/IR_PHP_Developers_Communityکانال انجمن :https://t.me/IR_PHP_Dev_Community_channelبرای شروع کار یک کلاس به اسم ShortCode می سازیم و دوتا تابع داخلش قرار می دهیم .class ShortCode
{
function Create()
{
$step1 = &amp;quotAaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz&amp;quot
$step2 = &amp;quotAaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz&amp;quot
$step3 = &amp;quotAaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz&amp;quot
$step4 = &amp;quotAaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz&amp;quot
$rand1 = substr(str_shuffle($step1),0,2);
$rand2 = substr(str_shuffle($step2),0,1);
$rand3 = substr(str_shuffle($step3),0,1);
$rand4 = substr(str_shuffle($step4),0,2);
$output = $rand1.$rand2.$rand3.$rand4;
return $output;
}
function Insert($url, $shortcode)
{
include &amp;quotdb_connect.php&amp;quot
$sql   = &amp;quotINSERT INTO links(url,shortcode)VALUE(:url,:shortcode)&amp;quot
$query = $DB-&gt;prepare($sql);
$query-&gt;bindParam(&#039;:url&#039;, $url, PDO::PARAM_STR);
$query-&gt;bindParam(&#039;:shortcode&#039;, $shortcode, PDO::PARAM_STR);
$query-&gt;execute();
}}تابع اول کارش اینه که بیاد به صورت رندوم یک string شش حرفی بسازه تا ازش به عنوان لینک کوتاه استفاده کنیم .تابع دوم دوتا آرگومان دریافت می کنه آرگومان اول همون (url) یا لینک طولانی ماست  و   آرگومان دوم همون مقدار خروجی تابع اول یعنی یک string شش حرفی است .حالا باید یک دیتابیس بسازیم به اسم shortcode و بعد یک  جدول برای لینک ها توی دیتابیس بسازیم به اسم links و سه تا فیلد داخلش قرار بدیم به اسم های  (id) و (url) و (shortcode) .link tableبعد از اون کدهای اتصال به دیتابیس را  به صورت زیر می نویسیم .Data Base Connect&lt;?php
define(&#039;DB_HOST&#039;, &#039;localhost&#039;);
define(&#039;DB_USER&#039;, &#039;root&#039;);
define(&#039;DB_PASS&#039;, &#039;mysql&#039;);
define(&#039;DB_NAME&#039;, &#039;shortcode&#039;);
try{
$DB = new PDO(&#039;mysql:host=&#039; . DB_HOST .&#039;;dbname=&#039; . DB_NAME, DB_USER, DB_PASS);
$DB-&gt;setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch(PDOException $error){
echo $error-&gt;getMessage();
}حالا نوبت میرسه به نوشتن کدهای صفحه index :یک فرم می سازیم که بیاد لینک طولانی رو از کاربر بگیره &lt;div class=&amp;quotsite-section bg-light&amp;quot id=&amp;quotcontact-section&amp;quot&gt;
&lt;div class=&amp;quotcontainer&amp;quot&gt;
&lt;div class=&amp;quotrow justify-content-center&amp;quot&gt;
&lt;div class=&amp;quotcol-md-7&amp;quot&gt;
&lt;div class=&amp;quotpt-5&amp;quot&gt;
&lt;div class=&amp;quotcomment-form-wrap pt-5&amp;quot&gt;
&lt;h3 style=&amp;quottext-align: center;&amp;quot class=&amp;quotmb-5&amp;quot&gt;کوتاه کننده لینک &lt;/h3&gt;
&lt;form method=&amp;quotPOST&amp;quot class=&amp;quotp-5 bg-light&amp;quot&gt;
&lt;div class=&amp;quotform-group&amp;quot&gt;
انجمن php ایران
&lt;br&gt;
&lt;br&gt;
&lt;p style=&amp;quottext-align: left;&amp;quot&gt;tel : @IR_PHP_Dev_Community_channel&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&amp;quotform-group&amp;quot&gt;
&lt;label for=&amp;quotname&amp;quot&gt;لطفا لینک خود را وارد کنید .&lt;/label&gt;
&lt;input required type=&amp;quottext&amp;quot dir=&amp;quotltr&amp;quot name=&amp;quoturl&amp;quot class=&amp;quotform-control&amp;quot id=&amp;quotname&amp;quot&gt;
&lt;/div&gt;
&lt;div class=&amp;quotform-group&amp;quot&gt;
&lt;input type=&amp;quotsubmit&amp;quot name=&amp;quotok&amp;quot value=&amp;quotدریافت نتیجه&amp;quot class=&amp;quotbtn btn-primary&amp;quot&gt;
&lt;/div&gt;
&lt;/form&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;و حالا کدهای php برای ارسال درخواست &lt;?php
include(&amp;quotcontroller.php&amp;quot);
$ShortCode = new ShortCode;
if (isset($_POST[&#039;ok&#039;])) {
$url = $_POST[&#039;url&#039;];
$NewShortCode = $ShortCode-&gt;Create();
$ShortCode-&gt;Insert($url, $NewShortCode);
}
?&gt;و بعد از اون نوبت به نمایش لینک کوتاه جدید میرسه localhost/short url/header.php?v=&lt;?php echo $NewShortCode ?&gt;حالا برای هدایت صفحه باید یک فایل به اسم header.php بسازیم و کد های زیر را داخلش قرار بدیم &lt;?php
include &amp;quotdb_connect.php&amp;quot
$get = $_GET[&#039;v&#039;];
$sql = &amp;quotSELECT * FROM links WHERE shortcode = &#039;$get&#039;&amp;quot
$query = $DB-&gt;prepare($sql);
$query-&gt;execute();
$links = $query-&gt;fetch();
$link = $links[&#039;url&#039;];
header(&#039;Location:&#039;.$link);پیروز و موفق باشید .مهدی مومنی برای پرسیدن سوال های php خود و حل مشکلاتتان به گروه انجمن php ایران بپیوندید .https://t.me/IR_PHP_Developers_Communityکانال انجمن :https://t.me/IR_PHP_Dev_Community_channel</description>
                <category>مهدی مومنی</category>
                <author>مهدی مومنی</author>
                <pubDate>Mon, 05 Jul 2021 20:16:29 +0430</pubDate>
            </item>
                    <item>
                <title>خزنده وب چیست و چگونه با php یک خزنده بسازیم .</title>
                <link>https://virgool.io/@mehdee81/%D8%AE%D8%B2%D9%86%D8%AF%D9%87-%D9%88%D8%A8-%DA%86%DB%8C%D8%B3%D8%AA-%D9%88-%DA%86%DA%AF%D9%88%D9%86%D9%87-%D8%A8%D8%A7-php-%DB%8C%DA%A9-%D8%AE%D8%B2%D9%86%D8%AF%D9%87-%D8%A8%D8%B3%D8%A7%D8%B2%DB%8C%D9%85-orz1udyaop1i</link>
                <description>همان طور که از نامش پیداست خزنده یا CRAWLER در وبسایت عملیات خزیدن را انجام می دهد .خزنده ها در واقع بخش اصلی و مرکزی یک موتور جستجو را تشکیل می دهند. در واقع به زبان ساده، یک نرم افزار یا اسکریپت اتوماتیک است که با توجه به الگوریتم مشخص و هدفمند انواع موتورهای جستجو که برایشان تعریف شده است، در وب سایت های موجود به گردش میپردازند و محتوای آنها را در دیتابیس موتور جستجو ذخیره می کنند. به این فرایند index کردن محتوای وب سایت نیز گفته می شود.هدف از خزیدن می تواند هرچیزی باشید ، پیدا کردن تکنولوژی های وبسایت  پیدا کردن یک موضوع خاص مثل قیمت ارز ، پیداکردن آسیب پذیری یا هرچیز دیگری که فکرش را بکنید . برای پرسیدن سوال های php خود و حل مشکلاتتان به گروه انجمن php ایران بپیوندید . https://t.me/IR_PHP_Developers_Communityکانال انجمن :https://t.me/IR_PHP_Dev_Community_channelمزایای استفاده از web crawler چیست ؟استفاده از خزنده های وب این مزیت را دارد که می تواند فرایند خزش دوره ای داده ها را کنترل نمایید. همچنین فواید دیگری دارد که عبارتند از:این پروسه در پشت زمینه اتفاق می افتد، و بیشتر اوقات بر روی عملکرد وبسایت تاثیر ندارد.بازرسی و ویرایش امکان پذیر است.جست و جوی سریع در صفحات .چگونه یک خزنده وب با php بسازیم ؟ابتدا باید یک فرم برای وارد کردن url بسازیم .&lt;form method=&amp;quotPOST&amp;quot&gt;
&lt;input type=&amp;quottext&amp;quot name=&amp;quoturl&amp;quot value=&amp;quothttp://&amp;quot&gt;
&lt;input type=&amp;quotsubmit&amp;quot name=&amp;quotsubmit&amp;quot&gt;
&lt;/form&gt;الان دیگه وقتشه بریم سراق کنترلر خودمون و یک کلاس به اسم CRAWL بسازیم .&lt;?php
/*
|||==&gt; 1) Send Request To Target.
|||==&gt; 2) Get the result. And Save Tt In To (crwal-result.html) File.
|||==&gt; 3) Stored Data In a File.
|||==&gt; 4) Reading File Values.
|||==&gt; 5) Searching In Result For Our Words.
*/
class CRAWL
{
public function Crawling($url)
{
// Send Request To target ------------------------------
$data = file_get_contents&#40;$url&#41;;
// Get the result --------------------------------------
$data = strip_tags($data, &amp;quot&lt;a&gt;&amp;quot);
$d = preg_split(&amp;quot/&lt;\/a&gt;/&amp;quot, $data);
$links = []; // All Links will be Append To This List.
foreach ($d as $k =&gt; $u) {
if (strpos($u, &amp;quot&lt;a href=&amp;quot) !== FALSE) {
$u = preg_replace(&amp;quot/.*&lt;a\s+href=\&amp;quot/sm&amp;quot, &amp;quot&amp;quot, $u);
$u = preg_replace(&amp;quot/\&amp;quot.*/&amp;quot, &amp;quot&amp;quot, $u);
array_push($links, $u);
}}
// Stored Data In a File  -------------------------------
$file_allpage = fopen&#40;&amp;quotwebsite.html&amp;quot, &#039;a&#039;&#41;;
// All data is stored in this file.
$homepage  = file_get_contents&#40;$url&#41;;
$homepage_replace = str_replace(&amp;quotgoogle&amp;quot, &#039;&#039;, $homepage);
fwrite($file_allpage, $homepage_replace);
foreach ($links as $link) {
if (strstr($link, &#039;*.php&#039;) or strstr($link, &#039;*.asp&#039;) or
strstr($link, &#039;*.js&#039;) or
strstr($link, &#039;*.go&#039;) or
strstr($link, &#039;*.py&#039;) or
strstr($link, &#039;*.jquery&#039;)) {
$data = file_get_contents&#40;$url . $link&#41;;
$data_replace = str_replace(&amp;quotgoogle&amp;quot, &#039;&#039;, $data);
fwrite($file_allpage, $data_replace);
} else {
continue;
}}
// Reading File Values ----------------------------------
$file_read = fopen&#40;&amp;quotwebsite.html&amp;quot, &amp;quotr&amp;quot&#41;;
$value = fread($file_read, filesize(&amp;quotwebsite.html&amp;quot));
return $value;}
public function Search($string, $word)
{
if (strpos($string, $word) != false) {
$result = &amp;quottrue&quot;
} else {
$result = &amp;quotfalse&quot;
}
return $result;
}}تا اینجا ما فقط یک کلاس ساختیم و داخلش دو متد قرار دادیم .حالا بیاید این کدهارو تکه تکه تحلیل کنیم .تابع Crawling یک آرگومان دریافت می کند که آن همان لینک یا url سایت است ، در مرحله اول با متغیر data  یک رکوعست به سمت وبسایت ارسال میکنیم .$data = file_get_contents&#40;$url&#41;;تابع بالا میاد اول یک رکوعست میفرسته به اون صفحه و بعد تمام کدهای html,css ,js  اون صفحه وب را داخل متغیر  data$ ذخیره می کنه . حالا با کد های پایین میایم و تگ های  a داخل صفحه را پیدا میکنیم و دیتای داخلشونو میخونم البته این کارو با جاوااسکریپت هم می شد انجام داد اما با php انجام دادیم .$data = strip_tags($data, &amp;quot&lt;a&gt;&amp;quot);
$d = preg_split(&amp;quot/&lt;\/a&gt;/&amp;quot, $data);بعد از اون یک متغیربه اسم link$ می سازیم و مقداری براش قرار نمیدیم ، تا بعدا ازش استفاده کنیم .$links = []; // All Links will be Append To This List.حالا با یک حلقه میایم تمام لینک هایی که داخل صفحه پیدا کردیمو به اون آرایه اضافه میکنیم .foreach ($d as $k =&gt; $u) {
if (strpos($u, &amp;quot&lt;a href=&amp;quot) !== FALSE) {
$u = preg_replace(&amp;quot/.*&lt;a\s+href=\&amp;quot/sm&amp;quot, &amp;quot&amp;quot, $u);
$u = preg_replace(&amp;quot/\&amp;quot.*/&amp;quot, &amp;quot&amp;quot, $u);
array_push($links, $u);
} }بعد از اینکار باید یک فایل بسازیم که بیاد تمام صفحاتی که ما میخوایم به سمتشون درخواست ارسال کنیم رو دیتا هاشون رو داخلش ذخیره کنیم .$file_allpage = fopen&#40;&quot;website.html&quot;, &#x27;a&#x27;&#41;;حالا یک بار دیگه به همون صفحه اولمون رکوعست ارسال میکنیم که اونو اول داخل فایل ذخیره کنیم .$homepage  = file_get_contents&#40;$url&#41;;
$homepage_replace = str_replace(&amp;quotgoogle&amp;quot, &#039;&#039;, $homepage);
fwrite($file_allpage, $homepage_replace);حالا میایم به تک تک اون لینک هایی که داخل آرایه ذخیره کردیم  یک رکوعست میفرستیم و دیتاشونو داخل اون فایل ذخیره میکنیم تا بتونیم یک عملیات خزیدن خوب داشته باشیم .foreach ($links as $link) {
if (strstr($link, &#039;*.php&#039;) or strstr($link, &#039;*.asp&#039;) or strstr($link, &#039;*.js&#039;) or strstr($link, &#039;*.go&#039;) or strstr($link, &#039;*.py&#039;) or strstr($link, &#039;*.jquery&#039;)) {
$data = file_get_contents&#40;$url . $link&#41;;
$data_replace = str_replace(&amp;quotgoogle&amp;quot, &#039;&#039;, $data);
fwrite($file_allpage, $data_replace);
} else {
continue;
}}حالا باید بیایم دیتاهای داخل اون فایل رو بخونیم و بعد برگردونیمش تا بعدا هر بلایی خواستیم سرش بیاریم .$file_read = fopen&#40;&amp;quotwebsite.html&amp;quot, &amp;quotr&amp;quot&#41;;
$value = fread($file_read, filesize(&amp;quotwebsite.html&amp;quot));
return $value;حالا وقت این رسیده که از این کلاس خفن که نوشتیم استفاده کنیم .include(&amp;quotController.php&amp;quot);
$CRAWL = new CRAWL;
if (isset($_POST[&#039;submit&#039;])) {
$CMS = [&#039;.py&#039;, &#039;.go&#039;, &#039;.js&#039;, &#039;.Css&#039;, &#039;.asp&#039;, &#039;jquery&#039;, &#039;.php&#039;, &#039;Bootstrap&#039;, &#039;script&#039;];
$url = $_POST[&#039;url&#039;];
$khazesh = $CRAWL-&gt;Crawling($url);
echo &amp;quotCMS Of This Website: $url &amp;quot
echo &amp;quot&lt;br&gt;&amp;quot
echo &amp;quot&lt;br&gt;&amp;quot
$number = 1;
foreach ($CMS as $c) {
$search = $CRAWL-&gt;search($khazesh, $c);
if ($search != &#039;false&#039;) {
echo $number . &#039;) &#039; . $c . &amp;quot&lt;hr&gt;&amp;quot
$number++;
}
};
unlink&#40;&#039;website.html&#039;&#41;;}موفق و پیروز باشید .برای پرسیدن سوال های php خود و حل مشکلاتتان به گروه انجمن php ایران بپیوندید . https://t.me/IR_PHP_Developers_Communityکانال انجمن :https://t.me/IR_PHP_Dev_Community_channel</description>
                <category>مهدی مومنی</category>
                <author>مهدی مومنی</author>
                <pubDate>Mon, 05 Jul 2021 14:52:42 +0430</pubDate>
            </item>
            </channel>
</rss>