2014/12/06

網站安全風險

基本的網站安全風險十大風險如下:   
 A1 – Injection(注入攻擊)
 A2 – Cross Site Scripting (XSS)(跨站腳本攻擊)
 A3 – Broken Authentication and Session Management(身分驗證功能缺失)
 A4 – Insecure Direct Object References(不安全的物件參考)
 A5 – Cross Site Request Forgery (CSRF)(跨站冒名請求)
 A6 – Security Misconfiguration(安全性設定疏失)
 A7 – Failure to Restrict URL Access(限制URL存取失敗)
 A8 – Unvalidated Redirects and Forwards(未驗證的導向)
 A9 – Insecure Cryptographic Storage(未加密的儲存設備) 
 A10 – Insufficient Transport Layer Protection(傳輸層保護不足) 

2014/11/29

asp.net viewstate


今天討論 viewstate 如何保存資訊
我們先來看一下viewstate,當我們在寫一個 asp.net 時,標明了 form runat=server,那 asp.net 就會自動在頁面加一個隱藏 Tag


透過這個 Tag,頁面裏所有的控制項的狀態,包括頁面本身的一些狀態都會保存到這個 hidden。每次頁面提交時會將 _VIEWSTATE 送到 Server, Server 對其值進行解碼,然後輸出時再根據這個值來恢復各個控制項的狀態。我們再研究這個控制項的值,很多人會看不懂這這個資料,其實 .NET 僅僅是給每個控制項和頁面的狀態存入適當的物件裏面,然後把該物件序列化,最後再做一次 base64 編碼。
 
 為了保護 VIEWSTATE 沒被串改,我們可以在頁面頂部加入如下代碼:<%@ Page EnableViewStateMac="true" %>,這樣 asp.net 就會自動的在 viewstate 中追加一個 code,在頁面回傳時,伺服器根據回傳的 viewstate 生成一個 code,再與回傳的 code 相比較,如果不對,則丟棄該view state,同時控制項將恢復初試狀態

另外只要在 machine.config 裏設置一下 machineKey validation="3DES" 即可達到用 des 加密viewstate。

2014/10/05

C# 6.0 新特性 – Null-Conditional Operator

在 C# 的程式中,為了不要有 Null Point Exception,常常會做很多 null 的判斷,現在 C# 6.0 有更好的寫法

string name = memberlist?[0].Member?.Name ?? "n/a";

範例中,如果 memberlist 或 Member 或 Name 是 null 時, name 就會是 "n/a"
                若不是 null 就會是 memberlist[0].Member.Name

這樣的寫法是不是更簡單呢?

2014/10/04

Scrum 軟體開發

Scrum 由三種角色、三個儀式、三類產生物組成

三種角色:
產品負責人

  • 掌握產品願景
  • 代表業務
  • 代表客戶
  • 持有產品代辦清單
  • 劃定故事優先順序
  • 設立故事的驗收標準
  • 有空回答團隊成員們的問題
Scrum Master
  • Scrum 諫言者
  • 教練
  • 障礙移除者
  • 引導者
成員
  • 負責交付使用者故事
  • 做所有的開發工作
  • 自我組織地交付使用者故事
  • 擁有估算流程權
  • 擁有『如何做事|的決策權
  • 避免『與我無關』
三個儀式:
規劃會議
站立會議
檢視會議

三類產生物:
清單:產品待辦清單、Sprint 清單
燃圖
工作看板


2014/09/28

在 MAC OS X 取得 Address Book

使用 AddressBook framework
//取得 Address 物件
ABAddressBook *ab = [ABAddressBook sharedAddressBook];

//取得"自己"的資料
ABPerson *me = [ab me];
NSString *fName = [me valueForProperty:kABFirstNameProperty];
NSString *lName = [me valueForProperty:kABLastNameProperty];

//設定資料
[me setValue:@"Candan" forProperty:kABFirstNameProperty];

//取得所有人員的 Array
NSArray *everyone = [ab people];

//取得人員群組
NSArray *groups = [ab groups];

//新增一筆人員資料
ABPerson *newPerson = [[ABPerson alloc] init];

//將人員加入 AddressBook
[ab addRecord: newPerson];

//將人員從 AddressBook 移除
[ab removeRecord: me];

//設定"自己"是誰
[ab setMe:newPerson];

//AddressBook 儲存
[ab save];

2014/09/06

updatecommand 已經影響必須是 1 記錄的 0

.NET 開發時,有時會遇到"updatecommand 已經影響必須是 1 記錄的 0"這樣的錯誤訊息

這個錯誤訊息的意思是,DataRow 中包含的原始資料已經在資料庫找不到了,有可能是資料庫的資料已經被其他人改過,也有可能 DataRow 包含了錯誤訊息。其實在 DataRow 中含有修改前的資料與修改後的資料,可以透過 DataRowVersion.Original 的方式可以存取到修改前的資料(請參考 http://msdn.microsoft.com/zh-tw/library/ms135373(v=vs.110).aspx),DataAdapter會依據 DataRowVersion.Original 中含有的資料去資料庫找,並更新該筆資料,若依據 DataRowVersion.Original 的資料在資料庫中找不到符合的資料就會出現"updatecommand 已經影響必須是 1 記錄的 0" 的錯誤訊息。

若發生這個錯誤時,先確定資料庫的資料是否被其他人異動過。若不是,就透過 DataRowVersion.Original 去找尋那一個欄位的資料值是有問題,找找看程式是否拿到更早的資料或是查錯資料表。

若資料存進資料庫成功後,可以執行 DataTable.AcceptChanges(); ,這個動作會將現在的資料複製到  DataRowVersion.Original 的資料中,來確保資料庫的資料已經跟 DataTable 是一致的了,下次存資料庫時,才不會因為資料不一致又發生 "updatecommand 已經影響必須是 1 記錄的 0" 的錯誤訊息。

2014/09/01

在 Mac 增加 STATIC ROUTE

Candan$ ifconfig en1
en1: flags=8863 mtu 1500
ether xx:xx:xx:xx:xx:xx 
inet6 fe80::fa1e:dfff:fee0:ad95%en1 prefixlen 64 scopeid 0x5 
inet 192.168.1.101 netmask 0xffffff00 broadcast 192.168.1.255
nd6 options=1
media: autoselect

status: active

Candan$ sudo route add -net 192l168.2.0/24 192.168.1.3
Password:
add net 192.168.2.0: gateway 192.168.1.3


2014/08/28

Reflection 與 dynamic 差異

1.Reflection 與 dynamic 都是在 runtime 時可操作 object 相關 methods / properties。
2.Reflection 可在 runtime 時檢閱 object 的 meta-data,如 methods / properties,也可以在 runtime 時 invoke 物件的 methods / properties。
3.dynamic 是在 .NET 4.0 時才有的語法。宣告 dynamic 的物件,該物件會在 runtime 時才確定執行物件的 methods / properties。換句話說,在 compiler 階段該物件的 methods / properties 若不存在,是不會發生錯誤,要等到 runtime 執行時,才會有錯誤訊息。
4.dynamic 的內部也是使用 Reflection。
5.使用 Reflection 可以呼叫 public 與 private 的 methods / properties,但是 dynamic 只能呼叫 public 的 methods / properties。
6.dynamic 是 instance,所以無法呼叫 static 的 methods,若要在 runtime 時呼叫 static 的 methods,只能透過 Reflection 才行。

2014/08/27

修改 .net EXE 執行程式

先準備一個 .net 的執行檔,例如為 abc.exe,在命令列中執行 ildasm abc.exe /output:xyz.il 就會產生 MSIL 的檔案。你必須了解 MSIL 相關的語法後,做一些修改,注意的是要避免 xyz.il 檔案編碼被動到,可能會造成後續的編譯失敗。修改完存檔,使用 ilasm xyz 就可以生成 xyz.exe,執行 xyz.exe 就可以看到你修改後的效果。

2014/08/23

Hadoop 平均數範例

平均數Mean)、均值是統計中的一個重要概念,為資料彙整後的代表值。最常使用的是算數平均數,還有其他平均數的算法,請參考 http://zh.wikipedia.org/wiki/平均值。

使用 Hadoop 來計算平均數,當成 Hadoop 一個簡單的程式範例

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapred.*;

import java.io.IOException;
import java.util.Iterator;

public class Average {

    static class AverageMapper extends MapReduceBase implements Mapper
    {
        @Override
        public void map(LongWritable longWritable, Text value, OutputCollector
                output, Reporter reporter) throws IOException {

            String lines = value.toString();
            int data = Integer.parseInt(lines);
            output.collect(new Text("Average"), new IntWritable(data));
        }
    }

    static class AverageReduce extends MapReduceBase implements Reducer
    {
        @Override
        public void reduce(Text key, Iterator values, OutputCollector
                output, Reporter reporter) throws IOException {

            long sum = 0;
            long count = 0;
            while(values.hasNext())
            {
                sum += values.next().get();
                count ++;
            }

            double average = (double)sum / count;
            output.collect(key, new DoubleWritable(average));
        }
    }

    public static void main(String[] args) throws Exception{
        if(args.length != 2)
        {
            System.err.println("Usage: Average ");
            System.exit(2);
        }

        JobConf conf = new JobConf(Average.class);

        conf.setJobName("Average");
        FileInputFormat.addInputPath(conf, new Path(args[0]));
        FileOutputFormat.setOutputPath(conf, new Path(args[1]));

        conf.setMapperClass(AverageMapper.class);
        conf.setReducerClass(AverageReduce.class);

        conf.setOutputKeyClass(Text.class);
        conf.setOutputValueClass(IntWritable.class);

        JobClient.runJob(conf);
    }
}

2014/08/22

PHP HTML Input 數量限制

遇到了奇怪的問題,HTML 中有些 Input 抓的到值,有些不行?查了 PHP 的設定才發現原來 PHP 中 Input 數量有限制,預設最大為 1000 。




max_input_vars integer
How many input variables may be accepted (limit is applied to $_GET, $_POST and $_COOKIE superglobal separately). Use of this directive mitigates the possibility of denial of service attacks which use hash collisions. If there are more input variables than specified by this directive, an E_WARNING is issued, and further input variables are truncated from the request.
請參考 http://php.net/manual/en/info.configuration.php#ini.max-input-vars


2014/08/17

PHP  發送中文(utf-8)信發生亂碼

這幾天有人問我,為什麼使用 PHP 程式發信, Outlook 收信的內容是亂碼,我第一個直覺就是 PHP 的檔案不是 UTF-8,他第一個時間否認,說檔案是 UTF-8,但最後我去看程式後證實我是對的,檔案不是 UTF-8,將 PHP 的檔案格式改成 UTF-8 亂碼問題就解決了。

另外說明 「UTF-8 無 BOM」和「帶 BOM 的 UTF-8」的查別是:有没有 BOM,就是檔案的開頭有没有 U+FEFF。