[C++][MySQL]修改對應程式碼來避免SQL Injection

最近在做伺服器檢查的時候,發現公司內所寫的幾個背景程式經常莫名其妙出問題.於是開始下來檢查一下,就像前幾篇提到的一樣,我有加上HipChat當做是看門狗的程式來監視並且確實的回報資訊給我. 但是,就算有收到回報訊息.找出容易發生問題的地方才是重點.後來有查到當使用者自己從手機上輸入資料傳到伺服器的時候.就會發生MySQL Query Error ,以下面的範例: "SELECT * FROM `test_sql` WHERE `account` LIKE '".$account."' AND `password` LIKE '".$password."'" 如果這時候,使用這輸入加上有 “ ‘ “的字元,就會產生MySQL Query Error.甚至於會SQL Injeect就是輸入以下的內容: "' OR ''=''#" 這時候唯一的方式就是講 “’“ 轉換成 “'”才不會讓SQL Qeury發生錯誤或是不可預期的狀態. 其實這相關的方式,在PHP裡面相當的簡單就是加上addslashes函式.但是在用C++直接存取MySQL的時候,可就沒那麼方便. 找了一下相關的文章,後來在MySQL API Document 裡面有找到mysql_escape_string,順便也找到有人寫的範例程式可以使用. 引用自這裡http://www.3dbuzz.com/forum/threads/146155-C-version-of-addslashes /** * escapes the mysql string * note running on the entire SQL screws it so just run it on elements to be inserted * @param string sql * @author D.Busby */ char *db_connection::escape_string(string sql) { char *s = new char[sql.size()*2 + 1]; mysql_escape_string(s, const_cast<char *>(sql.c_str()), sql.size()); return s; } 接下來只要將每個要帶入查詢的內容先加上這個函式就可以. 相關資源: 講解基本SQL Injection 的範例與原因 http://newaurora.pixnet.net/blog/post/166231341-sql-injection-%E7%AF%84%E4%BE%8B(%E7%99%BB%E5%85%A5%E7%AF%84%E4%BE%8B) MySQL其實提供了一個函式,可以幫你把有威脅性的字元,加上”"的資源 http://www.3dbuzz.com/forum/threads/146155-C-version-of-addslashes 撰寫一個可以對應可變參數的函式 http://www.dotblogs.com.tw/simplecestlavie/archive/2013/01/02/86637.aspx MySQL mysql_escape_string API document http://dev.mysql.com/doc/refman/5.5/en/mysql-escape-string.html 資安電子報,如何預防SQL Injection 攻擊 http://getpocket.com/a/read/738670748 把一段C++ MySQL 加上解決SQL Injection的程式碼 https://gist.github.com/kkdai/31732f96daa9fd6fb0f7
繼續閱讀

[學習心得]來玩玩Hipchat.. 第一篇

主要是在管的一些伺服器會有莫名其妙的service中斷的狀況,本來有在增加一些log.不論是在MySQL還是程式本身.但是除了要找出原因之外,要能夠迅速的回復服務也是一個方式. 其中想過不少方法,不過也都有撞牆的狀況: 使用SMTP,寄送Email (用Gmail account) 發現Google的安全機制太麻煩了,不僅僅會擋掉其他地區的登入.還會要求你使用網頁版的先登入過gmail 才能使用程式去跑SMTP. 這裡可以參考一些好用的Python Send Email: http://stackoverflow.com/questions/10147455/trying-to-send-email-gmail-as-mail-provider-using-python 使用XMPP (或是使用Facebook Chat) 其實Facebook 的聊天有支援XMPP的,使用Pidgin也可以順利登入.但是考量到Aliyun在大陸內部臉書被擋.放棄! 參考一下Facebook Chat 還是回過頭來使用最被大家所推薦的Hipchat,不僅僅支援的服務多.也可以自己再去手動修改. 裡面比較需要注意的是 API Token 有分 1.0 跟 2.0,大部分外面的應用都是使用API 1.0 這邊有一個比較好用的 CLI的方式,可以直接傳送訊息 Hipchat-cli 這才剛開始.. 希望能把自動化弄得更容易… 參考link Hubot 使用node.js 架設在hipchat的機器人系統 https://hubot.github.com/ 關於hipchat xdite的看法 http://blog.xdite.net/posts/2013/04/02/move-to-hipchat StreetVoice如何使用 HipChat打造自動化機器人 https://speakerdeck.com/tzangms/the-workflow-of-the-new-streetvoice 把Hipchat當成log 小鋪 http://demo.tc/Post/799
繼續閱讀

由iPhone4轉到iPhone6 Plus無圖片的開箱經驗談

我的iPhone4 也使用了三年半,這次iPhone6變大了實在很對我的胃口. 難得搶到中華電信的第二波領機專案,所以就順便攜碼過來,但是攜碼卻比想像中的困難. 開箱不會有開箱照,不過倒是有一些注意跟提醒,如果你跟我一樣是從iPhone4 轉到 iPhone6. 特別是如果你是攜碼(NP)的用戶,要注意: 電話資訊的轉移: 這裡給需要使用到itune備份與還原的人,使用到icloud的人代表也不太需要把資料轉過去. 先使用舊的iPhone4 連接到你的itune 選擇備份”到這個電腦” 建議把app與購買項目一併備份起來. 打開你的iPhone6 記得把一些初始設定都先跑完,到達一般使用的狀態 連接itune,自然會出現”歡迎使用新的iPhone” 選擇”從此備份回復” 這樣就可以了….. 簡單又快速..(就算我32G 用到幾乎滿,轉過去也大概20 mins) 電話帳號的轉移: 這邊比較需要提一下的是,先註明一下iPhone4 是 micro-sim 而 iPhone6/6Plus 使用的是 nano-sim 還有,中華電信的攜碼(NP)門號要有10天的作業時間.於是你可能得繼續使用你舊的門號.可是呢? 聽中華電信的小姐說,如果你先申辦攜碼(NP)的話,可能原來的電信商就比較不會主動幫你做卡片更換的動作. 所以,這邊可能要請還沒領機的人先注意一下,正常程序如下: 先到原電信商申請nano-sim 卡 這個時候可能會用遺失或是換卡處理,所以你最好順便拿一下 nano-sim 轉 micro-sim 的轉卡,不然短時間會沒卡 到中華電信去領機 使用原來電信商的卡片 不要跟我一樣,直接跑到了中華電信發現卡片還沒換.結果櫃檯人員好心的等我去對面把卡換過之後繼續領機的過程.途中還發現某電信傷的nano卡缺貨,還跑到第二家才有. 大螢幕真棒…. 一次升上 128G
繼續閱讀

[Moocs]Programming Mobil Aplication on Android Platform (1)

前言: 這本來是Moocs上面一系列關於Java/Android課程Mobile Cloud Computing with Android的第二門課程.由於最近我把第二階段的課上完了.也在想說要不要學一下.先開始follow看看… 其實對於Android 我還是處於不是很熟悉的狀態.雖然當初已經把一些簡單的相機功能有寫出來.但是整個還是架構不熟悉.也順便來學習一下. 關於環境使用: 關於Emulator的Shell使用,由於我使用的是Genymotion.稍微玩了一下,發現command幾乎都不太一樣. Genyshell 必須在Genymotion模擬器跑起來之後再用 genymotion capabilities 可以查詢所有支援的指令 就算你查到camera/accleronmeter可以使用,但是其實因為是模擬器.其實是不能用的. battery getlevel/setlevel 來設定電源目前使用量 gps setaltitude/setlatitude 可以來設定目前gps地點資訊 Emulator Call 這個部分使用AVD(Android Virtual Device)可以,但是我還沒找到如何使用Genymotion來做. DDMS Perspective 這個部分我比較沒有在使用,不過這次的教學也會清楚地教導如何使用DDMS.主要在Hierachy View 還有 Methond profiling. 關於Activity Lifecycle 筆記一些我比較沒有注意的部分: OnResume 發生的時間點是最多的,基本上就是Activity 出現前就會發生.所以以下情況都會發生: 第一次執行OnCreate之後 離開App回來之後 OnPause與OnRestart的返回 OnPause 發生在準備要離開Activity的時候,緊接著是OnStop會收到 OnStop 會出現在 OnPause之後,所以不一定會被呼叫到,如果user使用kill app.這時候只會有OnPause 旋轉手機的時候,OnCreate,OnStart跟OnResume都會發生 其他更多可以在這裡看到 http://developer.android.com/training/basics/activity-lifecycle/index.html
繼續閱讀

[GTUG][GDG]#11 Google Tag Manager 介紹

心得: 原本想說要休息一兩個禮拜專心趕Mooc的作業,只是剛好作業進度都超前加上許久不見的Marx也會去,順便去了解一下. 「Google Tag Manager 」對我而言是完全新的東西,雖然我比較常用Google Adsense跟Google Analytics. 簡介GTM 做電子商務的網站的人都了解,如何有效地分析使用者的動作跟流量一直是一個很大的問題.所以這時候會在網頁上面加上許多的JS.但是每次類似的修改都得要動到網頁本身,對於有CDN作為cache的商家而言,是一個很困擾的事情. Google Tag Manager(GTM)本身就是一個異地的library,可以寫在原本的網站的裡面.幫助作為網站分析與電子商務廣告的部分. 原本你想要增加新的功能(比如說增加Google Analytics,或是增加新的追蹤)是需要去修改原本的程式碼. 但是使用了GTM之後,就再也不用去修改原本的網站部分.只需要去管理頁面增加一些標記,規則或是巨集.也不用擔心cache與CDN造成的delay. 速記: 加上GTM前注意: 最後的”dataLayer”要移除掉,因為這個東西很常被其他JS使用. Checking Pixel 利用 1 pixel 的圖片,來帶參數以達到廣告作用.(偵測流量) Google Tag Manager主要有三個可以加入的東西 標記 增加或是搭配其他的服務(Google Analytics) 規則 增加許多規則,可以是網頁參數,可以是JS參數. 巨集 可以使用Regular Expression 來處理更多事情. 標記的”點擊接聽 “ 可以監聽所有網頁上的點擊動作(button 甚至是其他…) 可以利用console 去查看dataLayer網頁上的點擊動作. Google Tag Manager的優點 加上了Google Tag Manager他會加上亂數去破壞cache,對於有 使用CDN的網站而言.這樣才能達到及時更新的效果. 也俱有程式碼最佳化,與瀏覽器的相容性問題 本身也具有版本控管,不過講者建議使用Git(把code自行複製出來再貼到git) Google Analytics的進階使用: 原本使用IP,現在使用session 可以偵測跨網域的使用者 參考資料: GDG活動網頁 http://gdg-taipei.kktix.cc/events/google-tag-manager-intro GTM (Google Tag Manager 官方網頁) http://www.google.com/tagmanager/ GTM 簡單的教學 http://analyticsdavis.blogspot.tw/2013/11/google-tag-manager.html GTM 教學與簡介 http://9i543.com/10665/websys
繼續閱讀

[Golang][CSharp][PHP]寫出備份4image與把資料寫入EXIF的工具

前言: 之前提過買了NAS之後,先把所有的照片全部傳到NAS上面.接下來就要去面對令人不想管的事情.把接近兩百個類別,數萬張的相片名稱與資訊弄出來. 因為我以前的相簿使用的是4images,這是一套挺簡單的PHP相簿. 為了要把4image相簿裡面的資料弄出來.. 想弄個Go MySQL結果Oracle 密碼搞半天~下載個MySQL解開還要6XXMB? 靠~決定換MariaDB 反正在Go上面的Driver都一樣…. 但是似乎發生了一些難以解決得問題. 所以最後使用C#來完成EXIF寫入的動作. 不過似乎最後遇到一些在Windows上面的問題,至於為什麼要用Windows是因為我找到了一個可以修改EXIF的小工具,而他有Windows的. 流程: 先試著把資料庫弄出來到Mac上面 安裝 MariaDB (參考這裡) brew install mariadb mysql_install_db mysqld_safe –datadir=’/usr/local/var/mysql’ 修改密碼 mysqladmin -u root password ‘PASSWORD’ 把資料匯入 mysql -uroot -p DB_NAME —force < File_NAME 關於Golang 針對MariaDB的部分 參考這邊就可以 這邊有範例程式碼 不過對於我而言,問題出現了: 資料庫裡面都是亂碼(如果透過 phpMyAdmin 抓資料出來的話),由PHP直接讀是正確的 發現問題可能出在當初phpAdmin的設定的問題,可以參考這個原因 到這裡先決定暫停Golang與MySQL的工作,先專注把資料弄出來: 最後決定先用PHP把資料匯出,然後把東西放在個別資料夾: 類別名稱與敘述放成檔案 FOLDER_NAME.txt FOLDER_DESC.txt 相片裡面的敘述跟標題放在 pic_NAME.txt pic_DESC.txt 程式放在 4image PHP Dumptool 接下來就要寫一個工具把在文字檔案裡面的EXIF資訊寫回相片本身的EXIF,由於沒有比較好的Go-EXIF工具.這裡我找到的事Exiftool.它是一套Perl寫的工具,本身可以跨平台.而且看起來功能還挺不賴的. 所以要使用Golang 去寫一個Windows 下面裡用command line 操控Exiftool來修改相片的EXIF 這裡又遇到一個問題是,不知道為什麼在Windows下面裡用Golang使用command line 執行的parameter都會多一個 “ 有在Stackoverflow上面詢問,不過其他人都遇不到這樣的問題? 先停住,改成用C#來寫寫看 使用C# 來寫就快多了,大概幾個小時就兜出solution並且可以處理幾萬張照片.不過有幾個東西需要記錄. 需要有短暫的sleep不然太快會讓command line tool failed. 這個工具也放出來,搭配PHP工具一起使用才能正常作用喔.. 參考: MariaDB (MySQL) installation guide https://mariadb.com/kb/en/mariadb/documentation/getting-started/compiling-mariadb-from-source/building-mariadb-on-mac-os-x-using-homebrew/#installing-mariadb How to import SQL to MySQL http://stackoverflow.com/questions/17666249/how-to-import-a-sql-file-using-the-command-line-in-mysql How to connect MariaDB via Go https://mariadb.com/blog/using-go-mariadb PhpMyAdmin 瀏覽資料庫內容會呈現亂碼的解決方法 http://visdacom.com/Website_Design/index.php?load=read&id=28 http://forum.serverzoo.com/showthread.php?t=2416 http://www.chou-it.com/info/infra/db/mysql_01.html
繼續閱讀