بازنویسی آدرس ها در ASP.NET یکی از موارد پرکاربرد امنیتی است که فواید زیادی دارد. سهولت ایندکس شدن سایت توسط موتور های جستجو ، مخفی کردن Query String و نمایش ظاهری یک سایت پویا به صورت ایستا و بالا بردن امنیت نسبی سایت از مهمترین این فواید هستند. در این مقاله در مورد Url Rewrite برای شما توضیح می دهیم.
Url Rewrite چیست؟
کار Url Rewriting تبدیل یک آدرس اینترنتی واضح و با معنا به یک آدرس واقعی دارای Query String جهت تفسیر موتور Asp.net است. دو آدرس زیر را در نظر بگیرید :
[pre]
http://aspcode.ir/article.aspx?id=4&type=print
http://aspcode.ir/article-4-print.html
[/pre]
در مثال بالا یقینا” آدرس دوم با معنی تر از آدرس اول است.در ضمن تا حدودی امکان هک شدن سایت از طریق تزریق عبارات Sql را کاهش می دهد. اجازه دهید ابزار های موجود برای Url Rewriting را بررسی کنیم.
پشتیبانی از Url Rewrite در Asp.net 2.0
بعد از ظهور Asp.net 2.0 خبر پشتیبانی استاندارد این تکنولوژی از Url Rewriting بسیار جالب توجه بود. برای این منظور در Asp.net 2.0 تنها کافیست مقداری تغییر در Web.Config دهید:
[pre]
<urlMappings enabled=”true”>
<add url=”~/show-5.htm”
mappedUrl=”~/show.aspx?id=5″ />
</urlMappings>
[/pre]
دقت فرمایید تنظیمات فوق متعلق به شاخه می باشد و باید در این بخش از Web.Config تعریف شود. در مثال بالا url آدرسی است که کاربر مشاهده می کند و mapped Url آدرس حقیقی ماست. اما همانطور که از ظواهر امر پیداست این روال کاری، تنها برای مواقعی مفید خواهد بود که تعداد دفعات استفاده محدود باشد و در صورتی که تعداد آدرس ها بالا باشد ، مدیریت آنها بسیار کار مشکل و زمانبری خواهد بود.
بهترین ابزار بازنویسی آدرس ها یا Url rewriting
برای حل این مشکل ابزار های دیگری در دسترس برنامه نویسان قرار گرفته است. یکی از بهترین ابزار ها را می توان در سایت www.UrlRewriting.net یافت. جهت استفاده از این ابزار که Open Source هم می باشد ، می توانید مستندات آن و تمام آنچه که نیاز دارید از آدرس فوق دانلود کنید.
هر چند که مستندات و مطالب ارائه شده در سایت فوق کاملا” جامع است ، ولی در ادامه این مقاله، توجه شما را به مثال هایی از UrlRewriting در Asp.net جلب می کنم.
ابتدا فایل ضمیمه مقاله را دریافت کنید و Intelligencia.UrlRewriter.dll را به پوشه Bin پروژه خود انتقال دهید. حال مراحل زیر را جهت بازخوانی یک آدرس ثابت دنبال کنید :
فایل Global.asax را باز و رویداد Application_BeginRequest را بصورت زیر کد نویسی می کنیم. همانطور که از نام این رویداد پیداست زمانی کد اجرا می شود که درخواستی به سمت موتور Asp.net ارسال شود.
[pre] if (Request.Url.ToString().Contains(“show.htm”))
{
Context.RewritePath(“show.aspx”);
}
[/pre]
در این مثال محتوای صفحه ای با نام show.htm که بصورت مجازی ایجاد شده است و وجود خارجی ندارد از صفحه ای دیگر با نام show.aspx خوانده می شود
سپس فایل web.config را باز و محتوای آن را به صورت زیر تنظیم نمایید :
[pre]
<configSections>
<section name=”rewriter” type=”Intelligencia.UrlRewriter.Configuration. RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter”/>
</configSections>
<httpModules>
<add name=”UrlRewriter” type=”Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter”/>
</httpModules>
<rewriter>
<rewrite url=”show.htm” to=”show.aspx”/>
</rewriter>
[/pre]
لطفا” به محل قرار گرفتن تغییرات دقت ویژه ای داشته باشید :
<configSections> : داخل تگ <configuration> قرار گیرد.
<httpModules> : داخل تگ <system.web> قرار گیرد.
<rewriter> : داخل تگ <configuration> و خارج و بعد از تگ<system.web> قرار گیرد.
توجه فرمایید کد کامل برنامه را نیز می توانید در انتهای برنامه دانلود نمایید.
مخفی کردن Query String :
شاید به ذهن شما رسیده باشد که چگونه می توان آدرس های مجازی دارای Query String را نیز بازنویسی کنیم. این کار نیز بسیار ساده است و تفاوتهای جزئی با مثال بالا دارد.
برای اینکار دوباره فایل Global.asax را باز و رویداد Application_BeginRequest را بصورت زیر کد نویسی می کنیم:
[pre] if (Request.Url.ToString().Contains(“show-(.+).htm”))
{
Context.RewritePath(“show.aspx?id=$1”);
}
[/pre]
علامت (.+) نماینده یک متغیر است که مقدار Query String را می گیرد و $۱ در خط بعدی همان مقدار (.+) و نماینده مقدار Query String در آدرس حقیقی است. همچنین تگ rewrite را بصورت زیر تغییر دهید :
[pre]
<rewrite url=”show-(.+).htm” to=”show.aspx?id=$1″/>
[/pre] در صورتی که آدرس شما دارای بیش از یک پارامتر Query String است (برای مثال سه پارامتر) بصورت زیر عمل کنید:
[pre] show-(.+)-(.+)-(.+).htm
Show.aspx?Page=$1&Id=$2&state=$3
[/pre]
همچینین تگ rewrite را مانند مثالها قبلی تغییر دهید.
فکر می کنم با مثال های متعدد در این مقاله، شما این مهارت را پیدا کرده باشید تا آدرس ها را بصورت مجازی ایجاد کنید.
نکته :
دقت کنید که در بازخوانی آدرسهای با چندین پارامتر Query String در قسمت آدرس حقیقی قبل از & ، amp; را قرار دهید. در ضمن برای بازخوانی مقدار Query String نیاز به کد نویسی خاصی نیست و با در نظر گرفتن مثال فوق بعد از UrlRewriting با دستور زیر در صفحه show.aspx می توانیم مقدار Query String را بخوانیم:
[pre] Response.Write((string)Request.QueryString[“id”]);
[/pre]