2018年12月26日 星期三

Unauthorized access!! E107

e107 uses various security methods to keep your site protected from abuse. However, some server configurations are incompatible with these methods, usually due to these servers employing similar security methods.
In order to disable only the parts which may cause you problems, we recommend you add the following code on a new line in your e107_config.php file, and see if that helps. If not, please submit an Issue on Github - we'll do our best to find a solution for you.
define('e_SECURITY_LEVEL', 0);

2018年12月12日 星期三

MYSQL資料庫命名規則及設計規範

MYSQL資料庫命名規則及設計規範


原文作者: Aeolus (傻鱼)
正體譯者: Fntsrlike (月湖)



1. 設計原則

(1) 標準化和規範化 

資料的標準化有助於消除資料庫中的資料冗餘。
標準化有好幾種形式,但Third Normal Form(3NF)
通常被認為在性能、擴展性和資料完整性方面達到了最好平衡。
簡單來說,遵守3NF標準的資料庫的資料表設計原則是:“One Fact in One Place”
即某個資料表只包括其本身基本的屬性,當不是它們本身所具有的屬性時需進行分解。
資料表之間的關係通過外鍵相連接。
有一組資料表專門存放通過鍵連接起來的關聯資料。

舉例:
某個存放客戶及其有關定單的3NF資料庫就可能有兩個資料表:Customer和Order。
Order資料表不包含定單關聯客戶的任何信息,但資料表內會存放一個鍵值,
該鍵指向Customer資料表裡包含該客戶信息的那一行。

事實上,為了效率的緣故,對資料表不進行標準化有時也是必要的。


(2) 資料驅動 (Data-Driven)

採用資料驅動而非硬編碼的方式,
許多策略變更和維護都會方便得多,大大增強系統的靈活性和擴展性。
舉例,假如使用者界面要訪問外部資料源(文件、XML文件、其他資料庫等),
不妨把相應的連接和路徑信息存儲在使用者界面支持資料表裡。

還有,如果使用者界面執行工作流之類的任務(發送郵件、列印信箋、修改記錄狀態等),
那麼產生工作流的資料也可以存放在資料庫裡。
角色權限管理也可以通過資料驅動來完成。

事實上,如果過程是資料驅動的,
你就可以把相當大的責任推給使用者,由使用者來維護自己的工作流過程。


(3) 考慮各種變化

在設計資料庫的時候考慮到哪些資料欄位將來可能會發生變更。
舉例,姓氏就是如此(注意是西方人的姓氏,比如女性結婚後從夫姓等)。
所以,在建立系統存儲客戶信息時,在單獨的一個資料表裡存儲姓氏欄位,
而且還附加起始日和終止日等欄位,這樣就可以跟踪這一資料條目的變化。

2. 資料庫涉及字元規範


採用26個英文字母(區分大小寫)和0-9這十個自然數,加上底線'_'組成,
共63個字元,不能出現其他字元(註解除外)。

注意事項:
(1)
以上命名都不得超過30個字元的系統限制。
變數名稱的長度限制為29(不包括標識字元@)。

(2)
資料對象、變數的命名都採用英文字元,
禁止使用中文命名。絕對不要在命名對象的字元之間留空格。

(3)
小心保留字,要保證你的欄位名沒有和保留字、資料庫系統或者常用訪問方法衝突。

(4)
保持欄位名和類型的一致性,
在命名欄位並為其指定資料類型的時候一定要保證一致性。
假如資料類型在一個資料表裡是INT,那在另一個資料表裡可就別變成CHAR型了。



3. 資料庫命名規範


資料庫,資料表一律使用前綴

正式資料庫名使用小寫英文以及下劃線組成,盡量說明是那個應用或者係統在使用的。
比如:
web_19floor_net
web_car

備份資料庫名使用正式資料庫名加上備份時間組成,如:
web_19floor_net_20070403
web_car_20070403


4. 資料表命名規範

資料表名使用小寫英文以及下劃線組成,
盡量說明是那個應用或者係統在使用的。

相關應用的資料表使用同一前綴,
如論壇的資料表使用cdb_前綴,博客的資料表使用supe _前綴,
前綴名稱一般不超過5字
比如:
web_user
web_group
supe_userspace

備份資料表名使用正式資料表名加上備份時間組成,如:
web_user_20070403
web_group_20070403
supe_userspace_20070403



5. 欄位命名規範

欄位名稱使用單詞組合完成,
首字母小寫,後面單詞的首字母大寫,最好是帶錶名前綴。
如web_user資料表的欄位: 
userId
userName
userPassword

資料表與資料表之間的相關聯欄位要用統一名稱,
如web_user資料表裡面的userId和web_group資料表裡面的userId相對應


6. 欄位類型規範
規則:
盡量用較少的儲存空間來儲存數一個欄位的資料。
比如能用INT的就不用CHAR或者VARCHAR
能用TINYINT的就不用INT
能用VARCHAR (20)的就不用VARCHAR (255)

時間戳欄位盡量用INT型,如
created:
表示從'1970-01-01 08:00:00'開始的INT秒數,
採用英文單詞的過去式;

gmtCreated :
表示DATETIME類型的時間,
即形如'1980-01-01 00:00:00'的時間串,Java中對應的類型為TIMESTAMP



7. 資料庫設計文件規範

所有資料庫設計要寫成文件,文件以模塊化形式表達。大致格式如下:
 
'-------------------------------------------
'表名: web_user
'作者: Aeolus(傻魚)
'日期: 2007-04-11
'版本: 1.0
'描述:保存使用者資料
'具體內容:
' UserID INT,自動增量使用者代碼
' UserName CHAR(12 )使用者名字
' ......
'-------------------------------------------


8. 索引使用原則:

(1)
邏輯主鍵使用唯一的成組索引,
對系統鍵 (作為儲存過程) 採用唯一的非成組索引,
對任何外鍵列採用非成組索引。
考慮資料庫的空間有多大,資料表如何進行訪問,
還有這些訪問是否主要用作讀寫。

(2)
大多數資料庫都索引自動創建的主鍵欄位,
但是可別忘了索引外鍵,它們也是經常使用的鍵,
比如運行查詢顯示主資料表和所有關聯資料表的某條記錄就用得上。

(3)
不要索引blob/text等欄位,不要索引大型欄位(有很多字元),
這樣作會讓索引佔用太多的儲存空間。

(4)
不要索引常用的小型資料表
不要為小型資料表設置任何鍵,假如它們經常有插入和刪除操作就更別這樣作了。
對這些插入和刪除操作的索引維護可能比掃描資料表空間消耗更多的時間。  

9. SQL語句規範

所有SQL關鍵字全部大寫,比如SELECT、UPDATE、FROM、ORDER、BY等,
所有的資料表名和資料庫名都要用``包含
如:
SELECT COUNT(*) FROM `cdb_members` WHERE `userName` = 'aeolus';


10. 其他設計技巧


(1) 避免使用觸發器
觸發器的功能通常可以用其他方式實現。在調試程序時觸發器可能成為乾擾。
假如你確實需要採用觸發器,你最好集中對它文件化。

(2) 使用常用英語(或者其他任何語言)而不要使用編碼或者拼音首字母縮寫
在創建下拉菜單、列表、報表時最好按照英語名排序。
假如需要編碼或者拼音首字母縮寫,可以在旁邊附上使用者知道的英語。

(3) 保存常用信息
讓一個資料表專門存放一般資料庫信息非常有用。

在這個資料表裡存放:
資料庫當前版本、最近檢查/修復(對Access )、關聯設計文件的名稱、客戶等信息。

這樣可以實現一種簡單機制跟踪資料庫,
當客戶抱怨他們的資料庫沒有達到希望的要求而與你聯繫時,
這樣做對非客戶機/服務器環境特別有用。

(4) 包含版本機制
在資料庫中引入版本控制機制來確定使用中的資料庫的版本。
時間一長,使用者的需求總是會改變的。最終可能會要求修改資料庫結構。
把版本信息直接存放到資料庫中更為方便。 

(5) 規格文件(Documents)
對所有的快捷方式、命名規範、限制和函數都要規格文件。
採用給資料表、列、觸發器等加註解的資料庫工具。
對開發、支持和追蹤修改非常有用。

對資料庫文件化,或者在資料庫自身的內部或者單獨建立文件。
這樣,當過了一年多時間後再回過頭來做第2個版本,犯錯的機會將大大減少。

(6) 測試、測試、反覆測試
建立或者修訂資料庫之後,必須用使用者新輸入的資料測試資料欄位。
最重要的是,讓使用者進行測試並且同使用者一道保證選擇的資料類型滿足商業要求。
測試需要在把新資料庫投入實際服務之前完成。

(7) 檢查設計
在開發期間檢查資料庫設計的常用技術是通過其所支持的應用程序原型檢查資料庫。
換句話說,針對每一種最終資料表達資料的原型應用,
保證你檢查了資料模型並且查看如何取出資料。

2018年12月5日 星期三

架設伺服主機

幫朋友架設Linux主機,很少架設linux主機,之前幫公司架,已經是三年前的事了。而且是用 ubuntu 6.0架的。後來查到有 Centos-Webpanel 可以用,所以就想說架 Centos

第一次下載了 minimal 版的 centos 7.0
摸索了半天,用 win32diskimager 來建立 centos 的usb開機安裝,搞了半天
........
中間錯誤的過程就不記載了
直接紀錄成功簡單的路徑就好。

用最 minimal 的安裝。

將網路設定好,可以往外連線。

然後,依據 Centos-webpanel.com 的指示,一步一步執行。

http://centos-webpanel.com/installation-instructions

記得,要將最後完成的畫面記錄下來,有sql server 密碼,還有登入資訊

設定好基地台虛擬伺服器的 ip/udp :2030

測試一下就好了!

2018年10月24日 星期三

MySQL 區分大小寫

SELECT  name FROM mem WHERE name = 'your_name';

SELECT  name FROM mem WHERE name = 'YOUR_Name';

直接這樣寫,兩個都會成立,也就是不分大小寫。

如果要區分大小寫,就這樣寫:

SELECT  name FROM mem WHERE binary name = 'your_name';

在欄位前面加上 binary 就可以了。

2018年10月13日 星期六

改變 radio 的選項

Form 裡面有 radio control
他的選項需要隨著程式邏輯而變異,如何改變?

例如:該 radio control 叫做: items
在該 control 的 "Before Build SELECT " Event 中增加:

$items->DataSource->Where = " items > 0";

這樣就可以了。

2018年10月6日 星期六

mysql timezone 設定


[重開後仍然維持台灣時區(建議使用此)]
編輯 etc/mysql/mysql.conf.d
在[mysqlid]
下面加上一行
default-time_zone = '+8:00'

2018年9月29日 星期六

MySQL 日期的處理方式

DECLARE v_in_date DATE DEFAULT DATE_SUB(CURDATE(),INTERVAL 1 DAY);

DECLARE v_stage_id INT DEFAULT (SELECT stage_id FROM bonus_stage WHERE TO_DAYS(v_in_date)-TO_DAYS(begin_date) >=0  AND TO_DAYS(v_in_date)-TO_DAYS(end_date) <= 0);

2018年9月24日 星期一

2018年9月23日 星期日

codecharge 設計筆記



Codecharge 的 event
Before_Update
Before_Build_Update
Before_Execute_Update
做了一個隱藏的 text 連結到資料庫,然後在上面三個 update event 將之改變
然後,測試執行 update 後,是否更新到資料庫中
結果:只有 Before Update 有真的更新
其餘兩個,都還是原來的舊值,亦即沒有更新!
好奇怪喔!


Before Update Event
This event occurs at the onset of the operations performed to update a database record.
Possible applications:
  • Checking update rights
  • Preventing a row from updating
  • Setting custom query parameters 

Before Build Update Event
This event occurs before the creation of the query that will be used to update database content.
Possible applications:
  • Setting custom query parameters or changing existing ones

Before Execute Update Event
This event occurs after the query has been composed and immediately before a row update query is executed.
Possible applications:
  • Altering query parameters
  • Opening a transaction
  • Performing transaction operations



經過查詢 codecharge 的產生程式碼,他是 先處理 Before Update
然後進入 Update 程序了
在Update 的程序中,再進入 Before Build Update/Before Execute Update 裡
所以,如果在 Before Build Update/Before Execute Update裡面嘗試要去改變 連結資料欄位的值時已經來不及了。







=================
2018/09/22
================
留意:codecharge的 Object 階層關係。
Page -> Panel -> Form -> Control
查看 help 裡面的範例。
不是每個都可以 SetValue/GetValue
有些是只有 Visibl=True 之類的!

=======================
可以重複使用的內容,可以善用 includeable page 子頁的方式製作。






2018年9月22日 星期六

mysql : to_base64()

Description
Converts the string argument str to its base-64 encoded form, returning the result as a character string in the connection character set and collation.

The argument str will be converted to string first if it is not a string. A NULL argument will return a NULL result.

The reverse function, FROM_BASE64(), decodes an encoded base-64 string.

There are a numerous different methods to base-64 encode a string. The following are used by MariaDB and MySQL:

Alphabet value 64 is encoded as '+'.
Alphabet value 63 is encoded as '/'.
Encoding output is made up of groups of four printable characters, with each three bytes of data encoded using four characters. If the final group is not complete, it is padded with '=' characters to make up a length of four.
To divide long output, a newline is added after every 76 characters.
** 每76個字元,會有一個新行符號!
Decoding will recognize and ignore newlines, carriage returns, tabs, and spaces.

2018年9月14日 星期五

CSRF

CSRF 是一種 Web 上的攻擊手法,全稱是 Cross Site Request Forgery,跨站請求偽造。

https://blog.techbridge.cc/2017/02/25/csrf-introduction/


2018年8月11日 星期六

javascript code 放在head, body, external

javascript 放在body, display performance will be better.
but if you would like to have the javascript code be executed first beginning', you must place it in the head area.

2018年6月3日 星期日

重新安裝 Ubuntu 算了!

原來發現我的主機被植入程式了!
難怪都怪怪的!
最安全起見,就是重新安裝了!

使用最原始的方式安裝
不用 Webpanel 了!
那個好像很不安全!

紀錄一下,重新安裝的過程:


Ubuntu 14.04



1. 更新軟體

sudo apt-get update

2. 安裝Apache


sudo apt-get install apache2
3. MySQL


sudo apt-get install mysql-server php5-mysql
然後初始化 MySQL 的預設資料庫:
sudo mysql_install_db
最後,更改 MySQL root 密碼及移除不必要的權限以加強安全性:
sudo mysql_secure_installation
安裝 PHP
sudo apt-get install php5 libapache2-mod-php5 php5-curl php5-gd php5-mcrypt
sudo service apache2 restart
安裝 防火牆: UFW  
sudo apt-get install ufw
$ sudo ufw allow 21/tcp



xoops 不斷發生 permission 的問題


一直遇到 permission 的問題
明明同一個php 檔案,可以使用,可是,放置某些內容,就產生 permission 的問題
原本真的認為是 file permission的問題,搞了 httpd.conf, vhost.conf, 還有 php.ini 裡面的設定
還研究了 htaccess 裡面的設定
還是一直搞不定!

後來,認為是不是 傳輸內容 大小的問題
試過,放置了大量的文字,也是可以

最後,懷疑是內容裡面的字元衝突
不斷篩選,終於發現:是 "() "的問題!

內容裡面有 左右括弧,就不行
只有單一括弧,可以

這不明白,為什麼!

先記錄下來吧!



如何判斷現在FORM是在 insert mode? 還是 update mode?

只要用  if (empty({primary_key})) 就可以知道是否為新增模式了。 如果 {promary_key} 是空白的,那麼就是在新增模式;反之,就是更新模式。 以上。