今天看到書上寫的關於防止跨域提交的方法,他是在表單提交頁面產生一個隱藏的input,值是存在session裡隨機數
index.php頁面
以下是b.php代碼
if($_POST['token'] == $_SESSION['token']){ # do code}
我的疑問是這樣真的可以防範跨域嗎?假如我現在訪問index.php 然後右鍵查看原始碼,把token複製下來,在本地建立一個表單頁面,地址也提交到b.php,用複製好的token值,不就完成跨域了嗎
謝謝幾位的耐心解答,月領的一句話提示了我,我又翻閱了一下書上會話控制這節,簡單說一下session機制,不同電腦訪問伺服器上的index.php指令碼,會在你本地設定一個值唯一的session_id的cookie檔案,同時伺服器上也也會存在一份和你本地session_id值相同的資料,裡面儲存有$_SESSION['token']的值。所以說由於你本地cookie中session_id的唯一性,不同電腦在伺服器上的session資料是不一樣的。
回複內容:
今天看到書上寫的關於防止跨域提交的方法,他是在表單提交頁面產生一個隱藏的input,值是存在session裡隨機數
index.php頁面
以下是b.php代碼
if($_POST['token'] == $_SESSION['token']){ # do code}
我的疑問是這樣真的可以防範跨域嗎?假如我現在訪問index.php 然後右鍵查看原始碼,把token複製下來,在本地建立一個表單頁面,地址也提交到b.php,用複製好的token值,不就完成跨域了嗎
謝謝幾位的耐心解答,月領的一句話提示了我,我又翻閱了一下書上會話控制這節,簡單說一下session機制,不同電腦訪問伺服器上的index.php指令碼,會在你本地設定一個值唯一的session_id的cookie檔案,同時伺服器上也也會存在一份和你本地session_id值相同的資料,裡面儲存有$_SESSION['token']的值。所以說由於你本地cookie中session_id的唯一性,不同電腦在伺服器上的session資料是不一樣的。
首先,按照你說的方法是跨域不了的。
if($_POST['token'] == $_SESSION['token']){ # do code}
請注意上面的檢驗,$_SESSION['token']是什嗎?
SESSION只對你自己的網頁有效,你造嗎?
正確的思路是把本地的Cookie(對應著SESSION的資訊的)也複製下來,然後發送過去。
然而只用瀏覽器和手寫HTML是沒法很簡單地完成的。
防止跨域提交只是保證網頁不被其它網頁的JS攻擊而已,不要期待太多。
另外,你要知道網頁是對所有人開放的,你的所有可以被訪問到的PHP都可能收到各種各樣的參數。
駭客攻擊、使用者濫用、網頁BUG……
比如,某個表單需要輸入電話號碼提交。
使用者可能禁用掉JS,然後輸入了20位的號碼。
駭客可能使用工具,亂髮參數試探你的後台代碼。
So?
所以你就不寫檢驗電話號碼正確性的代碼嗎?
不能因噎廢食啊,騷年。
正常情況下 防止跨域 提交是指的從 domainA
下提交資料到 到 domainB
下的這種情況,
而且正常情況下 domainA
下的頁面是沒有辦法拿到 domainB
域下頁面的內容的,
而你直接跳過了瀏覽器對不同域之間所做的限制(由你自己手工完成token的擷取,跨過了不同域下不能得到內容的這個限制), 所以你的這種做法實際上是行不通的(不是指你提交token
對方不認可, 而是指你在http/https
下是實現不了自動化的).
而且更進一步的, 除了加token
之外, 還有一些其他的附加方法,比如檢測請求的來源(referer
)是否為本站.
是的 沒錯 跨域只是瀏覽器本身的安全措施 而且是正規瀏覽器 從這次xcode事件
媽的萬一以後有不按規則玩的瀏覽器來怎麼辦
要不為什麼我拿了session在flider這種調試工具裡就可以隨便post
不過session(token)就是使用者合法身份的標識 拿這些也是要登入或者鑒權的
唯一的可能就是他是個開發人員 或者是個機器人。。。
另外token的更主要用途是防止重複提交 或者csrf
我看著真糾結,那個b.php的處理代碼處理完一個表單後就銷毀會話token讓每次提交處理都是新的token不久解決了跨域問題?樓主說的已經很棒了,補充一下