簡體   English   中英

過濾用戶輸入

[英]Filtering User Input

我在這里閱讀了很多關於過濾用戶輸入的問答,但大多數時候答案是它取決於你在做什么。 這是我正在做的事情:

通過將在MySQL查詢中使用的表單提交的數據:

function clean($field, $link)
{
    return mysql_real_escape_string($field, $link);
}

通過表格提交的數據將顯示在HTML / PHP頁面或電子郵件中:

function output_html($value)
{
    return stripslashes(htmlspecialchars($value));
}

從數據庫顯示的數據:

function output_db($value)
{
    return stripslashes($value);
}

這是否足以滿足我的需求? 有什么我不考慮的嗎?

謝謝!

在將字符串插入SQL查詢時,無論輸入來自何處,都使用mysql_real_escape_string()

將字符串插入HTML代碼時,無論輸入來自何處,都使用htmlspecialchars()htmlentities()

將值插入URL的查詢字符串時,請使用urlencode() ,無論值來自何處。

如果這些數據來自用戶,那么你肯定應該做這些事情,因為用戶有可能嘗試做壞事。 但是除了安全性之外 - 如果你想將一個合法的字符串插入一個SQL查詢並且該字符串碰巧有一個單引號字符,該怎么辦? 你仍然必須逃脫它。

如果你剛開始的話我真的會考慮使用像PDO這樣的東西。 您最終希望以這種方式遷移,所以為什么不立即開始。

PDO會自動清理您的輸入,這很棒。 它還將使用prepare()語句,因此您可以保證單個查詢,從而防止某人使用“; DROP TABLE xxx;”進行攻擊。 或者這樣的。

http://php.net/manual/en/book.pdo.php

當您將數據插入SQL數據庫時,您需要轉義它以防止SQL注入,並且mysql_real_escape_string()是在mysql中使用它的正確方法。 但是,您必須記住將其用於所有內容,因此容易出錯。 您應該使用類似PDO的東西,它會自動轉義每個傳入的值。

來自數據庫的數據通常不需要任何特殊處理(即unescaping)。 我不知道你在嘗試用stripslashes()做什么。 如果它是為了刪除PHP插入的魔術引號,那么你應該這樣做,從GET / POST / etc中提取用戶提供的值。 (或者完全禁用魔術引號,如果可以,並且沒有任何其他依賴它的軟件)

需要轉發輸出到html的數據以防止XSS。 htmlspecialchars()是正確的功能。 再一次,我不知道你正在嘗試使用stripslashes() 而且,你需要記住要逃避每個值,這很容易出錯。 你至少應該考慮使用模板引擎或其他能自動逃避所有html值的東西的好處。

如果你有能力,我建議使用mysqli而不是mysql,並使用預備語句:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* create a prepared statement */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* close statement */
   $stmt->close();
}

/* close connection */
$mysqli->close();
?>

資料來源: http//php.net/manual/en/mysqli.prepare.php

這提供了基本的類型檢查,並為您逃脫。 我不建議在輸出db數據時使用stripslashes ,因為:

  1. DB數據可以包含斜杠
  2. 無論如何,數據庫對你來說都是無法解決的

關於顯示HTML,還有htmlstriptags可以剝離試圖用標簽等可愛的人。

我建議你使用php 5.2中介紹的過濾器它們很棒,並為你節省了大量的數據驗證和保護。 檢查一下

filter_input

暫無
暫無

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

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