2016年10月13日 星期四
MSBuild Error MSB4094
使用 MSBuild 的 XmlPoke 更新特定 element attribute 的值,卻拋出 exception:
error MSB4094: "..." is an invalid value for the "Value" parameter of the "XmlPoke" task. Multiple items cannot be passed into a parameter of type "Microsoft.Build.Framework.ITaskItem"
研究後發現,原來是我要更新的內容包含分號 ( ; ),必須將分號跳脫成 %3B 即可
Example:
<Compile Include="MyFile.cs;MyClass.cs"/>
↓↓↓↓↓
<Compile Include="MyFile.cs%3BMyClass.cs"/>
2016年9月30日 星期五
mysql workbench Error Code: 1175
在 mysql workbench 執行 SQL 發生以下錯誤:
Error Code: 1175
You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
該怎麼辦呢?
- 打開 mysql workbench
- Edit → Preferences
- workbench 6.0,選擇 SQL Queries 頁籤
- workbench 6.3,選擇 SQL Editor 頁籤
- 反勾選Safe Updates. Forbid UPDATEs And DELETEs with no key in WHERE clause or no LIMIT clause. Requires a reconnection
- workbench 重新連線
- 即可正常執行
2016年9月6日 星期二
Prevent Cross-Site Request Forgery (CSRF) using ASP.NET MVC’s AntiForgeryToken()
什麼是 Cross-Site Request Forgery (CSRF)
簡單來說,CSRF 就是使用者在不知情的情況,讓瀏覽器送出請求給目標網站以達攻擊目的。使用者進行網路驗證後,瀏覽器會將驗證資訊存在 Cookie , 若使用者未登出,此 Cookie 仍視為有效, 而使用者瀏覽其他網站時,會將此驗證資訊回傳 server 以便進行操作, 此時使用者在不自覺的情況下,瀏覽含有攻擊程式碼的網頁, 駭客可使用相同一份驗證資訊(使用者身份)進行攻擊。
如何預防 CSRF
在 View 上 加入 @Html.AntiForgeryToken()<!-- Contained in xxxxx.cshtml --> @model MileageStats.ServicesModel.User @Html.AntiForgeryToken()
在 client 端,即可檢視會產出 hidden input html
<!-- Rendered HTML in the client browser --> <input name="__RequestVerificationToken" type="hidden" value="H4zpQFvPdmEdGCLsFgeByj0xg+BODBjIMvtSl5anoNaOfX4V69Pt1OvnjIbZuYrpgzWxWHIjbn zFOLxP5SzVR4cM9XZeV78IPi8K4ewkM3k2oFkplrXL4uoAqy+aoSOg8s1m1qxrE7oeBBtvezEHCAs6nKE h2jAwn3w0MwmhkcDQiJfJK7hGvN0jXA4d7S8x7rbLxp4Y8IJZS9wka2eOLg==" />
在 controller action 加上 ValidateAntiForgeryTokenAttribute
// Contained in xxxxController.cs [HttpPost] [ValidateInput(false)] [ValidateAntiForgeryToken] public ActionResult Edit(....)
透過 AntiForgeryToken 來檢查連線是否是正常的,
簡單的兩個步驟就完成囉!
參考:https://msdn.microsoft.com/en-us/library/hh404095.aspx
2016年9月5日 星期一
Preventing Open Redirection Attacks
前一陣子維護的 web 進行安全性掃描,
被列了一個 issue ,就是 open redirection attack,
至於什麼是 open redirection attack ,又該如何解決呢?
有興趣就接著往下看吧!
舉例來說,當某頁面需要登入權限,但還未登入時,當輸入網址後,會被導至登入頁,
在登入成功後,透過 returnUrl 會再導回原頁面,
如:
當我想進入 http://somewebhost/xxx/list
因為還未登入,所以被導至 http://somewebhost/Account/LogOn?returnUrl=/xxx/list
但成功登入後,則透過 returnUrl 導至 http://somewebhost/xxx/list
這一切都很完美,但對有心人士來說,也很完美,
怎麼說呢? 就是透過 returnUrl 這個特性,可以把使用者導引至惡意網站,
可以這麼做,組成以下連結,讓使用者誤以為進入正確的網站(也許是某金融網站 )
http://somewebhost/Account/LogOn?returnUrl=http://someBadWeb/doSomething
但成功登入後,卻會將使用者導至另一個惡意網站,而使用者會以為是正常的登入成功,
可能因此填入重要個資,如信用卡號碼等等,
形成一種釣魚網站的手法,十分可怕
在 asp.net MVC3 以上的寫法,
使用 System.Web.Mvc.Url helper 類別方法 IsLocalUrl() ,
來判斷 returnUrl 是否是合法的,如下:
若不是 MVC 專案,
則可利用以下方法進行驗證:
以上就可以解決此 issue 囉!
參考:http://www.asp.net/mvc/overview/security/preventing-open-redirection-attacks
被列了一個 issue ,就是 open redirection attack,
至於什麼是 open redirection attack ,又該如何解決呢?
有興趣就接著往下看吧!
What's Open Redirection Attacks ?
Any web application that redirects to a URL that is specified via the request such as the querystring or form data can potentially be tampered with to redirect users to an external, malicious URL. This tampering is called an open redirection attack.舉例來說,當某頁面需要登入權限,但還未登入時,當輸入網址後,會被導至登入頁,
在登入成功後,透過 returnUrl 會再導回原頁面,
如:
當我想進入 http://somewebhost/xxx/list
因為還未登入,所以被導至 http://somewebhost/Account/LogOn?returnUrl=/xxx/list
但成功登入後,則透過 returnUrl 導至 http://somewebhost/xxx/list
這一切都很完美,但對有心人士來說,也很完美,
怎麼說呢? 就是透過 returnUrl 這個特性,可以把使用者導引至惡意網站,
可以這麼做,組成以下連結,讓使用者誤以為進入正確的網站(也許是某金融網站 )
http://somewebhost/Account/LogOn?returnUrl=http://someBadWeb/doSomething
但成功登入後,卻會將使用者導至另一個惡意網站,而使用者會以為是正常的登入成功,
可能因此填入重要個資,如信用卡號碼等等,
形成一種釣魚網站的手法,十分可怕
該如何預防?
就是檢查 returnUrl 是否是合法的,也就是說只能導至目前 host 下的網址,在 asp.net MVC3 以上的寫法,
使用 System.Web.Mvc.Url helper 類別方法 IsLocalUrl() ,
來判斷 returnUrl 是否是合法的,如下:
public ActionResult LogOn(LogOnModel model, string returnUrl) { if (Url.IsLocalUrl(returnUrl)) { return Redirect(returnUrl); } else { return RedirectToAction("Index", "Home"); } }
若不是 MVC 專案,
則可利用以下方法進行驗證:
public static bool IsUrlLocalToHost(this HttpRequestBase request, string url) { return !url.IsEmpty() && ((url[0] == '/' && (url.Length == 1 || (url[1] != '/' && url[1] != '\\'))) || (url.Length > 1 && url[0] == '~' && url[1] == '/')); }
以上就可以解決此 issue 囉!
參考:http://www.asp.net/mvc/overview/security/preventing-open-redirection-attacks
2016年8月24日 星期三
json.net 反序列化繼承的子類別問題
今天遇到 json.net 反序列化的問題,
( json.net deserilize dirven class problem! )
server 端在定義 ViewMode 時,DataModel 可能是 ChildAModel 或 ChildBModel 類別,
以 OO多型 ( Polymorphism ) 的設計來說,
實作一個父類 ( BaseModel ) 讓 ChildAModel, ChildBModel 繼承,
這樣 ViewModel.DataModel 就可以指定 ChildAModel, ChildBModel 其中之一的資料格式
如下:
將 ViewModel 的資料轉成 JSON 拋給 Client 沒問題,
JavaScript 本身就是延展性高的語言,
但由 Client 再拋給 Server 時,
Json.Net 將 JSON 反序列成物件時,
問題來了!
ViewModel.DataModel 只會被反序列化成 BaseModel ,
其他資料全掉光了,
傷腦筋啦! 該如何是好呢?
.Create
來通知 Json.Net 反序列化 T 時,
要轉成哪一種類別,但此 Create 原生方法卻沒有提供其他資訊來判斷該用哪種類別
example:
發現有善心人士也遇到此問題,並公開解法
覆寫 JsonConverter,擴充 Create 方法
如下: ( 參考 )
再自訂 Json.Net Conveter,並依物件的 property 回覆類別,如下
最後反序列化的使用方式,如下:
以上!
( json.net deserilize dirven class problem! )
前情提要:
開發 web, server 與 client 透過 json 格式傳遞資料,server 端在定義 ViewMode 時,DataModel 可能是 ChildAModel 或 ChildBModel 類別,
以 OO多型 ( Polymorphism ) 的設計來說,
實作一個父類 ( BaseModel ) 讓 ChildAModel, ChildBModel 繼承,
這樣 ViewModel.DataModel 就可以指定 ChildAModel, ChildBModel 其中之一的資料格式
如下:
public class BaseModel { public int key { get; set; } } public class ChildAModel: BaseModel { public string Name { get; set; } public int Age { get; set; } } public class ChildBModel : BaseModel { public string SomeProperty1 { get; set; } public int SomeProperty2 { get; set; } } public class ViewModel { public BaseModel DataModel { get; set; } }
問題:
依這樣的設計,將 ViewModel 的資料轉成 JSON 拋給 Client 沒問題,
JavaScript 本身就是延展性高的語言,
但由 Client 再拋給 Server 時,
Json.Net 將 JSON 反序列成物件時,
問題來了!
ViewModel.DataModel 只會被反序列化成 BaseModel ,
其他資料全掉光了,
傷腦筋啦! 該如何是好呢?
Solution:
基本概念是靠實作 CustomCreationConverterpublic interface IPerson { string FirstName { get; set; } string LastName { get; set; } DateTime BirthDate { get; set; } } public class Employee : IPerson { public string FirstName { get; set; } public string LastName { get; set; } public DateTime BirthDate { get; set; } public string Department { get; set; } public string JobTitle { get; set; } } public class PersonConverter : CustomCreationConverter{ public override IPerson Create(Type objectType) { return new Employee(); } }
發現有善心人士也遇到此問題,並公開解法
覆寫 JsonConverter,擴充 Create 方法
如下: ( 參考 )
public abstract class JsonCreationConverter: JsonConverter { protected abstract T Create(Type objectType, JObject jsonObject); public override bool CanConvert(Type objectType) { return typeof(T).IsAssignableFrom(objectType); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jsonObject = JObject.Load(reader); var target = Create(objectType, jsonObject); serializer.Populate(jsonObject.CreateReader(), target); return target; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } }
再自訂 Json.Net Conveter,並依物件的 property 回覆類別,如下
public class ModelConverter : JsonCreationConverter { protected override BaseModel Create(Type objectType, JObject jsonObject) { if (jsonObject["Name"] != null) { return new ChildAModel(); } else if (jsonObject["SomeProperty1"] != null) { return new ChildBModel(); } else { return new BaseModel(); } } }
最後反序列化的使用方式,如下:
var deserializedModel = JsonConvert.DeserializeObject<BaseModel>(json, new ModelConverter ());
以上!
2016年8月3日 星期三
Firefox error: Unable to check input because the pattern is not a valid regexp: invalid identity escape in regular expression
在下大部分時間是用 chrome 開發網頁,
但身為網頁開發人員,
三不五時就要看看自已寫的東西在別的瀏覽器會不會有問題,
今天在 firefox 就中招了,
使用 input pattern attribute 時,
下 regular expression 習慣性會將特殊符號加上 escape ( \ ),
這樣的寫法在 chrome 是沒問題的,如下:
<input type="text" class="form-control" required pattern="[\-\_]" >
但在 firefox 卻拋出錯誤訊息:
Unable to check <input pattern='[\-\_]'> because the pattern is not a valid regexp: invalid identity escape in regular expression
研究後發現,在 input pattern 不需要做 escape ,在 chrome, firefox 都 work,
修改後,如下:
<input type="text" class="form-control" required pattern="[-_]" >
標籤:
html,
javascript
2016年7月26日 星期二
The controller for path '/Account/Login' was not found or does not implement IController.
發現一問題,
透過 .net authentication 機制,當未登入狀態,
預設應該導至哪一頁是依 <form loginUrl="..."/> 設定,
<authentication mode="Forms"> <forms loginUrl="~/login.aspx"/> </authentication>
但設定後卻無效
經查詢發現在 web.config 的 appSettings 加上此行,即可
<add key="loginUrl" value="~/login.aspx" />
原因不明,在此做個紀綠先!
訂閱:
文章 (Atom)