GAE版本1.5.5
錯誤
Error: 500 Server Error
和
Error 400: --- begin server output ---
Cannot build indexes that are in state ERROR.
主因一開始是改寫GQL條件後,沒有先update index(或自動設定情況下local端先跑過query)就上傳到google server,第一個出現的錯誤是NeedIndexError,想更新index卻中了五月就說修好的issue,部份index卡在Error State,參考以下步驟自行解決
1. 備份index.yaml
2. 將index.yaml去掉有問題的index
3. 執行appcfg.py vacuum_indexes app_dir
4. 一直等,直到有問題的index被清除,可能需要數小時,也可能數小時之後無效,重新執行步驟3
5. 還原index.yaml 執行 appcfg.py update_indexes app_dir
2011年10月13日
2010年9月8日
GAE subquery
最近有一個需求是檢查某一個清單成員是否位於另一個清單之中
原本的作法很直覺的使用一個迴圈跑GQL查詢where member IN somelist
做簡單測試的時候也沒什麼問題
但是跑實際資料的時候會發生
BadArgumentError: Cannot satisfy query -- too many subqueries (max: 30, got 390).
Probable cause: too many IN/!= filters in query.
由於GQL實做不等式比對其實是跑多個subquery子查詢 然後把結果聯集在一起
但是從錯誤訊息看起來subquery的上限是30個, 在此情況也就是somelist最多只能有30個項目!
只能查30個能做什麼事情 拿來查是不是冠酉的相好都不夠了
不知道這個功能原本設計用來做什麼 還是我誤用了這個功能嗎
標籤:
Google app engine,
GQL
2010年8月8日
Google App Engine Note
1. GqlQuery目前1.3.5版可以做某個屬性對一個ListProperty的不等式查詢(如!=, IN) 但是Query的filter()只能做屬性對單一值的不等式查詢,這是不太一樣的地方,而且不等於的查詢實際上是拆成大於和小於兩個查詢之後取"聯集",這點在我的case裡面非常的不直覺也非常不好用,整體說起來,用GQL比較適合正向表列搜尋,對於ListProperty很難去搜尋"除此條件之外"的實體
2. 目前的dev版本的appserver一次只能對應一個http connection, 所以如果背景有同時在跑一些ajax的東西的話有可能會接到錯誤訊息(10053, 'Software caused connection abort'),如Facebook Javascript SDK
3.自己用single sign-on開發網頁的時候遇到怎麼有時後點fb:login無法登入,還會得到"FB.login() called when user is already connected."的錯誤訊息,檢查之後才發現Facebook給的cookie怎麼好像過期不見了,但是新的cookie又沒有被Javascript SDK抓下來,這是因為localhost在外部是看不到的,可以用一些工具來輔助或是等deploy之後再測試
2. 目前的dev版本的appserver一次只能對應一個http connection, 所以如果背景有同時在跑一些ajax的東西的話有可能會接到錯誤訊息(10053, 'Software caused connection abort'),如Facebook Javascript SDK
3.自己用single sign-on開發網頁的時候遇到怎麼有時後點fb:login無法登入,還會得到"FB.login() called when user is already connected."的錯誤訊息,檢查之後才發現Facebook給的cookie怎麼好像過期不見了,但是新的cookie又沒有被Javascript SDK抓下來,這是因為localhost在外部是看不到的,可以用一些工具來輔助或是等deploy之後再測試
標籤:
Facebook,
Google app engine,
GQL
2010年7月25日
網站安全- 攻擊與消毒
由於聽過太多網站被攻擊的消息
自己在建制網站的時候一天到晚都在想自己會被怎樣攻擊
也害怕我的網站使用者被其他使用者攻擊
今天翻了一些文章和一些書發現有一些我想像的攻擊是不會發生的
還有許多常見的攻擊和解決方法 我就挑我的網站可能遇到的來看
Script insertion, XSS (Cross-Site Scripting), DoS (Deny of Service)
這些是比較有可能發生在我身上的
前兩者主要是壞人將惡意程式碼植入到網站的資料區
在其他使用者讀取資料或是跟網站互動的時候就會自動(或是被動)的執行這些程式碼
常見的攻擊比如說url redirect或是cookie hijacking等等
消毒的方法主要是在網站資料"輸出"的時候做escape來讓惡意程式碼失效
因為在資料庫內的資料可能為其他API所用 所以在輸入的時候可以不及著過濾
但是如果以資料來當作連結位置
比如說<a href=$url>或是<img src=$src>的時候(就是我自己遇到的問題)
escape也沒有效, 最好在資料寫入的時候就做判斷
把javascript, \0(nul攻擊), \r\n \' \"這些東西先過濾掉
如果是以資料當作script和style的來源則幾乎沒有100%安全的防治方式
要保護cookie的話
網路上則有人建議在set-cookie的最後面加上HttpOnly來防止Javascript存取
但是我應該不會這麼做 因為我沒有存重要資料在cookie裡面,
而且用Javascript來使用一些cookie我覺得還滿方便的
還有一種攻擊我忘記名稱了@@"
可以發出合法的資料 但是卻能給予其他使用者被動攻擊
我只記得必須要去檢查request header裡面的referer
確保是自己發出來的request就行了
Dos就主要是對網站本身的攻擊
比如發出大量的request來讓伺服器無法提供服務給其他使用者
我自以為在Ajax裡面要發生是比較困難的
但是我可能會盡量多發揮cache的功能
最後,不知道GQL有沒有內建避免類似SQL injection發生的功能
但是基本上我也打算一併做掉比較安心 畢竟這能夠造成的傷害恐怕是最大的
總結:
1.在網站收到資料的時候要對資料保持懷疑的態度,對資料做徹底檢查
該是整數就是整數,該符合某個正規表示就好好的過濾一發
還要檢查request的來源
2.在網站輸出的時候要做escape
備註:
訂閱:
文章 (Atom)