2012-09-05 55 views
0

我想讓用戶在表單中輸入兩個變量Name和Password。我想在輸入值中禁用任何XSS或腳本插入。我在形式方法如下代碼:在執行php之前在服務器上執行輸入消毒

<form name="form1" method="post" action="checkpw.php"> 
Your Name: 
<table> 
    <tr><td><input class="text" name="name" onBlur="capitalize(this);" maxlength=12 type="text" /></td></tr> 
</table> 
Password: 
<table> 
    <tr><td><input class="text" name="passwd" maxlength=8 type="password" /></td></tr> 
    <tr><td align="center"><br/> 
    <input class="text" type="submit" name="submitbt" value="Login" /> 
    </td></tr> 
</table> 

及以下checkpw.php:

<?php 

// Clean up the input values 
$post = filter_input_array(INPUT_POST, array(
    'name' => FILTER_SANITIZE_STRING, 
    'pw' => FILTER_SANITIZE_STRING, 
)); 

if (is_null($post) || in_array(null, $post)) { 
    header("location:login.php"); 
    return; // missing fields (or failed filter) 
} 

// pw is the password sent from the form 
$pw=$_POST['passwd']; 
$name=$_POST['name']; 

if($pw == 'testpass'){ 
    header("location:index.php"); 
} else { 
    header("location:wrong.php"); 
} 
?> 

這是一種安全的方式,以保證的形式發送到服務器,只有在輸入值已被消毒後才執行?

另外,我想把它傳遞給index.php文件的$ name值。我在index.php中插入一個代碼如下:

<?php echo $name ?> 

但是它是空的。任何想法如何解決它?

+2

你從用戶得到了你既不輸出值,不把它們存儲到數據庫中。這段代碼似乎對用戶輸入做的唯一有意義的事情是比較'$ _POST ['passwd']'和'test123'字符串;緊隨其後,用戶將被重定向到'index.php'或'wrong.php'。所以,問題是:爲什麼你需要清理一些即將被扔掉的東西? – raina77ow

+1

作爲一個旁註,[session_register()](http://php.net/manual/en/function.session-register.php)'自PHP 5.3.0開始已經被拒絕,從PHP 5.4.0開始已被刪除。 。換句話說,它的用法不被推薦。 – raina77ow

+0

一個網站感染了代碼插入,所以我很安全,然後後悔。它是否在做消毒工作? – Interfaith

回答

1

現在大多數服務器上應該禁用magic_quotes_gpc;但是,請閱讀this article以查看禁用它們的其他方法。

此外,還可以使用filter_input_array()(PHP> = 5.2)用於此目的:

$post = filter_input_array(INPUT_POST, array(
    'name' => FILTER_SANITIZE_STRING, 
    'pw' => FILTER_SANITIZE_STRING, 
)); 

if (is_null($post) || in_array(null, $post)) { 
    return; // missing fields (or failed filter) 
} 

// you can safely use $post['name'] and $post['pw'] here 
+0

因此,您的代碼將清理任何xss攻擊或任何腳本插入的輸入值?我更新了我的問題中的代碼,請讓我知道它是否好。謝謝 – Interfaith

+0

@Interfaith對,雖然你錯過了你以前的'session_register()'。 –

+0

raina77ow說session_register()被新版本的PHP刪除,所以我刪除它。 – Interfaith

2

您正在發出一個header(..),這意味着您正在重定向到另一個頁面並全面開始。

你有3種選擇:

  • 在會議上把你的名字$。
  • 在標題函數中傳遞$ name,如header("location: index.php?name=$name");
  • 不要重定向,但包含php文件。在這種情況下,你根本不需要會話。也會更快,因爲你不需要往返瀏覽器。

至於消毒,首先它會做。它依賴於你以後會對數據做什麼。我會建議,如果把數據放在數據庫中以更詳細地查看要做什麼。

+0

我如何在標題函數中添加$ name以傳遞給index.php? – Interfaith

+0

用第3個選項編輯我的帖子。我會去不重定向。 – JvdBerg

+0

一個網站被感染了代碼插入,所以我很安全,那麼以後再抱歉。我只是比較密碼並根據用戶輸入重定向到另一個頁面。它是否在做消毒工作? – Interfaith