تابع htmlentities و htmlspecialchars در php

  • آپدیت شده در تاریخ

تابع htmlentities و htmlspecialchars در php ، از توابع کار با رشته ها در زبان php است . معمولا ، اینکد (encode) کاراکتر به روش های مختلفی با بسیاری از توابع انجام می شود . تابع urlencode و urlencode برای تبدیل یک سری از کاراکتر های خاص در آدرس URL به فرمت %(HEX) استفاده می شود . تابع دیگر nl2br() ، که برای ایجاد خط جدید با تبدیل آنها به <br> در html استفاده می شود .

مشابه موارد بالا ، تابع htmlentities در php ، تمامی کاراکترهای ورودی فرم را به کاراکتر های رزرو شده html یا همان html entity ها تبدیل می کند. این گونه تبدیل ها با تابع htmlentities در php باعث جلوگیری از ذخیره داده هایی که ممکن است باعث به خطر انداختن امنیت اپلیکیشن تحت وب ما شود یا در کوئری SQL به کار رود ، می شود .

برای مثال ، اگر مقادیر وارد شده در یک فیلد را به صورت مستقیم در کوئری SQL خود استفاده کنیم  و کاربر یک ‘ (single quotes) را همراه با متن ، ارسال کند ، یک خطایی در درخواست ما به دیتابیس رخ می دهد . خب تا اینجا مشکل زیادی وجود ندارد ولی اگر کاربر ، یک هکر یا نفوذگر باشد ، با استفاده از تکنیک SQL Injection کوئری های مخرب را ارسال می کند . اینجاست که احتمال هک شدن سایت و لو رفتن تمام اطلاعات دیتابیس ، بالا می رود . اگر ورودی کاربر از فرم را همانگونه در دیتابیس ذخیره و در جایی دیگر نمایش دهید هم احتمال باگ XSS یا همان Cross site scripting وجود دارد . با این باگ هکر می تواند مستقیما کاربران سایت و یا حتی خود شما ، مدیر سایت را هدف قرار داده و کوکی ها و نشست ها را برداشته و خودش به عنوان مدیر در سایت احراز هویت کند و ادامه ماجرا ….  . در این موارد از تابع htmlentities در php برای پاک کردن (sanitize) ورودی های کاربر استفاده می کنیم

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

تابع htmlentities و  htmlspecialchars در php

کاراکتر های رزرو شده HTML (HTML Entities)

قبل از شروع توضیح دادن تمام جزئیات تابع htmlentities در php ، اجازه بدید در مورد کاراکتر های رزرو شده HTML صحبت کنیم . این کاراکترها با یک & یا همان ampersand شروع و به دنبال آن اسم یا شماره مشخص شده آنها می آید و در آخر آنها یک ;  (simcolon) نوشته می شود .  کاراکتر هایی که اسم آنها با شماره مشخص می شود اول آنها ، یک #  نیز اضافه می کنیم.

برای مثال کاراکتر < ، با &lt; مشخص می شود . در حالی که کاراکتر > با  &#60; تعریف شده است .

سینتکس تابع htmlentities در php

حالا ، اجازه بدید کمی در مورد سینتکس ساده تابع htmlentities در php و توابع مشابه آن (تابع htmlspecialchars ) صحبت کنیم .

سینتکس

این تابع ۴ آرگومان را قبول می کند .

حالا لیست آرگومان های تابع htmlentities() را با جزئیات بررسی میکنیم

  • Input_string – رشته ای که قصد تبدیل آن به کاراکتر های رزرو شده HTML را دارید
  • Flag – این فلگ ، ثابت (Constant) های از پیش تعریف شده ای را برای انجام یک سری عملیات می پذیرد
  • Character_encoding – اینکدینگ کاراکتری مثل utf8 , ascii
  • Double_encode – این مقدار به صورت پیش فرض TRUE است .

ثابت های فلگ (Flag Constants)

  • ENT_COMPAT – این ثابت ، کاراکتر های دابل کئت “ را به کاراکترهای رزرو شده html تبدیل می کنید .
  • ENT_QUOTES – این ثابت برخلاف ENT_COMPAT ، هر دو کاراکتر ‘ و ”  را تبدیل می کند.
  • ENT_NOQUOTES – این ثابت ، هیچ کدام از کاراکترهای ‘ و “ را تبدیل نمی کند .
  • ENT_IGNORE – همانطور که از اسمش معلوم است ، کاراکتر های غیر از رشته را نادیده می گیرد !!
  • ENT_SUBSTITUE – یک کاراکتر جایگزین را به جای کاراکتر های نامعتبر UNICODE قرار می دهد .

برای درک بهتر موضوع ، بهتر است یک مثال از تبدیل کاراکترهای خاص به کاراکترهای رزرو شده html توسط تابع htmlentities در php را ببینیم

در اسکریپت php بالا ، یک ورودی رشته ای (متن) داریم که شامل ‘  و علامت های <> که توسط مروگر قابل خواندن می باشد ، است . پس ، قبل از ارسال ورودی های فرم به تابع htmlentities در php ، اگر مقادیر را در خروجی چاپ کنیم ، مرورگر تگ ها را به صورت طبیعی <i></i> پردازش می کنتد و متن مورد نظر به صورت کج شده (italic) نمایش داده می شود .

برعکس آن ، اگر خروجی را قبل از چاپ به تابع htmlentities پاس بدیم ، می توانیم تگ های <i></i> را در خروجی مرورگر مشاهده کنیم ولی هنوز ، کارکتر های ‘ در مرورگر نمایش داده می شود که برای escape کردن این موارد باید  flag ها بالا را ست کنید

توابع مرتبط با تابع htmlentities در php

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

مشابه تابع htmlentities ، php یک تابع دیگر به اسم htmlspecialchars() معرفی کرده است ، که این تابع از مشتقات htmlentities() است و برای همان هدف تبدیل کاراکتر استفاده می شود .

اما تفاوت بین htmlentities() و htmlspecialchars() این است که ، htmlspecialchars می تواند تعداد معدودی از کاراکتر های ‘ , “ , & , > , > را تبدیل کند ولی تابع htmlentities() می تواند همه کاراکتر های خاص را به فرمت entity تبدیل کند .

برای مثال ،هردو تابع htmlentities و  htmlspecialchars را برای تبدیل کاراکتر copyright ©  تست می کنیم .

با اجرا کردن کد بالا ، می توانیم با مشاهده سورس صفحه در مروگر ببینیم که تابع htmlentities ، سمبول ©  را به © تبدیل می کند و تابع htmlspecialchars() کاراکتر ©  را به © تبدیل می کند .

امیدورام آموزش تابع htmlentities و  htmlspecialcharsدر php مفید بوده باشد .  هر گونه مشکلی در اجرای کدها داشتید از قسمت نظرات ارسال کنید ، سریعا پاسخگوی سوالات شما هستیم .

موفق و پیروز باشید.

حسن شفیعی توسعه دهنده وب و موبایل مدیر سایت علاقه خاصی به برنامه نویسی وب و موبایل دارم و هر روز تلاش می کنم به این حوزه مسلط تر شوم و اطلاعاتم را به شکل کاربردی برای علاقه مندان در وب به اشتراک بگذارم. اگر نیاز به برنامه نویس برای انجام پروژه و نوشتن اسکریپت های سمت وب, اپلیکیشن های اندروید و ios, پیدا کردن راه حل توسعه و غیره داشتید حتما از طریق تماس با ما/ واتساپ/ تلگرام بهم پیام بدید. برایتهیه هاست مطمین و پرسرعت کلیک کنید
مطالب زیر را حتما بخوانید
دیدگاه کاربران (۱۰)

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

  1. Dude ۱۱ اردیبهشت ۱۴۰۱

    سلام
    تابع htmlspecialchars کلا در خروجی output اجرا می شود یا برای ورود اطلاعات هم میشه استفاده کرد؟
    مثل :
    name=trim(htmlspecialchars($_POST[‘name’]))$
    و اینکه در خروجی json_encode($results) به چه صورت استفاده می شود؟

    پاسخ
    1. حسن شفیعی ۱۱ اردیبهشت ۱۴۰۱

      سلام. بله برای رشته string میتونید از این تابع بهتره ببرید

      پاسخ
  2. غریبه ۱۸ مهر ۱۳۹۹

    بدردم خورد مرسی

    پاسخ
    1. حسن شفیعی ۱۸ مهر ۱۳۹۹

      سلام. خوشحالیم که مفید واقع شده
      موفق باشید.

      پاسخ
  3. miald ۲۴ مرداد ۱۳۹۸

    سلام …
    سوالی برای من پیش اومده :
    اگر بخوام بفهمم رشته من با htmlentities اینکد شده یا نه چطوری میشه؟
    یا مثلا یک رشته دارم یک بخش اون اینکد شده و بخش های دیگه اینکد نشده، و بخوام اون بخش اینکد نشد رو فقط اینکد کنم چطوری میشه

    پاسخ
    1. حسن شفیعی ۲۵ مرداد ۱۳۹۸

      سلام. بهترین راه برای کار با رشته ها و تشخیص نوع رشته , استفاده از عبارات با قاعده regex است که به اینصورت می تونید بررسی کنید
      preg_match_all(‘/&[#A-Za-z0-9]+;/’, $s, $matches)
      و یا regex رو مطابق نیاز بسازید.
      آموزش regex در php
      موفق باشید.

      پاسخ
  4. مجتبی ۲۲ بهمن ۱۳۹۷

    خیلی عالی بود. مرسی

    پاسخ
    1. حسن شفیعی ۲۲ بهمن ۱۳۹۷

      سلام. خوشحالم که مفید واقع شده.
      موفق باشید.

      پاسخ
  5. مهدی ۲۴ تیر ۱۳۹۷

    واقعا خوب و مفید بود

    پاسخ
    1. حسن شفیعی ۲۴ تیر ۱۳۹۷

      خوشحالم که مفید واقع شده . موفق باشید.

      پاسخ
دوره های آموزشی