iT邦幫忙

1

[php] 網頁資安問題

大家好:

想請問login->a網頁(a網頁從login網頁抓取session),原本是在a網頁有設定session判別若不符合就跳轉,因為我設定的session好像蠻簡單的,若有心人事直接從a網頁植入session要判別的參數話,應該就可以直接登入a網頁了,想問要怎麼讓session難以判斷?

1.a網頁從login網頁抓取session內容加密再解密? (但不夠嚴格也是會被破解..?)

謝謝

看更多先前的討論...收起先前的討論...
fillano iT邦超人 1 級 ‧ 2020-07-17 18:02:47 檢舉
a網頁從login網頁抓取session內容...你知道session怎麼運作的嗎?

這方面的建議設計應該不難google到
fillano iT邦超人 1 級 ‧ 2020-07-17 18:08:02 檢舉
不是加解密的問題,在登入時,可以用一些client端的資訊存進session當作特徵值,例如client ip、瀏覽器等,然後在需要登入的頁面做檢查。這些通常不會頻繁更換,可以當作基本的判斷。
froce iT邦大師 1 級 ‧ 2020-07-17 20:47:29 檢舉
https://medium.com/@hulitw/session-and-cookie-15e47ed838bc
session內容不是由前端js可以更動的,覺得你想太多了
mayyola iT邦新手 1 級 ‧ 2020-07-22 08:51:05 檢舉
我原本想說前端會不會有可能session=值 進去,不過j大好像說不太可能@@
不過我看書,好像session id 可以偽造 建議session.use_strict_mode 設定為1比較好
雖然他說避免執行未經系統初始化的session id (聽起來很專業 不太懂會有甚麼影響)
謝謝各位大神
2
淺水員
iT邦研究生 4 級 ‧ 2020-07-20 13:47:42
最佳解答

補充一下,雖然說 session 的內容無法透過 javascript 直接存取,只能透過後端處理。
但是要注意 跨站請求偽造(英語:Cross-site request forgery;簡稱:CSRF) 的問題。
如果是用框架在作網站的話,很多框架已經有提供 CSRF 的防護。
如果是自己寫的,那就要注意一下了。

除了 CSRF 之外,有種狀況是自己的網站有 XSS 漏洞,這讓攻擊者有可能插入 javascript 在其他使用者的頁面。
這時候如果 session id 沒有設定 HttpOnly 等相關屬性,就可能透過 javascript 把使用者的 session id 傳給攻擊者。
假如後端沒再比對來自前端請求的一些資訊(來源 IP 等),那麼攻擊者也可以偽裝成使用者登入了。參考

froce iT邦大師 1 級 ‧ 2020-07-21 15:51:58 檢舉

Yes。
其實我一開始丟的那篇非常詳盡。我是覺得有寫網站的都該看一下。

附帶一提,php要設定HttpOnly要去php ini設。或是在程式進入點多一行

ini_set("session.cookie_httponly", 1);

最近在改舊的php網路硬碟(QuiXplorer)也順手修正了。

3
浩瀚星空
iT邦超人 1 級 ‧ 2020-07-18 21:49:42

我只給一個簡單的重點。

前端不可能給session。
session一定都是後端設定的。

除非你開放通路給前端到後端跑session。

所以你要注意的只是注入的問題。而不是去注意session。

0
Chiyung579
iT邦新手 5 級 ‧ 2020-07-19 19:53:48

關於 session,
前端部份只會知道 session id,
這個 session id 沒什麼資訊內容…

但是這個 session id,
被後端拿到後,
可以透過 session 的機制(存在檔案或資料庫),
讀到之前存的機密資料...
並將其導入後端的某陣列
例如 PHP 的話應該是 $_SESSION
而這些是不會被竄改或植入的,
因此應該是不必擔心這些...

mayyola iT邦新手 1 級 ‧ 2020-07-23 22:56:43 檢舉

謝謝C大

0
japhenchen
iT邦高手 1 級 ‧ 2020-07-20 08:17:55

session內容不是由前端js可以更動的,覺得你想太多了
反倒是注入的問題..............
如果你有由前端送回(GET/POST)到後端的字串組成SQL的習慣,這才是最可怕的事

比如前端POST使用者名稱USERID、密碼PW,回後端組成SQL,就會是

$SQL = "SELECT COUNT(*) AS CNT FROM USERDATA WHERE USERID = '{$_POST["USERID"]}' AND PASSWORD = '{$_POST["PW"]}'

如果你沒有把USERID跟PW做逸脫字元置的話,入侵者只要幹一件事
把要送回後端的 USERID / PW 做點手腳,你們就gg了

USERID = "admin" ;
PW = "12345' OR '1'='1" ;

或是用註解錨點
USERID = "' or 1=1 /*" ;

他就能取得最大權限了(以上假設你們的管理員的帳號是admin)
這就是SQL Injection....
處理的方法很簡單,更新PHP、MYSQL、MSSQL,或是手動過濾掉POST回來的帳號密碼裡的逸脫字元 ' /* 及空白.....

或是更改驗証帳密的方法

如果你有興趣,你可以去找一套Discuz 2.0版的老論壇系統試試,這個入侵的方法還真有效

mayyola iT邦新手 1 級 ‧ 2020-07-23 22:46:09 檢舉

j大好,
php的ini好像可以濾掉逸脫字元
所以像js的ajax前端送到後端,就有可能有資安疑慮對嗎?
因為變數ajax 網頁都看的到..這有辦法預防嗎?謝謝

把逸脫字元處理掉就好了,其實別用古早版的MYSQL、MSSQL,現行用的本都有針對這個問題做處理,只是要改變由前端變數直接串SQL的習慣,這是你自己得做的

我要發表回答

立即登入回答