اینترنت پنجره ها اندروید
بسط دادن

فرار از شخصیت ها در عبارات معمولی از چه شخصیت های خاصی باید فرار کرد؟ آنچه در html فرار می کند

به طور معمول ، زبانهای برنامه نویسی ، رابطهای فرمان مبتنی بر متن ، زبانهای نشانه گذاری متن (HTML ، TeX ، نشانه گذاری ویکی) با متن ساختار یافته سروکار دارند که در آن برخی از کاراکترها (و ترکیب آنها) به عنوان مدیران، از جمله کسانی که ساختار متن را کنترل می کنند. در شرایطی که لازم است از چنین نمادی به عنوان "نماد زبان مشترک" استفاده کنید ، اعمال کنید محافظ.

بر اساس قرارداد ، فرار را می توان به سه نوع تقسیم کرد:

  • فرار از یک شخصیت واحد
  • فرار از گروهی از شخصیت ها با استفاده از دنباله ای از شخصیت ها "شروع به فرار" ، "پایان فرار"
  • با استفاده از دستور "شروع فرار" و نویسه "پایان فرار" ، که قبل از شروع متن فرار تنظیم شده است.

عدم وجود محافظ به عنوان عامل آسیب پذیری

هنگامی که متن ساختار یافته به طور خودکار تولید می شود ، فرار از شخصیت نگران کننده است. گنجاندن داده های رشته ای دلخواه در متن به معنای فرار اجباری از کاراکترهای کنترل در آنها است. در عین حال ، اغلب رشته های واقعی حاوی چنین کاراکترهایی نیستند ، که به برنامه نویس اجازه می دهد از این عملیات به طور کامل بگذرد و بیشتر بدست آورد برنامه سادهکه با داده های رشته "منطقی" به درستی کار می کند. با این حال ، چنین کد ساده شده دارای یک آسیب پذیری پنهان است ، زیرا شخص ثالث (نویسنده داده های رشته) فرصتی غیرمجاز برای تأثیرگذاری به دست می آورد. ساختارمتن تولید شده اگر متن تولید شده برنامه شخص دیگری باشد ، آسیب پذیری جدی می شود. به طور سنتی ، سیستم هایی که از آنها استفاده می کنند زبان های SQL(تزریق SQL را ببینید) و HTML (به Cross Site Scripting مراجعه کنید).

نمونه هایی از

فرار از یک شخصیت واحد

  • در زبان برنامه نویسی C ، نویسه ها در داخل رشته ها با استفاده از کاراکتر "" که قبل از کاراکتر برای فرار قرار می گیرد فرار می کنند. (در این حالت ، کاراکتر "\" می تواند به خودی خود فرار کند ، یعنی از ترکیب "\\" برای نمایش عکس برگشتی استفاده می شود) ، از همان کاراکتر برای فرار از کاراکترها در خط فرمان unix
  • روی خط فرمان ویندوز مایکروسافتبرخی از کاراکترها با استفاده از کاراکتر "^" که قبل از کاراکتر برای فرار قرار داده شده است فرار می کنند.

فرار از گروهی از شخصیت ها

  • در زبان برنامه نویسی پایتون ، گروهی از کاراکترهای یک رشته با تعیین حرف r (از انگلیسی raw - unprocessed) در جلوی رشته فرار می کنند ، یعنی کاراکترها با دنباله ها فرار می کنند. r "متن فرار "
  • در نشانه گذاری ویکی ، فرار از متن با استفاده از برچسب های شبه انجام می شود و... اگر لازم است خود برچسب شبه را بنویسید ، این کار با علامت های بزرگ انجام می شود ( ).

فرار از متن با شخصیت پشت سر

وقتی تعداد زیادی کاراکتر کنترل کننده در متن وجود داشته باشد ، تعداد زیادی شخصیت فرار نیز وجود خواهد داشت ، متن سنگین می شود. برای چنین مواردی ، از یک روش فرار جایگزین استفاده می شود - با متن عقب. در این حالت ، همه کاراکترهای کنترل دقیقاً کاراکتر خواهند بود (حمل نکنید عملکرد مدیریت) ، و زمانی متن متوقف می شود که کامپایلر دنباله ای را تشخیص دهد - متن نهایی.

برای درک اینکه چه موقع و چه چیزی باید بدون تلاش اجتناب شود ، باید دقیقاً زنجیره زمینه هایی را که یک رشته از آن عبور می کند ، درک کنید. شما رشته ای را از دورترین سمت تا مقصد نهایی خود مشخص می کنید ، که توسط کد تجزیه regex حافظه پردازش می شود.

به یاد داشته باشید که چگونه یک رشته در حافظه مدیریت می شود: اگر می تواند یک خط ساده در کد یا خط وارد شده در خط فرمان باشد ، اما می تواند یک خط فرمان تعاملی ، یا یک خط فرمان مشخص شده در فایل اسکریپت پوسته ، یا داخل آن باشد. یک متغیر در حافظه با کد ارجاع داده می شود ، یا یک آرگومان (رشته) برای ارزیابی بیشتر ، یا یک رشته حاوی کد به صورت پویا با هرگونه کپسوله سازی تولید می شود ...

به هر یک از این زمینه چندین نماد با عملکرد خاص اختصاص داده شده است.

اگر می خواهید یک کاراکتر را به معنای واقعی کلمه بدون استفاده از عملکرد ویژه آن (محلی در زمینه) منتقل کنید ، در این صورت باید از آن برای زمینه بعدی فرار کنید ... که ممکن است به برخی از شخصیت های فرار دیگر نیاز داشته باشد که ممکن است برای فرار آنها نیاز داشته باشید در زمینه قبلی (اوه) همچنین ممکن است مواردی مانند رمزگذاری کاراکترها وجود داشته باشد (موذیانه ترین آن utf-8 است زیرا برای کاراکترهای معمولی شبیه ASCII است ، اما بسته به تنظیمات آن حتی توسط ترمینال قابل تفسیر است ، بنابراین می تواند متفاوت از HTML رفتار کند / ویژگی کدگذاری XML ، درک صحیح فرآیند ضروری است.

به عنوان مثال ، یک عبارت منظم خط فرمان که با perl -npe شروع می شود باید به مجموعه منتقل شود تماس های سیستمی exec مانند لوله ای که یک فایل را پردازش می کند ، متصل می شود ، هر یک از این اسکال های اجرایی فقط لیستی از آرگومان ها را دارد که توسط فضاهای (فرار نشده) و احتمالاً لوله ها (|) و تغییر مسیر (> N> N> & M) از هم جدا شده اند. پرانتز ، پسوند تعاملی * و؟ ، $ (()) ... (همه اینها نمادهای خاصتوسط * sh استفاده می شود ، که ممکن است به نظر برسد که در زمینه زیر با کاراکتر regex تداخل دارد ، اما آنها به ترتیب ارزیابی می شوند: قبل از خط فرمان. خط فرمان توسط برنامه به صورت bash / sh / csh / tcsh / zsh خوانده می شود ، در اصل در یک نقل قول دوگانه یا یک نقل قول ، فرار آسان تر است ، اما نیازی به نقل قول رشته در خط فرمان نیست زیرا اساساً فضا باید با پیشوند blashlash شروع شود علامت خط علامت و نقل قول غیر ضروری است ، و قابلیت توسعه را برای کاراکترهای * و؟ در دسترس می گذارد ، اما این همان زمینه را با علامت نقل قول تجزیه می کند. سپس ، هنگام ارزیابی خط فرمان ، regexp دریافت شده در حافظه (نه آنطور که در خط فرمان نوشته شده است) همان پردازش را در فایل اصلی دریافت می کند. برای regex ، یک مجموعه مجموعه کاراکتر در پرانتز وجود دارد ، یک perge regex را می توان در مجموعه بزرگی از کاراکترهای عددی غیر آلفا (به عنوان مثال ، m // یا m: / بهتر است / برای / مسیر: )

شما در پاسخ دیگر جزئیات بیشتری در مورد شخصیت ها دارید ، که بسیار مختص زمینه نهایی regex است. همانطور که اشاره کردم ، شما اشاره می کنید که متوجه می شوید که regexp با امتحان مجدد بازنشانی می شود ، احتمالاً به این دلیل است که زمینه دیگر دارای مجموعه شخصیت های متفاوتی است که حافظه شما را از تلاش مجدد گیج می کند (اغلب عکس برگشتی شخصیتی است که در این زمینه دیگر برای فرار استفاده می شود. به جای عملکرد آن یک شخصیت واقعی است.)

یادداشت:نسخه تطبیقی ​​سایت فعال است ، که به طور خودکار با آن تنظیم می شود اندازه کوچکمرورگر شما و برخی از جزئیات سایت را برای خوانایی پنهان می کند. مشاهده خوشحالم!

من دوباره خوشحالم که از همه در صفحات وبلاگ که به همه ظرافت های ایجاد و ارتقای موفق سایتها اختصاص داده شده است ، استقبال می کنم - سایتبر! در آموزش PHP امروز ، ما موضوعاتی مانند انواع متغیرها ، فرار ، کاراکترهای خاص و نحو heredoc در PHP را پوشش خواهیم داد.

انواع متغیر

PHP هشت دارد انواع متفاوتمتغیرها ، که از آنها

4 نوع اسکالر:

  • بولی (بولی یا نوع بولی)
  • عدد صحیح
  • شناور (نقطه شناور)
  • رشته (رشته)

2 نوع مخلوط:

  • آرایه (آرایه)
  • هدف - شی

2 نوع خاص:

  • منبع

قبل از اینکه به بررسی بیشتر هر یک از انواع آن بپردازیم ، لازم به ذکر است که PHP نه یک زبان قوی تایپ شده ، بلکه یک زبان تایپ شده پویا است. این بدان معناست که نیازی به اعلام نوع هر متغیر از قبل (هنگام ایجاد) نداریم. PHP خود بر اساس آنچه که ما در این متغیر قرار می دهیم حدس می زند که این یا آن متغیر چه نوع دارد. این همچنین بدان معناست که برخلاف زبانهای قوی تایپ شده ، می توانیم یک رشته را در یک متغیر با یک عدد (عدد صحیح) گرفته و قرار دهیم و این یک خطا نخواهد بود! این یکی از ویژگی های PHP است که بین افرادی (مبتدیان) که قبلاً با برنامه نویسی سر و کار نداشته اند بسیار محبوب است. به عنوان یک قاعده ، در نهایت همه به این نتیجه می رسند که این یک منفی از زبان است و نه یک امتیاز.

بولی (بولی)- ساده ترین نوع این می تواند فقط 2 مقدار داشته باشد: درست است، واقعییا کاذب(درست یا غلط) ، آنها مستقل از حروف هستند (می توانید TRUE ، trUe و غیره بنویسید). یک مثال گویا:

echo $ name، "
"، $ name2؛؟>

نتیجه:

همانطور که می بینید ، مرورگر متوجه نمی شود نوع بولیبرخلاف PHP ، بنابراین هنگام تلاش برای خروجی درست است، واقعییا کاذباین شماره را در صفحه چاپ می کند 1 یا خط خالی.

هنگام تبدیل به بولی ، مقادیر زیر FALSE در نظر گرفته می شوند:

  • عدد صحیح 0 (صفر)
  • شناور شماره 0.0 (صفر)
  • رشته خالی و رشته "0" یا "0"
  • آرایه خالی
  • نوع ویژه NULL (شامل متغیرهای تنظیم نشده)

همه مقادیر دیگر TRUE در نظر گرفته می شوند.

// عدد اعشاری$ int = -5؛ // یک عدد منفی$ int = 05؛ // عدد هشت$ int = 0x1A ؛ // عدد هگزا دسیمال
// اعداد نقاط شناور (واقعی):$ flt = 1.4؛ $ flt = 1.2e3؛ $ flt = 7E-10؛ ؟>

با این حال ، رایج ترین نوع مورد استفاده در PHP را می توان دقیقاً در نظر گرفت رشته های... رشته ها را می توان به صورت نقل قول یک یا دو نوشت ، اما من هرگز به کسی توصیه نمی کنم که رشته ها را در نقل قول های دوگانه بنویسد ، زیرا با این کار شما مترجم PHP را مجبور می کنید که رشته شما را به دلیل وجود متغیرها در آن "تجزیه" کند ، که این امر ناچیز است. اما کار خود را کند کنید حتی اگر می خواهید از متغیرها در رشته خود استفاده کنید ، می توانید این کار را با استفاده از نقل قول های + (چسباندن دو یا چند رشته به یک) انجام دهید. بنابراین ، چرا به نقل قول های دوگانه حتی نیاز است؟ به عنوان مثال ، هنگامی که می خواهیم از نویسه های ویژه (\ n ، \ r و غیره) استفاده کنیم ، اما درباره آنها کمی دیرتر.

همچنین شایان ذکر است که با استفاده از نقل قول های تک + الحاقکد را بسیار خواندنی تر از قرار دادن همه چیز بی رویه در نقل قول های دوگانه می کند. اما به اندازه کافی پیشگفتار ، اکنون شما خودتان همه چیز را خواهید دید و درک خواهید کرد:

$ number = 2؛ // integer $ hand1 = "تعداد دستهای یک فرد:"؛ // string + آن را برای متغیرها تجزیه کنید$ hand2 = "تعداد دستهایی که یک فرد دارد:"؛ // رشته
// متغیر number $ را به این خطوط اضافه کنید:$ hand1 = "تعداد دستهایی که یک نفر دارد: $ number و بیشتر متن ..."؛ // من $ hand2 = "تعداد دست هایی که یک نفر دارد را توصیه نمی کنم". $ number. "و متن بیشتر ..." ؛ // توصیه!
echo $ hand1 ، "
"، $ hand2؛؟>

نتیجه:

ما در مقاله بعدی در مورد ترکیب بیشتر صحبت خواهیم کرد.

  • به آن ثابت داده شد خالی.
  • هنوز به آن معنا داده نشده است
  • با آن حذف شد تنظیم نشده ()

مطالعه انواع متغیرهای باقیمانده در این مرحله بی معنی خواهد بود. ما با بقیه انواع آشنا می شویم و با یادگیری عمیق PHP آنها را تجزیه می کنیم.

فرار در PHP

اما اگر نمی خواهیم مقدار یک متغیر را در خط خود بدست آوریم ، اما می خواهیم به معنای واقعی کلمه $ number بنویسیم چه؟ دو گزینه را در نظر بگیرید:

$ hand1 = "تعداد دست هایی که شخص دارد: \ $ number و متن بیشتر ..."؛ // من $ hand2 = "تعداد دستهایی که یک نفر دارد: $ number و بیشتر متن ..." را توصیه نمی کنم؛ // توصیه!
echo $ hand1 ، "
"، $ hand2؛؟>

نتیجه:

در نسخه اول (با نقل قول های دوگانه) ما از فرار از شخصیت ویژه دلار استفاده کردیم ، به همین دلیل این شخصیت خاص دیگر از هدف خاص خود (تعیین متغیرها) منصرف شد و به یک علامت معمولی دلار تبدیل شد.

در گزینه دوم (با نقل قول های تک) همانطور که قبلاً می دانید - مترجم PHP حتی سعی نکرد متغیرهایی را در رشته پیدا کند ، بنابراین هیچ فراری لازم نبود.

کاراکترهای خاص در PHP

مخصوصا برای خوانندگان وبلاگ سایتبر! من یک لیست کوچک از کاراکترهای خاص در زبان برنامه نویسی PHP تهیه کرده ام:

  • \ n خط جدید
  • بازگشت واگن
  • \ t برگه افقی
  • \\ پشت ضربه (پشت ضربه)
  • \ علامت دلار
  • \ "نقل قول دوگانه

بیایید کار شخصیت های خاص را با استفاده از مثال \ n - یک کاراکتر خاص که ترجمه می شود ، بررسی کنیم خط جدید(مانند Enter) ، اما مرورگرها آن را درک نمی کنند (و نباید) و آن را نادیده می گیرند ، اما نتیجه کار آن را می توان در کد منبعصفحات:

echo $ rule "
"، $ rule2؛؟>

نتیجه:

کد منبع (Ctrl + U):

اگر نویسه ویژه \ n برای بازدیدکنندگان در مرورگر نمایش داده نمی شود ، پس معنی آن چیست؟

در مرحله اول ، با استفاده از نویسه های خاص و \ n به طور خاص ، می توانید کد را به راحتی در صفحه قالب بندی کنید (مانند مثال بالا).

در مرحله دوم ، \ n می تواند مورد استفاده قرار گیرد ، به عنوان مثال ، در حین عملیات نوشتن فایل برای انتقال (Enter) و نوشتن در خط جدید ادامه دهید.

جایگزین این قالب بندی است.

نحو PHP heredoc

نتیجه:

کد منبع (Ctrl + U):

نتیجه به خودی خود صحبت می کند ، حالا بیایید بفهمیم همه چیز چگونه کار می کند:

  • خط با سه براکت زاویه ای شروع می شود<<<, далее следует имя идентификатора.
  • خط با شناسه باز (برچسب) به هیچ وجه نباید شامل هیچ کاراکتر دیگری بعد از آن ، از جمله فاصله باشد. به عبارت دیگر ، درست بعد از علامت ما باید Enter را بدون فاصله بگذاریم ، بلافاصله Enter!
  • ترجمه
  • آموزش

تزریق SQL ، جعل درخواست از طریق سایت ، XML خراب ... چیزهای ترسناک و ترسناک که همه ما می خواهیم از آنها در برابر آنها محافظت کنیم ، اما فقط باید بدانیم که چرا این اتفاق می افتد. این مقاله مفهوم اساسی پشت همه آن را توضیح می دهد: رشته ها و دستکاری رشته در رشته.

مشکل اصلی

این فقط یک متن است بله ، فقط متن مشکل اصلی است. تقریباً همه چیز در یک سیستم کامپیوتری با متن نشان داده می شود (که به نوبه خود با بایت نشان داده می شود). با این تفاوت که برخی از متون برای رایانه در نظر گرفته شده اند ، در حالی که برخی دیگر برای افراد هستند. اما آن ها ، و آن ها ، هنوز متن باقی می مانند. برای درک آنچه که در مورد آن صحبت می کنم ، یک مثال کوچک ارائه می دهم:
همو ساپینز فرض کنید ، متن انگلیسی وجود دارد ، که من نمی خواهم آن را به روسی ترجمه کنم

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

با این حال ، ما می خواهیم قسمت های خاصی از این متن برای رایانه ما معنی داشته باشد. ما می خواهیم کامپیوتر بتواند نویسنده متن و خود متن را جداگانه استخراج کند تا بتوانیم کاری با آن انجام دهیم. به عنوان مثال ، موارد بالا را به این مورد تبدیل کنید:
فرض کنید ، متن انگلیسی وجود دارد که من نمی خواهم آن را توسط همو ساپینز به روسی ترجمه کنم
چگونه کامپیوتر می داند چگونه این کار را انجام دهد؟ خوب ، زیرا ما به راحتی قسمتهای خاصی از متن را با کلمات ویژه در داخل پرانتزهای خنده دار مانند و پیچیده ایم. از آنجا که ما این کار را انجام داده ایم ، می توانیم برنامه ای بنویسیم که این قسمتهای خاص را جستجو کند ، متن را استخراج کرده و از آن برای اختراع خودمان استفاده کنیم.

به عبارت دیگر ، ما از قوانین خاصی در متن خود برای نشان دادن معنای خاصی استفاده کردیم که شخصی با رعایت همان قوانین می تواند از آن استفاده کند.
خوب ، درک این همه سخت نیست اما اگر بخواهیم از این پرانتزهای خنده دار که دارای معنی خاصی در متن ما هستند استفاده کنیم ، اما بدون استفاده از این معنا چطور؟ .. مانند این:

همو ساپینز < n and y >

نمادها "<" и ">"چیز خاصی نیست. آنها می توانند به طور قانونی در هر کجا ، در هر متنی ، مانند مثال بالا ، مورد استفاده قرار گیرند. اما نظر ما در مورد کلمات خاص ، مانند چیست؟ آیا این بدان معناست که آن نیز نوعی کلمه کلیدی است؟ در XML ، ممکن است بله ، یا شاید هم نه. این مبهم است. از آنجا که رایانه ها در مدیریت ابهامات چندان خوب نیستند ، اگر در i ها نقطه ای نزنیم و ابهام نزنیم ، چیزی در نهایت ممکن است نتیجه ای غیر منتظره به همراه داشته باشد.
شما می توانید این معضل را با جایگزینی نمادهای مبهم با چیزی بدون ابهام حل کنید.
همو ساپینز ریاضیات پایه به ما می گوید که اگر x< n and y >n ، x نمی تواند بزرگتر از y باشد.

در حال حاضر ، متن باید کاملاً بدون ابهام باشد. "<" равносильно "<", а ">" - ">".
تعریف فنی این است - محافظ ، هنگامی که نمی خواهیم شخصیت های خاص معنای خاص خود را داشته باشند ، از شخصیت های خاص اجتناب می کنیم.
فرار | iˈskāp | [بدون obj. ] آزاد شوید [با obj. ] توجه نکنید / به خاطر ندارید [...] [با obj. ] IT: دلیل تفسیر متفاوت [...]
اگر برخی از کاراکترها یا توالی شخصیت ها در متن دارای معنی خاصی هستند ، باید قوانینی در مورد چگونگی حل موقعیتهایی که در آن از این کاراکترها بدون استناد به معنی خاص آنها استفاده می شود ، وجود داشته باشد. یا به عبارت دیگر ، فرار به این س answersال پاسخ می دهد: "اگر این شخصیت ها بسیار خاص هستند ، چگونه از آنها در متن خود استفاده کنم؟".
همانطور که در مثال بالا مشاهده می کنید ، ampersand (&) نیز یک کاراکتر خاص است. اما اگر بخواهیم بنویسیم چه می شود "<", но без интерпретации этого как "<"? В XML, escape-последовательность для &, это - " & ", т.е. мы должны написать: " &< "

نمونه های بیشتر

XML تنها مورد "رنج" شخصیت های خاص نیست. هر کد منبع ، در هر زبان برنامه نویسی ، می تواند این را نشان دهد:
var name = "Homo Sapiens"؛ var content = "فرض کنید ، متن انگلیسی وجود دارد ، که من نمی خواهم آن را به روسی ترجمه کنم" ؛
ساده است - متن معمولی با نقل قول های دوگانه به وضوح از "غیرمتنی" جدا می شود. به همین ترتیب ، می توانید از متن من در درس تجزیه و تحلیل ریاضی استفاده کنید:
var name = "Homo Sapiens"؛ var content = "ریاضیات پایه به ما می گوید که اگر x< n and y >n ، x نمی تواند بزرگتر از y باشد. "؛
سرد! و حتی لازم نیست به غربالگری متوسل شوید! اما صبر کنید ، اگر بخواهم از کسی نقل قول کنم ، چه؟
var name = "Homo Sapiens"؛ var content = "گفته می شود که افلاطون یکبار گفته است" Lorem ipsum dolor sit amet "."؛
هوم ... غم ، حسرت. به عنوان یک انسان ، می توانید تعیین کنید که متن در کجا شروع و پایان می یابد و نقل قول کجاست. با این حال ، این دوباره برای هر رایانه مبهم شد. ما باید برخی از قوانین فرار را ارائه دهیم که به ما کمک می کند بین "و" تحت اللفظی ، که به معنی پایان متن است ، تمایز قائل شویم. اکثر زبانهای برنامه نویسی از خط افقی جلو استفاده می کنند:
var name = "Homo Sapiens"؛ var content = "گفته می شود که افلاطون یکبار گفته است \" Lorem ipsum dolor sit amet \ "."؛
"\" باعث می شود که شخصیت بعد از آن غیر خاص شود. اما این بدان معناست که "\" یک کاراکتر خاص است. برای نوشتن بدون ابهام این کاراکتر در متن ، همین نویسه را با نوشتن عبارت "\\" به آن اضافه کنید. خنده دار است ، اینطور نیست؟

حمله!

اگر آنها فقط مجبور به فرار باشند ، آنقدرها هم بد نخواهد بود. البته تنش دارد ، اما چندان هم بد نیست. مشکلات زمانی شروع می شوند که برخی برنامه ها برای برنامه های دیگر متن می نویسند تا بتوانند آن را "بخوانند". و نه ، این یک داستان علمی تخیلی نیست ، همیشه اتفاق می افتد. به عنوان مثال ، در این سایت ، وقتی پیام را منتشر می کنید ، آن را به صورت دستی در قالب HTML تایپ نمی کنید ، بلکه فقط متن می نویسید ، که در نتیجه ، توسط این سایت به HTML تبدیل می شود ، پس از آن ، مرورگر تبدیل می شود HTML "ایجاد شده" دوباره به متن قابل خواندن تبدیل می شود.

مثال رایج و منبع بسیاری از مشکلات امنیتی ، پرس و جوهای SQL است. SQL زبانی است که برای ساده سازی ارتباط با پایگاه داده طراحی شده است:
عملاً هیچ کاراکتر خاصی در این متن وجود ندارد ، بیشتر کلمات انگلیسی هستند. با این حال ، تقریباً هر کلمه در SQL معنای خاصی دارد. این مورد در بسیاری از زبان های برنامه نویسی در سراسر جهان به این شکل استفاده می شود ، به عنوان مثال:
$ query = "SELECT phone_nummer from users WHERE name =" Alex ""؛ $ result = mysql_query ($ query)؛
این دو خط ساده وظیفه بسیار پیچیده درخواست برنامه از پایگاه داده ای را که نیازهای ما را برآورده می کند ، دور می کند. پایگاه داده شاید ترابایت بیت و بایت را "غربال" می کند تا یک نتیجه قالب بندی شده خوب را به برنامه ای که درخواست می دهد برگرداند. به طور جدی ، همه این مزخرفات در یک جمله ساده شبیه انگلیسی قرار گرفته است.

به منظور مفید بودن این مورد ، درخواست هایی مانند این سخت کدگذاری نمی شوند ، بلکه بر اساس ورودی کاربر است. این همان پیشنهاد برای کاربران مختلف است:
$ name = $ _POST ["name"]؛ $ query = "SELECT phone_number from users WHERE name =" $ name ""؛ $ result = mysql_query ($ query)؛
در صورتی که فقط در حال مرور این مقاله هستید: این یک ضد مثال است! این بدترین کاری است که می توانید انجام دهید! این یک کابوس امنیتی است! هر بار که چنین چیزی می نویسید ، یک بچه گربه بی گناه می میرد! Cthulhu برای این کار روح شما را می بلعد!

حالا ببینیم اینجا چه خبر است. $ _POST ["name"] مقداری است که برخی از کاربران تصادفی در وب سایت تصادفی شما وارد فرم تصادفی کرده اند. برنامه شما یک پرس و جو SQL با استفاده از این مقدار به عنوان نام کاربری که می خواهید در پایگاه داده پیدا کنید ایجاد می کند. سپس این "دستور" SQL مستقیماً به پایگاه داده ارسال می شود.

صداش چندان بد نیست ، درست است؟ بیایید سعی کنیم برخی از مقادیر تصادفی را که می توانید در وب سایت تصادفی خود وارد کنید وارد کنید و چه پرس و جوهایی از آن به دست می آید:

الکس
انتخاب شماره_تلفن از کاربران WHERE name = "Alex"
مک دونالد
انتخاب شماره_تلفن از کاربران WHERE name = "Mc" Donalds "
جو "؛ کاربران جدول DROP ؛ -
انتخاب شماره_تلفن از کاربران WHERE name = "Joe"؛ کاربران DROP TABLE ؛ - "
اولین پرسش ترسناک به نظر نمی رسد ، اما بسیار زیبا است ، درست است؟ به نظر می رسد شماره 2 "تا حدی" به نحو ما به دلیل ابهام آسیب می رساند. "لعنت بر آلمانی! شماره 4 به نوعی احمقانه است. چه کسی این را می نویسد؟ منطقی نیست ...
اما نه برای پایگاه داده که درخواست را پردازش می کند ... پایگاه داده هیچ ایده ای ندارد که این درخواست از کجا آمده است و باید به چه معنا باشد. تنها چیزی که او می بیند دو پرس و جو است: شماره کاربر به نام جو را بیابید ، و سپس جدول کاربران (همراه با نظر ") را رها کنید ، و این با موفقیت انجام می شود.

این نباید برای شما خبری باشد اگر چنین است ، لطفاً این مقاله را دوباره بخوانید ، زیرا یا تازه وارد برنامه نویسی شده اید یا در 10 سال گذشته در غار زندگی کرده اید. این مثال اصول اولیه تزریق SQL مورد استفاده در سراسر جهان را نشان می دهد. به منظور حذف داده ها ، یا دریافت داده هایی که نباید فقط دریافت شوند ، یا ورود به سیستم بدون داشتن حق انجام این کار و غیره. و همه به این دلیل که DB "جمله" انگلیسی را به معنای واقعی کلمه می گیرد.

خخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخخ

مرحله بعدی: حملات XSS. آنها به همان شیوه کار می کنند ، فقط در HTML اعمال می شوند.
فرض کنید مشکلات پایگاه داده را حل کرده اید ، داده ها را از کاربر دریافت می کنید ، آنها را در پایگاه داده می نویسید و برای دسترسی کاربران به وب سایت ارسال می کنید. این همان کاری است که یک انجمن معمولی ، سیستم اظهار نظر و غیره انجام می دهد. جایی در سایت شما چیزی شبیه به این وجود دارد:

ارسال شده توسطبر


اگر کاربران شما خوب و مهربان باشند ، نقل قول هایی از فیلسوفان قدیمی ارسال می کنند و پیام ها چیزی شبیه به این خواهد بود:

ارسال شده توسط افلاطون در 2 ژانویه ، 15:31

گفته می شود که من گفته ام "Lorem ipsum dolor sit amet، consectetur adipisicing elit، sed do eiusmod tempor incididunt ut û labore magna aliqua. Ut enim ad minim veniam، quis nostrud exercise ullamco labis nisi ut aliquip ex ea commodo resultat."


اگر کاربران باهوش هستند ، احتمالاً در مورد ریاضی صحبت خواهند کرد ، و پیامها به این شکل خواهند بود:

ارسال شده توسط پاسکال در 23 نوامبر ، 04:12

ریاضیات پایه به ما می گوید که اگر x< n and y >n ، x نمی تواند بزرگتر از y باشد.


هوم ... باز هم این هتک حرمت براکت های ما. خوب ، از نظر فنی ، آنها ممکن است مبهم باشند ، اما مرورگر ما را از این امر می بخشد ، درست است؟


خوب ، STOP ، چه جهنمی؟ آیا برخی جوکرها برچسب های جاوا اسکریپت را به انجمن شما معرفی کرده اند؟ هر کسی که به این پست در سایت شما نگاه می کند ، در حال بارگیری و اجرای اسکریپت هایی در زمینه سایت شما است که ممکن است کاری انجام ندهد. و این خوب نیست.

نباید به معنای واقعی کلمه برداشت شود

در موارد فوق ، ما می خواهیم به نحوی به پایگاه داده یا مرورگر خود بگوییم که این فقط یک متن است ، با آن کاری نکنید! به عبارت دیگر ، ما می خواهیم معانی خاص همه شخصیت های خاص را "حذف" کنیم و کلید واژه هااز هر گونه اطلاعات ارائه شده توسط کاربر ، زیرا ما به او اعتماد نداریم. چه باید کرد؟

چی؟ چی میگی پسر؟ اوه ، شما می گویید "محافظ"؟ و شما کاملاً درست می گویید ، یک کوکی بخورید!
اگر قبل از ترکیب داده با کاربر عبارت فرار از فرار را به درخواست کاربر اعمال کنیم ، مشکل حل می شود. برای درخواست های پایگاه داده ما چیزی شبیه به این خواهد بود:
$ name = $ _POST ["name"]؛ $ name = mysql_real_escape_string ($ name)؛ $ query = "SELECT phone_number from users WHERE name =" $ name ""؛ $ result = mysql_query ($ query)؛
فقط یک خط کد ، اما اکنون هیچ کس دیگری نمی تواند پایگاه داده ما را "هک" کند. بیایید ببینیم پرس و جوهای SQL بسته به ورودی کاربر چگونه ظاهر می شوند:
الکس
انتخاب شماره_تلفن از کاربران WHERE name = "Alex"
مک دونالد
انتخاب شماره_تلفن از کاربران WHERE name = "Mc \" Donalds "
جو "؛ کاربران جدول DROP ؛ -
انتخاب شماره_تلفن از کاربران WHERE name = "Joe"؛ کاربران DROP TABLE ؛ - "
mysql_real_escape_string بدون علامت یک برش جلو را در مقابل هر چیزی که ممکن است معنای خاصی داشته باشد قرار دهد.


ما تابع htmlspecialchars را قبل از نمایش آن روی همه داده های کاربر اعمال می کنیم. اکنون پیام آفت به این شکل است:

ارسال شده توسط JackTR در 18 جولای ، 12:56


توجه داشته باشید که مقادیر دریافتی از کاربران در واقع "خراب" نیستند. هر مرورگری این را به عنوان HTML تجزیه می کند و همه چیز را به شکل صحیح نمایش می دهد.

که ما را به عقب برمی گرداند ...

همه موارد فوق یک مشکل مشترک در بسیاری از سیستم ها را نشان می دهد: اگر تصور می شود که متن در متن فاقد کاراکتر خاصی است ، باید از آن فرار کرد. هنگام قرار دادن مقادیر متن در SQL ، باید طبق قوانین SQL از آنها فرار کرد. هنگام قرار دادن مقادیر متنی در HTML ، باید طبق قوانین HTML از آنها فرار کرد. هنگام قرار دادن مقادیر متن در (نام فناوری) ، باید طبق قوانین (نام فناوری) از آنها فرار کرد. فقط همین.

برای کامل بودن

البته روشهای دیگری برای برخورد با ورودی کاربر وجود دارد که باید یا نباید شامل نویسه های خاصی باشد:
  • اعتبار سنجی
    می توانید بررسی کنید که آیا ورودی کاربر با برخی از مشخصات داده شده مطابقت دارد یا خیر. اگر برای وارد کردن یک شماره نیاز دارید و کاربر چیز دیگری را وارد می کند ، برنامه باید این را به او اطلاع داده و ورودی را لغو کند. اگر همه اینها به درستی سازماندهی شده باشند ، هیچ خطری برای گرفتن "کاربران DROP TABLE" در جایی که کاربر قرار بود "42" را وارد کند وجود ندارد. اجتناب از تزریق HTML / SQL چندان عملی نیست زیرا غالباً لازم است متن آزاد را که ممکن است حاوی "شکاف" باشد ، بپذیرید. اعتبارسنجی معمولاً علاوه بر سایر اقدامات مورد استفاده قرار می گیرد.
  • ضدعفونی کردن
    همچنین می توانید "بی سر و صدا" هرگونه کاراکتری را که خطرناک می دانید حذف کنید. به عنوان مثال ، به سادگی هر چیزی را که شبیه یک تگ HTML است حذف کنید تا از افزودن به انجمن خود جلوگیری کنید. مشکل این است که می توانید قسمت های مشروع متن را حذف کنید.
    دستورات SQL آماده شده است
    توابع خاصی هستند که آنچه را که ما می خواستیم انجام می دهند: به پایگاه داده تفاوت بین پرس و جو SQL و اطلاعات ارائه شده توسط کاربران را بفهمید. در PHP ، آنها چیزی شبیه به این هستند:
    $ stmt = $ pdo-> آماده کردن ("انتخاب شماره تلفن از کاربران WHERE name =؟")؛ $ stmt-> اجرا ($ _ POST ["name"]) ؛
    در همان زمان ، ارسال در دو مرحله انجام می شود و بین درخواست و متغیرها به وضوح تمایز قائل می شود. پایگاه داده این قابلیت را دارد که ابتدا ساختار درخواست را بفهمد و سپس آن را با مقادیر پر کند.

  • در دنیای واقعی ، همه اینها با هم برای درجات مختلف حفاظت استفاده می شوند. شما همیشه باید از اعتبار سنجی استفاده کنید تا مطمئن شوید کاربر اطلاعات معتبری را وارد می کند. سپس می توانید (اما لازم نیست) داده های وارد شده را اسکن کنید. اگر کاربر به وضوح سعی می کند اسکریپتی را برای شما "بوی" کند ، می توانید آن را به سادگی حذف کنید. سپس ، همیشه ، همیشه باید قبل از قرار دادن داده های کاربر در پرس و جو SQL (این مورد در مورد HTML نیز صدق می کند) فرار کنید.

در مرجع عبارت عادی ، بخشی به نام " شخصیت های متا (فرار)". این دقیقاً در مورد این نمادهای متا (به آنها شخصیت های ویژه نیز گفته می شود) است که ما در این مقاله در مورد آنها صحبت خواهیم کرد."

نمادهای خاصآن دسته از کاراکترهایی هستند که حروف یا اعداد نیستند. یعنی همه اینها نماد هستند ، به جز حروف و اعداد.

کاراکترهای ویژه نمادهایی مانند نقطه ، ستاره ، بعلاوه ، علامت سوال ، هش و موارد دیگر هستند.

همانطور که از مقالات قبلی می دانیم ، برخی از شخصیت های خاص نقش ویژه ای در عبارات با قاعده... یعنی هر شخصیت خاصی نوعی بازنمایی دارد.

به عنوان مثال ، نقطه به معنای مطلق هر کاراکتر است. ستاره کمی سنجی تکراری از صفر تا بی نهایت است. بعلاوه یک اندازه گیر تکراری از یک تا بی نهایت است. کاراکتر خیالی ^ به معنی آغاز یک خط و علامت دلار ($) به معنی پایان خط است. به هر حال ، نماد دلار نیز یک نماد خیالی است. ما همچنین می دانیم که نماد ^ نقش دیگری دارد اگر آن را داخل پرانتز قرار دهیم. ما در مقالات قبلی در مورد همه این ارزشها صحبت کردیم.

در این مقاله به این سوال پاسخ می دهم " نحوه استفاده از نویسه های خاص در بیان منظم ".

برای لغو این نقش ویژه ، یک شخصیت خاص در یک بیان منظم به آن نیاز دارد سپر... بنابراین ، این شخصیت ویژه دقیقاً نشان دهنده شخصیتی است که وجود دارد. یعنی یک نقطه فرار شده دقیقاً به معنی یک نقطه است و نه هر کاراکتری. یک ستاره فرار به معنی یک ستاره است ، نه یک اندازه گیرنده تکراری.

محافظبا ضربه پشت انجام شد به این معنا که برای فرار از برخی از شخصیت های خاص ، باید یک ضربه پشتی را قبل از آن قرار دهید.

فرض کنید ما چنین وظیفه ای داریم "بررسی کنید آیا دوره در انتهای خط است". بنابراین ، برای اینکه این نقطه در عبارت معمولی دقیقاً یک نقطه باشد و نه هیچ کاراکتر دیگری ، لازم است از آن فرار کنیم.

Var str = "او قهرمان است."؛ var reg = /.*\.$/؛ هشدار (reg.test (str)) ؛ // true

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

دیگر شخصیت های خاص نیز به همین ترتیب فرار می کنند.

Var str = "x + y = .n * m = /، co \\ la"؛ var reg = /x\+y=\.n\*m=\/،co\\\la/؛ هشدار (reg.test (str)) ؛ // true

در اینجا ما بعلاوه (\ +) ، نقطه (\.) ، ستاره (\ *) ، علامت بریده بریده معمولی (\ /) و پشت خط (\\\) فرار کرده ایم. توجه داشته باشید که عکس پشت خطی در یک رشته با دو پشت خط نوشته می شود. و در یک عبارت معمولی ، همچنین با استفاده از دو خط پشت ، فرار می کند.

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

همه آن نویسه هایی که در مرجع ، در بخش متا کاراکترها نشان داده شده اند ، به همان شیوه فرار می کنند.

و این احتمالاً همه است. از این مقاله کوچک ، شما قبلاً می دانید چگونه از شخصیت های خاص فرار کنیمو نحوه استفاده از آنها در ساختن عبارات معمولی.

وظایف

  1. فرض کنید ما باید انطباق را بررسی کنیم ، چنین خطی "من 400 دلار برنده شدم". یک عبارت منظم بنویسید که علامت دلار را در انتهای یک خط بررسی کند. رشته را برای مطابقت بررسی کنید.