ویژگی های XML چه زمانی باید از نقل قول مضاعف در XML فرار کرد

هدف این درس:

  1. BI باید فرمت رکورد زبان XML را بداند
  2. BI باید بتواند سند را در قالب کد XML فرمت کند
  3. BI باید انواع داده ها را بشناسد و بتواند از آنها استفاده کند

توجه: زبان XML آنقدر که در این درس توضیح دادیم مختصر نیست. ما فقط آن دسته از ویژگی های زبان XML را در نظر می گیریم که در سیستم ODA-TM استفاده می شود.

xml بنیاد

XML برای ساختار، ذخیره و انتقال اطلاعات ایجاد شده است.

مثال زیر، "یادداشت از یک دوست به یک دوست"، یک فرم XML دارد:

نیکلاس ایوانا یادآور امیدوارم جلسه ما را فراموش نکرده باشید

از نظر بصری، این کد را می توان به شکل زیر نشان داد (شکل 1.).

کد دارای فرستنده و گیرنده اطلاعات است، همچنین دارای سربرگ و بدنه پیام است.

این به معنای پردازش، ارسال و نمایش توسط شخصی است.

اما همچنان، این سند XML هیچ کاری انجام نمی دهد. این فقط اطلاعاتی است که در برچسب ها پیچیده شده است.

XML - درخت

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

برچسب های خود را با XML ایجاد کنید

برای ایجاد برچسب ها (توصیف کننده ها، عناصر) فرمت استانداردوجود ندارد.

زبان XML تگ های از پیش تعریف شده ای ندارد.

  • XML به نویسنده اجازه می دهد تا تگ های خود و ساختار سند خود را تعریف کند.
  • XML برای انتقال داده ها استفاده می شود
  • XML یک ابزار مستقل نرم افزار-سخت افزار برای انتقال اطلاعات است.
  • XML در حال حاضر به اندازه HTML برای وب مهم است
  • XML رایج ترین ابزار برای انتقال داده ها بین برنامه های مختلف است.
  • XML در بسیاری از جنبه های توسعه وب استفاده می شود، اغلب برای آسان کردن ذخیره و به اشتراک گذاری داده ها.

نحو XML

سینتکس قوانین XML بسیار ساده و منطقی است

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

نظرات

اگر نیاز به ساختن چند قطعه دارید سند XMLبه طور کلی برای برنامه تحلیلگر "نامرئی" است، سپس می توان آن را به عنوان یک نظر با نوشتن کاراکترهای قبل از آن قالب بندی کرد. < !-- ، به دنبال نمادها --> با دو خط تیره پشت سر هم

مثلا:

< !-- Это комментарий -->

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

این نحو نظر دو محدودیت بر آن اعمال می کند:

  • دو خط تیره پشت سر هم در کامنت قابل نوشتن نیستند.
  • یک نظر را نمی توان با خط فاصله پایان داد.

عناصر XML

یک عنصر XML همه چیز از تگ شروع عنصر تا تگ پایان است.

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

  • عناصر دیگر
  • متن
  • ویژگی های
  • یا ترکیبی از تمام موارد بالا...

قوانین نامگذاری XML

عناصر XML باید از این قراردادهای نامگذاری پیروی کنند:

  • نام ها می توانند شامل حروف، اعداد و کاراکترهای دیگر باشند
  • نام ها نمی توانند با عدد یا علامت نگارشی شروع شوند
  • نام ها نمی توانند دارای فاصله باشند

ویژگی های

صفات ارائه می کنند اطلاعات تکمیلیدر مورد عناصری که بخشی از داده ها نیستند.

در مثال زیر، نوع فایل به داده ها بی ربط است، اما مهم است نرم افزار، که می تواند عنصر را دستکاری کند:

computer.gif

ویژگی های XML باید در گیومه محصور شوند

مقادیر ویژگی همیشه باید نقل قول شوند. می توان از نقل قول های تک یا دوگانه استفاده کرد. مثال: برای تعیین جنسیت یک فرد می توان یک عنصر را به این صورت نوشت:

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

یا می توانید از اشیاء نمادین استفاده کنید: & &

چند نمونه از استفاده از نوع داده Date

تاریخ به عنوان یک ویژگی

توو جانی یادآور این آخر هفته منو فراموش نکن!

تاریخ به عنوان یک عنصر

10/01/2008 توو جانی یادآور این آخر هفته منو فراموش نکن!

تاریخ به عنوان یک عنصر توسعه یافته

10 01 2008 توو جانی یادآور این آخر هفته منو فراموش نکن!

ویژگی های فراداده

از این شناسه ها می توان برای شناسایی عناصر XML استفاده کرد.

مثال:

توو جانی یادآور این آخر هفته منو فراموش نکن!

جانی توو پاسخ: یادآوری من نمی خواهم

داده های مربوط به داده ها باید به عنوان ویژگی ها ذخیره شوند و خود داده ها باید به عنوان عناصر ذخیره شوند.

xml نوع داده

انواع ساده داخلی

تاریخ و زمان

  • وقت قرارحاوی تاریخ و زمان در قالب است CCYY-MM-DTh:mm:ss
  • مدت زمان- نشان دهنده مدت زمان است که در مؤلفه های روز، ساعت، دقیقه و ثانیه میلادی بیان می شود.

به عنوان مثال: رکورد P1Y2M3DT10H30M45Sیعنی یک سال (1Y)، دو ماه (2M)، سه روز (3DT)، ده ساعت (10H)، سی دقیقه (30M) و 45 ثانیه (45S).

ورودی را می توان به اختصار P120M به معنای 120 ماه و T120M به معنای 120 دقیقه نامید.

  • زمانشامل زمان در قالب معمولی است hh:mm:ss
  • تاریخحاوی تاریخ در قالب است CCYY-MM-DD
  • gYearMonthسال و ماه را در قالب استخراج می کند CCYY-MM
  • سالبه معنی سال در قالب است CCYY
  • gMonthDayشامل ماه و روز در قالب است MM-DD
  • gDayروز ماه در قالب DD
  • gMonthماه در قالب MM

رشته های کاراکتر

رشته- نوع شخصیت اصلی

رشته‌ای از کاراکترها به‌عنوان دنباله‌ای از کاراکترهای یونیکد، از جمله کاراکترهای Space، Tab، Carriage return و line feed.

  • normalizedString- نوع subtype رشته هایی هستند که حاوی خط "\n"، "\r" و برگه افقی "\t" نیستند.
    • نشانه- هیچ نوع فرعی از نوع نرمال‌شده‌ی String، به‌علاوه فضاهای پیشرو و انتهایی و چندین فضای متوالی وجود ندارد.
      • زبان- توکن زیرنوع، تعریف شده برای ثبت نام زبان طبق توصیه RFC 1766، به عنوان مثال ru, en, de, fr.
      • NMTOKEN- زیرنوع نشانه، فقط در ویژگی ها برای ثبت مقادیر شمارش شده آنها استفاده می شود.
      • نام- زیرنوع رمز، نام‌های XML را تشکیل می‌دهند - دنباله‌ای از حروف، اعداد، خط فاصله، نقطه‌ها، دو نقطه، زیرخط، شروع با یک حرف (به جز دنباله حروف رزرو شده X، x، M، m، L، lدر هر ترکیبی از موارد) یا کاراکتر زیر خط. نام هایی که با یک رشته شروع می شوند xmlتوسط خود مشخصات XML استفاده می شود.
        • NCName- نام زیرنوع، بدون دو نقطه. سه زیرگروه تعریف شده است: ID، IDREF، ENTITY

انواع باینری

  • بولن- باینری، منطقی. مقادیر را می پذیرد: True یا False (1 یا 0)
  • base64 باینری- اعداد صحیح باینری کدگذاری شده Base64
  • hexBinary- اعداد صحیح باینری به شکل هگزا دسیمال بدون هیچ کاراکتر اضافی

اعداد واقعی

  • اعشاریاعداد واقعی هستند که با یک نقطه ثابت نوشته می شوند: 123.45، -0.48747798، و غیره.
  • دو برابرو شناورانواع مطابق با استاندارد IEEE754-85، نوشته شده به عنوان نقطه ثابت یا شناور است.

تمام اعداد

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

از 1.7976931348623157Е+308 تا 2.2250738585072014Е-308

  • ترجمه
  • آموزش

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

مشکل اصلی

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

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

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

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

انسان خردمند < n and y >

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

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

نمونه های دیگر

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

حمله کن!

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

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

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

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

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

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

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

وپریییییید!

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

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


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

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

گفته شده است که گفته ام "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.


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

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

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


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


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

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

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

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


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

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


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

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

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

برای تکمیل تصویر

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

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

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

با این حال، من هنوز به مرورگری برخورد نکرده‌ام که به عنوان یک نقل قول، کاراکتر ساده « خارج از هر برچسبی را نشان نمی‌دهد. بنابراین بگویید: همکاران عزیز، شاید استفاده از "خارج از برچسب ها به سادگی خسته کننده است که هیچ کس به آن نیاز ندارد؟ شما می توانید با آرامش و بدون هیچ حرف دیگری بنویسید"؟ به خصوص در متونی که گیومه های زیادی وجود دارد و رعایت قوانین سختگیرانه طراحی (در مورد استفاده صحیح از گیومه های ملی) اهمیتی ندارد.

IMHO ، بسیاری از مردم این کار را انجام می دهند ... اما سؤال کاملاً واضح نیست: اگر می دانید که طبق استانداردها باید نقل قول هایی مانند " بنویسید ، اما با تنبلی ، علیرغم این واقعیت که بسیاری از سایت ها اینگونه کار می کنند ، پس چه آیا انتظار شنیدن دارید؟ من فکر می کنم که آیا نمایش نقل قول ها در نسخه های جدید مرورگرها پشتیبانی می شود یا خیر، هیچ کس نمی داند، بنابراین به احتمال زیاد می توانیم یک توصیه واضح ارائه دهیم: اگر در آینده نمی خواهید مشکلی ایجاد شود، بچسبید طبق استانداردها 100% :) اما شما قبلاً این را می دانید. یا منتظر تأیید هستید: بله، خسته کننده بودن فقط همین است، فراموشش کنید و 10 سال دیگر همه چیز یکسان خواهد بود، من (مایکروسافت، موزیلا و غیره) تضمین می کنم؟

لین "مرد قهوه" [پرونده]
بله، اتفاقا ... اکنون خواندن آن مفید است، در هیچ کجا گفته نشده است که نقل قول ها باید به عنوان "نمایش داده شوند
http://www2.stack.ru/~julia/HTML401/charset.html:

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

در مورد چی نیازدقیقاً از نهادی که فقط در مورد آن گفته شده است استفاده کنید<, >و &:

اگر نویسنده بخواهد شخصیت را قرار دهد "<", во избежание возможной путаницы с началом тега (метка начала тега) он должен использовать ссылку "<" (کد اعشاریاسکی 60). به طور مشابه، برای جلوگیری از مشکلات ناشی از پذیرش نادرست کاراکترهای ">" به عنوان تگ های پایانی (نشانگر پایان برچسب)، از مرجع ">" (ASCII 62 اعشاری) استفاده کنید.

برای جلوگیری از سردرگمی با ارجاعات کاراکتر (نشانگر شروع مرجع نویسه)، باید از مرجع "&" (کد اعشاری ASCII 38) به جای "&" استفاده شود. علاوه بر این، مرجع "&" نیز باید در مقادیر ویژگی استفاده شود، زیرا ارجاعات کاراکتر در مقادیر ویژگی CDATA مجاز است.

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

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

یا در نهایت چگونه خودتان این کار را انجام می دهید؟

&، به هر حال، یک سوال مشابه ایجاد می کند. سند فوق می گوید "برای جلوگیری از سردرگمی". اما سردرگمی تنها در صورتی امکان پذیر است که & با یکی از کدهای ارائه شده دنبال شود. اگر مثلاً یک URL مانند "..../script?A=1&B=2" باشد چه؟ آیا اگر اشتباهاً URL را به عنوان href (که البته در طول آزمایش به درستی کار می کند) مشخص کنم، خطری را تهدید می کنم؟ هر چیزی غیر از وضعیت بسیار بعید که در 10 سال (زمانی که سایت قدیمی است یا قبلاً ده بار بازنویسی شده است) موجودی با نام عجیب و غریب &B بدون تریلر وجود داشته باشد. ? به عبارت دیگر چقدر باید همه این موارد را با دقت بررسی کرد؟

دانیال، اگر مطمئن هستید که با کدهای موجود مشکلی ندارید، می توانید به سادگی & بنویسید. اگر یک کد جدید در آینده ظاهر شود، فکر می‌کنم به صراحت اعلام می‌شود که در مشخصات HTML 4.01 نیست، بنابراین نباید روی سندی که به طور معمول اعلام شده است تأثیر بگذارد. یا انتظار دارید که از استانداردهای آینده پشتیبانی کنید تغییر سادهطرح واره سند؟

دانیل آلیوسکی [پرونده]
در XML، یک نقل قول معمولی به عنوان متن نیز مشکلی ایجاد نمی کند (به ترتیب، در XHTML، البته). نقل قول های IMHO معمولاً فقط به یک دلیل به "" ترجمه می شوند - شما نمی خواهید دو تابع بنویسید تا متن را به شکل ایمن در هنگام جایگزینی در XML / HTML / XHTML بنویسید.