做了一個會員登入的網站,登入後的資料頁面是用session來判斷,方式如下
一、login成功後,產生一個$_SESSION['admin_name']
session_start();
$_SESSION['admin_name'] = $row->username;
二、需要登入才能讀取的安全機制:用有沒有$_SESSION['admin_name']來判斷是否有登入
session_start();
if(empty($_SESSION['admin_name']) || !isset($_SESSION['admin_name'])){
echo "<script type=\"text/javascript\">";
echo "self.location=\"index.php\"";
echo "</script>";
}
實際操作起來都沒問題,如果沒有登入,該網頁就會自動導向index.php
但後來發現yahoo的搜尋引擎居然可以直接找到被session保護的頁面內容
請問各位前輩,是我的登入機制有安全上的盲點嗎?
盲點就是你用了前端的JS轉址~
一般轉址都是用後端語言處理的~
搜尋引擎對JS而言是不起作用的~
他只把網頁當成純文字檔案而已~
前端的JS是使用者可以控制的,他可以讓任何一段JS失效
所以你的保護頁面如果沒有含機敏資料,是可以這樣做沒錯
但如果含有,還被讀到,那就是你的問題。
不希望爬蟲爬可以寫規則到robts.txt裡面
JS 轉址也不是不行
但是後面的資料就不要送出去了
例如用 exit 終止 php
session_start();
if(empty($_SESSION['admin_name']) || !isset($_SESSION['admin_name'])){
echo "<script type=\"text/javascript\">";
echo "self.location=\"index.php\"";
echo "</script>";
//這裡把 html 標籤閉合一下(略)
exit(); //終止
}
記得用 header 轉址也是要加 exit
不然後續的資料也是會送出去
可以的話就改成PHP 回傳直接 302 導出去 (https://stackoverflow.com/questions/768431/how-do-i-make-a-redirect-in-php)
至於已經被 yahoo 收錄進去的網站
可以提交 robots.txt (https://tw.help.yahoo.com/kb/SLN2214.html)
session_start();
if(empty($_SESSION['admin_name']) || !isset($_SESSION['admin_name'])){
header("Location: https://example.com/index.php", true, 302);
die();
}