※ 本文為 dinos 轉寄自 ptt.cc 更新時間: 2015-10-29 10:52:30
看板 PHP
作者 標題 Re: [請益] PHP字元溢位(OverFlow)
時間 Thu Oct 29 02:49:46 2015
※ 引述《st1009 (前端攻城師)》之銘言:
: 不好意思,我初學php加設網頁後台,
: 想詢問一些關於php的基本問題>///<
: 1.
: 請問php的一個變數內部可以融納下多少位字元,我在查這個時都查到整數(int)的~__~
: 如果我設定 $x = $_POST["x"]; 讓使用者輸入字串,
: 使用者輸入字串超出變數可以融納下的範圍php會如何處理?
不同資料型態不能一概而論,也不建議去挑戰這種事情。
不過以字串來說..
https://secure.php.net/manual/en/language.types.string.php
「Note: string can be as large as up to 2GB」
字串長度上限是2GB,我想應該大多數情況下你不用擔心有人 post 2GB 的東西進來...
陣列在記憶體夠的前提下,我平常用的時候百萬或千萬之類的數量也沒啥問題
同樣的我想你應該也不用擔心有人 post 一千萬個欄位進來...
在你碰到這麼大的資料之前,通常你會先因為記憶體不夠而整隻 script 死掉。
: 2.
: 我看網路上有的網址為.php?id=1
: 有的甚至可以直接在URL列登入帳號密碼,
: 請問這個運作過程為何?為何能實現?
: 再自行架設的網站內試圖於URL登入,但都失敗QAQQQ
「登入」的意思是「記住這個人是誰」,至於是 post 或 get 都跟「記住」這件事無關
記住的方法可以用 session,也可以用 cookie。
程式流程大概會像這樣
- 檢查帳號密碼對不對
- 對了,做一個記住的動作
- 錯了,做一個顯示錯誤訊息的動作
當然了,登出也就是「忘掉」,把「我是誰」這件事從 session/cookie 裡面砍掉
不過 cookie 是使用者可以亂改的東西,使用時請注意
但是講到這個用網址登入...假設你可以可以用網址直接登入,那麼
- 瀏覽器的歷史會記住這個帳號密碼
- 你後面的人會看到網址列的帳號密碼
- Google 可能會記住這個帳號密碼
- 我可以搜尋「inurl:www.example.com/login.php」直接爬出一大堆
- 各種奇怪爬網址的 bot 可能會抓到這個帳號密碼
不要、不要、不要用 get 傳帳號密碼
登入時傳帳號密碼請用 post
: 3.
: 我看見訪間有一種網頁攻擊方式為xss攻擊,
: 再自行架設後的留言板中進行測試,
: 發現如果我直接輸入<script>標籤他會產生反應,
: 但是當輸入:
: <script>alert
: ('hacked')</sc
: ript>
: 卻是以字串方式呈現,是否xss攻擊無法由10進制html代碼,甚至其他代碼執行,
: 只要我過濾掉了'<'和'>'就不須當心xss了?
https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
這一整頁長長的都是 XSS 的方法,裡面有很多不用直接打 <>
實際上到底要怎麼防禦才完善要 case by case 去看
- html 的內文要靠 htmlspecialcahrs() 去洗
- 如果你還想讓使用者自己輸入 html,自己擋會擋不完...請參考 html purifier
- javascript(咳)通常可以靠 json_encode() 去洗
- 網址...恩...這有點難搞...
: 4.
: 聽說要擋住sql injection 只要使用magic quotes就可以了(?
: magic quotes後來不被php自動執行請問是有什麼副作用?如何避免?
不要用 magic quotes,這是上個世紀留下來的失敗功能
- 你會拿不到原始的使用者輸入資料
- 稍微不小心一點,你就會把「It's Friday」存檔成「It\'s Friday」
- 對於有經驗的攻擊者以及設計良好的 bot,magic quote 毫無用處。
所以 PHP 三年前把這功能拔掉了。
現代推薦的正確做法,是使用 PDO 跟 prepared statement
$db = new PDO($dsn, $db_user, $db_password);
$stmt = $db->prepare("SELECT nick_name FROM users WHERE uid = ? LIMIT 1");
$stmt->execute([$uid]); // 這邊就算 uid 被塞了髒東西也不用怕
$result = $stmt->fetch();
echo is_array($result) ? "我是" . $result['nick_name'] : "查無此人";
--
莉娜用魔法爆破進入屋內。
劫犯從另一個房間裡出現,大叫道︰「妳是誰!」
莉娜︰「我是個可疑的女人!」
劫犯無言以對。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.27.80.218
※ 文章代碼(AID): #1MCHZHgZ (PHP)
※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1446058193.A.AA3.html
※ 編輯: GALINE (114.27.80.218), 10/29/2015 03:18:26
--
--
回列表(←)
分享