看板 PHP 關於我們 聯絡資訊
※ 引述《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>標籤他會產生反應, : 但是當輸入: : &#60&#115&#99&#114&#105&#112&#116&#62&#97&#108&#101&#114&#116 : &#40&#39&#104&#97&#99&#107&#101&#100&#39&#41&#60&#47&#115&#99 : &#114&#105&#112&#116&#62 : 卻是以字串方式呈現,是否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 ※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1446058193.A.AA3.html ※ 編輯: GALINE (114.27.80.218), 10/29/2015 03:18:26
y2468101216: 推這篇 10/29 16:37
xdraculax: 真的需要存長字串還是要查一下memory_limit比較好,4年 10/29 21:36
xdraculax: 前在某遊戲公司改後台,它字串最長只能200KB... 10/29 21:36
dlikeayu: nosql+json request parse才是長久之計 10/30 04:06
dlikeayu: 跟交易模式比較有關的或真的需要ACID定義的再用SQL 10/30 04:10
st1009: 專業詳細,感謝您(≧<>≦) 10/30 23:18