2011-05-11 118 views
4

我已經閱讀了很多關於過濾用戶輸入的文章,但大多數時候答案是,這取決於你在做什麼。下面是我在做什麼:過濾用戶輸入

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

通過將顯示後面的HTML/PHP頁面或在表單提交的數據:

通過,將在MySQL查詢使用的形式提交的數據電子郵件:從數據庫

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

數據顯示:

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

這是足以讓我ñ電火工品?有什麼我不考慮?

謝謝!

+0

你問的應用程序的安全性,即SQL注入? – 2011-05-11 15:42:54

+0

@ robert-harvey SQL注入,並通過JS等將代碼添加到我的頁面 – NightHawk 2011-05-11 15:47:30

+1

'output_db'表明你做錯了。如果您正確地轉義了您的內容,並且沒有啓用superflous magic_quotes,那麼在數據庫查詢之後不需要stripslashes()。 http://php.net/manual/en/security.magicquotes.disabling.php – mario 2011-05-11 16:16:34

回答

5

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

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

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

如果這個數據來自用戶,那麼你應該做這些事情,因爲有可能用戶試圖做壞事。但除了安全性 - 如果你想插入一個合法的字符串到一個SQL查詢和字符串恰好有一個單引號字符呢?你仍然必須逃避它。

+0

這可能聽起來像一個愚蠢的問題,但只是爲了澄清,urlencode()是否適用於由表單自動生成的查詢字符串?值被硬編碼到表單中,所以我猜沒有什麼需要做,但我只是想澄清。謝謝

Sarah 2015-02-13 15:49:16

+0

@Sarah好問題。使用「

」提交的值自動由瀏覽器進行URL編碼。例如,在您的表單中,當用戶單擊提交按鈕時,瀏覽器的「search_content」文本的值將由瀏覽器進行URL編碼。 – Michael 2015-02-15 16:00:04

+0

這是偉大的..謝謝澄清:D – Sarah 2015-02-15 17:43:50

2

如果你剛開始,我會真正考慮使用類似PDO的東西。你最終會希望以這種方式遷移,那麼爲什麼不現在就開始。

PDO將自動清理您的輸入,這很好。它也會使用prepare()語句,這樣就保證了一個單一的查詢,從而防止有人用「DROP TABLE xxx」進行攻擊。或者這樣。

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

1

如果你有能力,我會建議使用,而不是MySQL的庫MySQLi,並利用準備好的語句:

<?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數據可以有斜線以他們爲你反正

  • 數據庫反轉義至於顯示HTML,還有htmlstriptags這可以去掉那些試圖用標籤和類似東西變得可愛的人。

  • 2

    將數據插入到SQL數據庫中時,需要將其轉義以防止SQL注入,並且mysql_real_escape_string()在mysql中適用。儘管如此,你必須記住把它用於所有事情,所以它很容易出錯。您應該使用類似PDO的東西,它會自動轉義每個傳入的值。

    從數據庫中獲取的數據通常不需要任何特殊處理(即避免失敗)。我不知道您在那裏用stripslashes()做什麼。如果是爲了移除PHP插入的魔術引號,你應該在那裏從GET/POST/etc中提取用戶提供的值。 (或者完全禁用魔術引號,如果可以的話,並且沒有任何其他依賴它的軟件)

    數據傳出到html需要被轉義以防止XSS。 htmlspecialchars()是正確的功能。再次,我不知道你想用什麼stripslashes()。再次,你需要記住逃避每個值,這是容易出錯的。您至少應該考慮使用模板引擎或其他能夠自動轉義所有html值的其他功能。

    +0

    嗨,感謝您的這些信息:)我只是想澄清,是htmlspecialchars()唯一的安全措施,我需要做的變量輸出到HTML?當你說錯誤傾向時,你的意思是它可能無法正常工作,因此不是100%安全的?你知道哪些模板引擎可用?謝謝,sarah – Sarah 2015-02-14 21:36:32

    +0

    @Sarah:這是你內部數據元素唯一需要的東西。 (當然,如果你把任意的用戶內容放在一個腳本元素中,你仍然被搞砸了)我的意思是容易出錯是因爲很容易忘記在任何地方使用它,如果你甚至在一個地方忘記它,你'被擰緊了。如果您需要將用戶定義的內容放在屬性中(例如.href),則需要做的不僅僅是這些,因爲惡意用戶可以輸入例如。 '的JavaScript:whatever'。例如。對於href,你可能只想列出一些允許的協議,因爲瀏覽器允許「javascript:」的各種變體工作。 – 2015-02-15 06:32:56

    +0

    謝謝你的解釋。我可以問你,在href屬性方面..是隻有在用戶定義的情況下?..在我的項目中,我從facebook檢索json數據並在php中使用該數據,將此數據插入到href屬性和其他元素。但在這種情況下,它全部來自Facebook,沒有任何來自用戶。我需要在將這些數據插入到我的html之前對這些數據執行安全措施還是安全?謝謝... – Sarah 2015-02-15 15:37:01

    0

    我會推薦你​​使用php 5.2中引入的過濾器,它們很棒,可以節省你大量的數據驗證和sanatization。這裏檢查

    filter_input