之類的 HTML 字符會(huì)被替換為 < 和 > 。這樣可防止攻擊者通過在表單中注入 HTML 或 JavaScript 代碼(跨站點(diǎn)腳本攻擊)對(duì)代碼進(jìn)行利用">
通過使用 htmlspecialchars() 函數(shù)能夠避免 $_SERVER[“PHP_SELF”] 被利用。
表單代碼是這樣的:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() 函數(shù)把特殊字符轉(zhuǎn)換為 HTML 實(shí)體?,F(xiàn)在,如果用戶試圖利用 PHP_SELF 變量,會(huì)導(dǎo)致如下輸出:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
無法利用,沒有危害!
通過 PHP 驗(yàn)證表單數(shù)據(jù)
我們要做的第一件事是通過 PHP 的 htmlspecialchars() 函數(shù)傳遞所有變量。
在我們使用 htmlspecialchars() 函數(shù)后,如果用戶試圖在文本字段中提交以下內(nèi)容:
<script>location.href('http://www.hacked.com')</script>
– 代碼不會(huì)執(zhí)行,因?yàn)闀?huì)被保存為轉(zhuǎn)義代碼,就像這樣:
現(xiàn)在這條代碼顯示在頁面上或 e-mail 中是安全的。
在用戶提交該表單時(shí),我們還要做兩件事:
接下來我們創(chuàng)建一個(gè)檢查函數(shù)(相比一遍遍地寫代碼,這樣效率更好)。
我們把函數(shù)命名為 test_input()。
現(xiàn)在,我們能夠通過 test_input() 函數(shù)檢查每個(gè) $_POST 變量,腳本是這樣的:
實(shí)例
<?php // 定義變量并設(shè)置為空值 $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = test_input($_POST["name"]); $email = test_input($_POST["email"]); $website = test_input($_POST["website"]); $comment = test_input($_POST["comment"]); $gender = test_input($_POST["gender"]); } function test_input($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } ?>
請(qǐng)注意在腳本開頭,我們檢查表單是否使用 $_SERVER[“REQUEST_METHOD”] 進(jìn)行提交。如果 REQUEST_METHOD 是 POST,那么表單已被提交 – 并且應(yīng)該對(duì)其進(jìn)行驗(yàn)證。如果未提交,則跳過驗(yàn)證并顯示一個(gè)空白表單。
不過,在上面的例子中,所有輸入字段都是可選的。即使用戶未輸入任何數(shù)據(jù),腳本也能正常工作。
下一步是制作必填輸入字段,并創(chuàng)建需要時(shí)使用的錯(cuò)誤消息。