2016年10月29日 星期六

[VB6] [VBA] Left vs. Left$ function 有什麼差別?

執行結果是一樣…

1. 除了為了相容舊版的BASIC程式碼外...
2. Left$ 速度比 Left 快兩倍。
3. 真正的含義是:
    加了錢字符號$,其中$表示String,也就是明確指定傳回的是一个字符串。
    不加錢字符號$,函数返回值为Variant 类型的变量。


簡單說,如果空值(Null) 調用了 Left() ,就會出錯…


返回字符串類型變量值的函數名稱不帶錢符號,例如Chr,Format,LCase,Left,LTrim,Mid,Right,RTrim,Space,Trim和UCase。空值調用這些函數會出錯。返回字符串類型變量值的函數可以處理空值,而不會出錯。



Ref:
1. VBA中的有些函数后面的美元符号$的含义
http://bbs.csdn.net/topics/90121915


2. 在函數後面加一個美元符號($)有什麼用?
http://access911.net/fixhtm/72FAB11E17DCEDF3.htm


3.字符串 ($) 函數(針對Visual Basic 6.0用戶)
http://msdn.microsoft.com/zh-cn/library/5eaw1esb(v=vs.80).aspx


4.Trim函數與Trim $函數有什麼區別?
http://topic.csdn.net/t/20060706/16/4864564.html





2016年10月25日 星期二

[MS SQL] [T-SQL] SQL字串中的單引號要如何表示


若使用者輸入條件查詢DB, 建議使用參數化查詢…
那麼SQL字串中的單引號要如何表示呢?


SQL 查詢有單引號的資料,就把一個單引號「’」變成兩個單引號「 '’」
SELECT Name FROM Test WHERE Name = ‘Peppa''s busy day’  
程式組裝SQL語句,使用 String.Replace() 方法,將單引號「’」改為兩個單引號「 '’」: 
(還是不安全,建議用參數化的查詢 )
String.Replace(“'”, “''")                                                             




[T-SQL] SQL Injection 幾種無效的防護程式範例迷思 (轉貼)


轉自:http://itscodes.blogspot.tw/2016/08/sql-injection.html

正確防護之道

SQL Injection正確的解決方式為何呢? 下列兩者缺一不可!
  • 1. Parameterized Query
  • 2. Prepare Statement
 String custname = request.getParameter("customerName"); // This should REALLY be validated too
 // perform input validation to detect attacks
 String query = "SELECT account_balance FROM user_data WHERE user_name = ? ";

 PreparedStatement pstmt = connection.prepareStatement( query );
 pstmt.setString( 1, custname); 
 ResultSet results = pstmt.executeQuery( );

這篇文章主要用兩個常見的範例說明無效的編碼防護方式
許多人常認為只要將特殊服務去除或是使用 Store procedure
就自然不會受到 SQL injection的攻擊
筆者舉兩個例子說明這樣的迷思與錯誤的觀念

迷思一: 過濾特殊字元

許多開發人員認為只要將 SQL 特殊符號去除就可以避免SQL injection
常見的簡單方式包含將 ‘ 變成 ”
儘管這樣的方式可以避免大部分的 SQL injection 但是還是會有遺漏的風險
讓我們來看一個例子,
這個例子中productName已經將輸入的字串將單引號 ‘ 變成雙引號” 避免 SQL injection 的攻擊
儘管這樣可以解決大部分的 SQL injection 攻擊, 但是這樣的防護方式如果遇到有數值得輸入時,就會受到 SQL Injection

int price = ...; // price 

string productName = ...; // product Name
productName = productName.Replace("'","''");

SqlConnection sql= new SqlConnection(...);
sql.Open();
sqlstring=@"SELECT *" +
            " FROM client WHERE name= '" + productName+ "' or price =" + price;
SqlCommand cmd = new SqlCommand(sqlstring,sql);
假設駭客輸入下列攻擊字串
Book or 1=1 —,
由於 ‘ 會被轉換成雙引號, 造成整個 SQL 語句無效, 所以攻擊會失敗
因此, 駭客可以透過數值的輸入, 因為數值輸入不需要引號,
例如將價格輸入為 100; shutdown —
select * FROM client WHERE ID = 'Book'' or 1=1 -- ' or price=100; shutdown --
除此之外, 駭客可以使用 char(0x27)來代替單引號, 也可以避開過濾單引號的偵測防護

迷思二: 用 STORED PROCEDURE

使用 Stored procedure  就一定安全嗎?
這個範例 Store procedure 引用一個外部參數 ProductName執行
 

string ProductName = ...; // Assume get the ProductName input from user

SqlConnection sql= new SqlConnection(...);
sql.Open();

// Execute the Store procedure with the ProductName input
sqlstring=@"exec sp_GetName '" + ProductName + "'";
SqlCommand cmd = new SqlCommand(sqlstring,sql);
駭客輸入字串如下, 造成 SQL 語句無效
 
exec sp_GetName 'Book' 1=1 -- '
但是駭客可以輸入下列 SQL 語句, 除了會造成查詢Book之外, 還會新增一筆資料
 
exec sp_GetName 'Book' insert into client values(1000, 'Book2') -- '
最危險的 Store procedure範例就是可以讓使用者自由輸入 SQL 語句, 範例如下
 
CREATE PROCEDURE sp_myStore @input varchar(256)
AS
    exec(@input)




迷思三: 使用 SP_EXECUTESQL就可以自動防護 SQL INJECTION

許多的迷思認為只要使用 SP_executeSQL  就可以避免 SQL injection,
但是如果沒有正確的定義參數
還是會受到 SQL injection:
 set @cmd = NSELECT * FROM sys.database_principals WHERE name = ”’ + @name + N””

  set @parameters = null --沒有定義參數  還是會導致 SQL injection 

  EXEC sp_executesql @cmd, @parameters
正確的使用方式如下:
  set @parameters = @name sysname

  EXEC sp_executesql @cmd, @parameters, @name = @name





Ref: 
http://www.qa-knowhow.com/?p=4242 

2016年10月23日 星期日

[MVC] [IIS] IIS部署asp.net mvc網站 HTTP錯誤 403.14-Forbidden

遇到就筆記一下…


【狀況描述】
    IIS 部署asp.net mvc網站HTTP錯誤:「HTTP錯誤403.14-Forbidden Web 伺服器被配置為不列出此目錄的內容及Login on failed for "IIS APPPOOL\ASP.NET v4.0"」

【主要原因】
    IIS是在安裝完.net framework 之後才安裝的。

【解決方案】
    至 cmd 控制台,將ASP.NET重新註冊到IIS即可解決此錯誤。

  64bit: 
    C:/Windows/Microsoft.NET/Framework64/v4.0.30319/aspnet_regiis.exe -i 

  32bit:
    C:/Windows/Microsoft.NET/Framework/v4.0.30319/aspnet_regiis.exe -i


reference: https://read01.com/5Q0DQ4.html

2016年10月10日 星期一

[MVC][C#] json parse data to ajax

Just a note to myself.


importment:

Return Json data to Ajax
Json(data, JsonRequestBehavior.AllowGet);

Jquery update Json result data

 $("#email").text(result.email);

Debug:

 console.log(result.status);



Controller
   [HttpPost]
        public ActionResult editemail(string email)
        {
            bool result = false;

            if (!string.IsNullOrWhiteSpace(email) && (EditEmail(hid, email)))
                result = true;
            var data = new { status = result, email = email };

            return Json(data, JsonRequestBehavior.AllowGet);
        }

View

<label id="lb_email">@(Model.UserData.email)</label>  ] 


Ajax
 $.ajax({
                url: '/rivatest/editemail/',
                data: { email: email },
                type: 'POST',
                datatype:'json',
                cache: false
            }).success(function (result) {
                //console.log(result);
               
                if (result.status==true) {
                    $("#email").text(result.email);
                }
                else { 
                    alert('Edit Email failed。');
                }
                
                console.log(result.status);
                console.log(result.email);
           
            }).error(function (result) {
                alert(result);

            });