PHP之旅8 URL與表單

表單php

表單的出現讓用戶和後臺主機有了直接的交互,網站開始變的‘動態起來’,在HTML的各個標記符中,與PHP關係最爲緊密的要屬表單標記符了,常見的表單標記符有<form>、<input>、<button>、<select>、<option>、<textarea>等,其中<form>標記符是表單中最基礎最重要的標記符了。全部提交給後臺的數據必須包含在<form></form>之間。其用法以下:html

<form name="value" action="value" method="value">
</form>

其中 name 用來設置表單的命名,經過該命名,後臺程序能夠方便的訪問表單數據。action屬性用來設置表單處理程序的地址,通常爲服務器端腳本文件(如PHP程序)或CGI程序的地址。method 屬性用來定義數據從客戶端瀏覽器傳到服務器的傳送方式,有兩種:GET和POST。GET 傳遞方式是將表單數據添加到URL地址後面進行傳遞,不適合大數據的傳遞,由於有的瀏覽器會對信息的長度進行限制,太長的信息會被瀏覽器截斷,從而致使信息的丟失。POST傳遞方式是將表單數據包含在表單主體中,一塊兒傳遞給服務器,適合大量數據傳輸,並且不會在瀏覽器地址欄顯示出表單數據,先對GET方來講比較安全,在不指定method屬性,瀏覽器會默認使用GET方式傳輸表單數據。java

get方法的實例:瀏覽器

<form action="<?=$_SERVER['PHP_SELF'] ?>" method="GET">
    用戶名<input type="text" name="username"><br>
    密碼<input type="password" name="passwd"><br>
    <input type="submit" name="submit" value="提交">
</form>
    
<?php
if (isset($_GET['submit'])) {
    echo "<br>";
    echo '用戶名:'.$_GET['username']."<br>";
    echo "密碼:".$_GET['passwd'].'<br>';
}
?>

在沒點擊「」提交「」以前的頁面安全

主要看網址;在點擊提交以後服務器

網址改變了,並打印出了用戶名和密碼。xss

 

post方法的實例:函數

<form action="<?=$_SERVER['PHP_SELF'] ?>" method="POST">
    用戶名<input type="text" name="username"><br>
    密碼<input type="password" name="passwd"><br>
    <input type="submit" name="submit" value="提交">
</form>
    
<?php
if (isset($_POST['submit'])) {
    echo "<br>";
    echo '用戶名:'.$_POST['username']."<br>";
    echo "密碼:".$_POST['passwd'].'<br>';
}
?>

 

 

當沒有點擊「提交」以前post

和get沒有區別大數據

當點擊「提交」以後

從上面的比較能夠看出POST和GET的區別,兩個在提交以後的網址上看出來POST要比GET方法安全些。

注意:

此處使用的action="<?=$_SERVER['PHP_SELF'] ?>"存在xss攻擊,

當打開localhost/mytest/index.php時構造一個script函數就能夠進行攻擊

不如這個,當請求http://localhost/mytest/index.php/%22%3E%3Cscript%3Ealert('xss')%3C/script%3E%3Cfoo時

頁面會出現這種狀況:

查看源代碼會發現

action的值變爲咱們請求的地址了,這個是在寫超全局變量時說過的,$_SERVER['PHP_SELF'] 這個函數會會原封不動的反映網址自己,因爲html是一個標籤類的語言,直接經過構造javascrip函數就能夠進行xss攻擊了。

解碼以後的構造函數時:/"><script>alert('xss')</script><foo,

解決方法時1.用htmlentities($_SERVER[’PHP_SELF’])來替代簡單的$_SERVER[’PHP_SELF’]

2.用$_SERVER[’REQUEST_URI’]來替代$_SERVER[’PHP_SELF’]

因此,form的action仍是不要留空的好。第二點,除了PHP_SELF以外,其餘的$_SERVER變量也許也會有相似的漏洞,好比SCRIPT_URI, SCRIPT_URL, QUERY_STRING, PATH_INFO, PATH_TRANSLATED等等,在使用他們以前必定要先做htmlentities之類的

相關文章
相關標籤/搜索