[英]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;”進行攻擊。 或者這樣的。
當您將數據插入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
,因為:
關於顯示HTML,還有htmlstriptags
可以剝離試圖用標簽等可愛的人。
我建議你使用php 5.2中介紹的過濾器它們很棒,並為你節省了大量的數據驗證和保護。 檢查一下
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.