簡體   English   中英

PHP表單輸入過濾

[英]PHP Form Input Filtering

我是PHP新手,正在研究基本的表單驗證腳本。 我知道,出於安全考慮,輸入過濾和輸出轉義都至關重要。 我的問題是我下面編寫的代碼是否足夠安全? 首先要澄清一些注意事項。

  1. 我了解消毒與驗證之間是有區別的。 在下面的示例字段中,該字段為純文本,因此我需要做的是清理它。
  2. $ clean ['myfield']是我要發送到MySQL數據庫的值。 我正在使用准備好的語句進行數據庫交互。
  3. $ html ['myfield']是我發送回客戶端的值,以便當他/她提交包含無效/不完整數據的表單時,將重新填充其中包含數據的已清理字段,因此他們不必從頭開始輸入所有內容。

這是(稍作清理)的代碼:

$clean = array();
$html = array();
$_POST['fname'] = filter_var($_POST['fname'], FILTER_SANITIZE_STRING);
$clean['fname'] = $_POST['fname'];
$html['fname'] = htmlentities($clean['fname'], ENT_QUOTES, 'UTF-8');
if ($_POST['fname'] == "") {
    $formerrors .= 'Please enter a valid first name.<br/><br/>';
}
else {
    $formerrors .= 'Name is valid!<br/><br/>';
}

謝謝你的幫助!

〜賈里德

我知道,出於安全考慮,輸入過濾和輸出轉義都至關重要。

我要說的是,出於安全性和正確性的原因,輸出轉義至關重要,而輸入過濾對於深度防御和實施特定的應用程序規則可能是有用的措施。

輸入過濾步驟和輸出轉義步驟必定是單獨的關注點,不能合並為一個步驟,不僅因為存在許多不同類型的輸出轉義,而且必須為每個輸出上下文選擇正確的轉義(例如HTML-在頁面中轉義,在URL中轉義以創建鏈接,在SQL中轉義等)。

不幸的是,PHP通常在這些問題上都很模糊,因此提供了很多混合消息功能,這些功能可能會誤導您。

在下面的示例字段中,該字段為純文本,因此我需要做的是清理它。

是。 las, FILTER_SANITIZE_STRING絕對不是理智的解決方案。 它完全刪除了某些內容( strip_tags ,這本身是非常不明智的),而HTML則轉義了其他內容。 例如,引號變成&#34; 這是胡說八道。

相反,要進行輸入衛生檢查,請查看:

  • 檢查它是您正在使用的編碼的有效字符串(希望是UTF-8;有關此信息 ,請參見此正則表達式 );

  • 刪除控制字符U + 0000–U + 001F和U + 007F–U + 009F。 只允許在故意的多行文本字段中使用換行符;

  • 刪除不適合在標記中使用的字符;

  • 對於內容模型比任意文本字符串更具體的數據,驗證輸入符合每個字段的應用程序要求。 盡管轉義應正確處理<字符,但在沒有意義的領域中盡早刪除它可能是一個好主意。

對於輸出轉義步驟,我通常更喜歡htmlspecialchars()而不是htmlentities() ,盡管您正確使用UTF-8參數可以阻止后者以通常的方式破壞。

根據您要保護的內容,您調用的過濾器可能會處於活動狀態 (請參閱注釋)。 注射方式,您應該很安全,因為您正在使用預處理語句(請參閱此答案

在設計說明上,您可能要先過濾,然后檢查空值。 這樣做可以縮短代碼;)

我了解輸入過濾...出於安全原因至關重要。

這是錯誤的陳述。
盡管在某些情況下可能是正確的,但以這種概括的形式,它只能帶來良好的安全感,而不會帶來錯誤的安全感。

我需要做的就是消毒它。

沒有像“ 一般消毒 ”這樣的東西。 您必須了解每個特定案例及其局限性。 例如,對於數據庫,您需要使用幾種不同的清理技術,而不是一種。 雖然文件名將完全不同。

我正在使用准備好的語句進行數據庫交互。

因此,您根本不應觸摸數據。 保持原樣。

這是(稍作清理)的代碼:

看來您的代碼有些過高。
您將清理兩次HTML數據,而有可能根本不需要它。 由於某種原因,您在成功時提出了錯誤。

我寧願這樣

$formerrors = '';
if ($_POST['fname'] == "") {
    $formerrors .= 'Please enter a valid first name.<br/><br/>';
}

if (!$formerrors) {
  $html = array();
  foreach ($_POST as $key => $val) {
    $html[$key] = htmlspecialchars($val,ENT_QUOTES);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM