مدیریت سراسری خطاها در یک برنامهی Angular
- علت عمل نکردن فیلتری که به آن لینک دادید (که من با آن موافق نیستم)، این است که دیگر نباید از میانافزار مدیریت استثناهای مخصوص توسعه دهندههای ASP.NET Core در این حالت استفاده کنید، چون با آن تداخل میکند و پیش از آن وارد عمل میشود. علت دریافت صفحهی HTML ایی که مشاهده میکنید، همین مورد است. این صفحه برای برنامههای ASP.NET Core دارای Viewهای Razor طراحی شدهاست و نه مخصوص حالت کار صرفا Web API آن.
- یکی از مشکلات آن فیلتر هم این است که به هیچ عنوان نباید اصل خطای رخدادهی در سمت سرور را به سمت کلاینت ارسال کرد و به کاربر نمایش داد. این مورد امکان دیباگ از راه دور برنامهی شما را توسط یک مهاجم سهولت میبخشد و از دیدگاه امنیتی اشتباه است. این موارد را فقط باید توسط امکانات Logging توکار ASP.NET Core ثبت و در سمت سرور با «دسترسی ادمین» بررسی کنید. کاربر هم فقط باید جملهی کلی «خطایی رخ دادهاست» را مشاهده کند و نه جزئیات آنرا.
که معادل است با استفاده از فایل launchSettings.json با تنظیمات زیر:
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iis": { "applicationUrl": "http://localhost/WebApplication2", "sslPort": 0 } }, "profiles": { "IIS": { "commandName": "IIS", "launchBrowser": "true", "launchUrl": "http://localhost/WebApplication2", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } } } }
CACHE MANIFEST #Cache Section CACHE: /Content/Images/icons-18-white.png /Content/Images/icons-36-white.png /Content/Images/ajax-loader.png /Content/css /Scripts/js
NETWORK webService.Js
CACHE MANIFEST # 2010-06-18:v2 # Explicitly cached 'master entries'. CACHE: /favicon.ico index.html css images/ stylesheet .logo.png scripts/main.js # Resources that require the user to be online. NETWORK: login.php /myapi http://api.twitter.com
AddType text/cache-manifest .appcache
using System.Web; namespace JavaScriptReference { public class Manifest : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/cache-manifest"; context.Response.WriteFile(context.Server.MapPath("Manifest.txt")); } public bool IsReusable { get { return false; } } } }
CACHE MANIFEST # Version Jesus 3! CACHE: index.html js/Custom.js js/Utility.js styles/index.css styles/kendo.common.min.css styles/BlueOpal/loading.gif styles/BlueOpal/slider-h.gif styles/BlueOpal/slider-v.gif NETWORK: * <%@ Page Language="VB" ContentType="text/cache-manifest" ResponseEncoding="utf-8" AutoEventWireup="true" CodeFile="manifest.aspx.vb" Inherits="Configuration_manifest" %>
<!DOCTYPE html> <html manifest="/manifest.aspx">
برای اینکه رفت و برگشت برای هر درخواست به بانک اطلاعاتی در پروژههای بزرگ رو مدیریت بهینه کنیم چکار باید کرد؟ منظورم اینه وقتی تعداد کاربران زیاد باشه و متدهای زیادی هم در پروژه باشه که در هدر همه اونها باید این توکن و دسترسیها چک بشه ممکنه سربار زیادی روی بانک اطلاعاتی داشته باشه. برای مدیریت بهتر این موارد من دو راه تست کرده بودم :
1. توی یک متغیر استاتیک اطلاعات توکنها علاوه بر بانک اطلاعاتی ذخیره بشه و هردو با هم سینک باشند (موردی که خودتون هم اشاره فرموده بودید) بنابراین بیشترین درخواستها برای چک این مقادیر روی یک متغیر استاتیک هست که روی IIS فعال میشه و ممکنه رم زیادی البته بگیره و هر وقت هم IIS ریست شد دوباره اون لیست توکنهای استاتیک از بانک اطلاعاتی فراخوانی میشه و برای درخواستهای بعدی کاربران از اون متغیر استاتیک که لیست توکنها هست رو چک میکنه.
2. راه دوم استفاده از بانک اطلاعاتی هست که رفت و برگشت به بانک اطلاعاتی برای هر درخواست رو زیاد میکنه و ممکنه سربار زیادی داشته باشه
البته من در پروژه از بانک اطلاعاتی مونگو استفاده کردم و این لیست توکنها و کلیه بانک اطلاعاتی کاربران و غیره در اون ذخیره میشه .
سوال اینجاست که برای زمانی که کاربران زیاد و متدهای زیادی داریم که باید چک شوند راه حل بهینه برای انجام این مورد چه راهی هست؟
و اینکه آیا اگه از بانک اطلاعاتی Redis که بر روی رم قرار میگیره برای مدیریت توکنها استفاده کنیم کارایی بهتر میشه یا باز هم همون مشکل قبلی رو داریم؟
ASP.NET MVC #21
نحوه استفاده از افزونه Firebug برای دیباگ برنامههای ASP.NET مبتنی بر jQuery
طی مقاله چک لیست تولید برنامه Asp.net mvc و بررسی امنیتی ایجکس هنگام استفاده در مورد چک لیست امنیتی
سایت سرفصلهای مهم عنوان و بررسی شده است که یکی از موارد، مقاوم ساختن وب اپلیکشن در برابر حملات CSRF میباشد. اینگونه حملات بر پایه این استراتژی شکل میگیرند که با
ارسال درخواستی به نیابت از سمت سیستم/مرورگر کاربر تایید هویت شده، سایت مقصد را مجبور
به انجام عملی کند. برای مثال اگر شما در سایت a.com یک
کاربر تایید شده باشید و هم اکنون در سایت فوق نیز لاگین باشید، مهاجم با ارسال یک برنامه/صفحه یا موارد مشابه و در قالب src یک
عکس یا با ترغیب شما با کلیک بر روی یک لینک با href آلوده یا موارد
مشابه، از سمت مرورگر شما درخواستی را به سمت سایت a.com ارسال میکند .
این درخواست ممکن است شامل حذف اطلاعات، تغییر مشخصات، پرداخت هزینه یا موارد مشابه باشد. جهت مقابله با این حمله، یکی از موارد مهم، استفاده همیشگی از Html.AntiForgeryToken() در تمامی فرمهای ورود اطلاعات است. همچنین استفاده همیشگی از متد Post و بررسی تایید مبدا درخواستهای ایجکسی، بررسی http referrer ، محدود کردن طول عمر کوکی، استفاده از کپچهای قوی مانند کپچای گوگل میتواند تا حد زیادی وب اپلیکیشن را در مورد اینگونه حملات، مصون کند.
در این بین یکی از موارد دیگر، اضافه کردن AntiForgeryToken به درخواستهای ایجکسی سایت میباشد. جهت حصول این منظور، راههای مختلفی موجود است. یکی از راه حلها استفاده از یک هلپر جهت تولید توکن مورد نظر است.
ساختار
هلپر مورد نظر به شرح زیر است :
public static class AntiForgeryToken { public static MvcHtmlString AntiForgeryTokenForAjaxPost(this HtmlHelper helper) { var antiForgeryInputTag = helper.AntiForgeryToken().ToString(); // Above gets the following: <input name="__RequestVerificationToken" type="hidden" value="some value" /> var removedStart = antiForgeryInputTag.Replace(@"<input name=""__RequestVerificationToken"" type=""hidden"" value=""", ""); var tokenValue = removedStart.Replace(@""" />", ""); if (antiForgeryInputTag == removedStart || removedStart == tokenValue) throw new InvalidOperationException("Oops! The Html.AntiForgeryToken() method seems to return something I did not expect."); return new MvcHtmlString($@"{"__RequestVerificationToken"}:""{tokenValue}"""); } }
در مرحله بعد طبق الگوی زیر، درخواست ایجکسی به همراه توکن تولید شده و به کنترلر ارسال خواهد شد:
function AddToCart(pid) { $.ajax({ url: '@Url.Action("AddToBasket","Shop")', data: { 'pid': pid,@Html.AntiForgeryTokenForAjaxPost() }, type: 'post', success:function(e) { //do something } }); }
در مرحله آخر، باید کنترلر مورد نظر شامل ویژگیهای [HttpPost] [ValidateAntiForgeryToken] باشد تا صحت توکن تولیدی را بررسی کند و در صورت نامعتبر بودن، از اجرای دستورات جلوگیری گردد.
<script src="@Url.Content("~/Scripts/Site.js")"></script>
<script src="~/Scripts/Site.js"></script>
<div @{if (myClass != null) { <text>class="@myClass"</text> } }>Content</div>
<div class="@myClass">Content</div>
<div>Content</div>
<input checked="@ViewBag.Checked" type="checkbox"/>
<input type="checkbox"/>
دوره توسعه asp.net mvc
در ادامه دوره مقدماتی mvc که قبلا در سایت به اشتراک گذاشته شده بود.دوره جدیدی رو مایکروسافت منتشر کرده با عنوان توسعه برنامههای MVC که سرفصلهای آن را در بخش زیر مشاهده میکنید:
Mod 01: Introduction to MVC 4 Mod 02: Developing ASP.NET MVC 4 Models Mod 03: Developing MVC 4 Controllers Mod 04: Developing ASP.NET MVC 4 Views Mod 05: Integrating JavaScript and MVC 4 Mod 06: Implementing Web APIs Mod 07: Deploying to Windows Azure Mod 08: Visual Studio 2013/MVC 5 Sneak Peek