2010-05-04 173 views
3

我想保護我的網站,所以我不容易sql注入或xss。這些安全功能是否足夠?

這裏是我的代碼:

//here's the form (abbreviated) 
<form> 
<label for="first_name" class="styled">First Name:</label> 
<input type="text" id="first_name" name="first_name" value="<?php if (!empty($first_name)) echo $first_name; ?>" /><br /> 

//submit button etc 
</form> 


if (isset($_POST['submit'])) { 

//gets rid of extra whitesapce and escapes 
$first_name = mysqli_real_escape_string($dbc, trim($_POST['first_name'])); 

//check if $first_name is a string 
if(!is_string($first_name) 
{ 
echo "not string"; 
} 

//then insert into the database. 
....... 

}

mysqli_real_escape_string:我知道這個功能逃逸若干字母像\ n \ r,因此當數據被輸入到DBC,那就「 \'旁邊的所有逃脫的信件?

  • 此腳本是否足以防止大多數SQL注入?只是轉義並檢查數據是否是字符串。對於整數值(比如用戶輸入價格),我只是:is_numeric()

  • 我該如何使用htmlspecialchars?我是否應該僅在回顯和顯示用戶數據時使用它?或者我應該在將數據插入數據庫時​​使用它?

  • 什麼時候應該使用strip_tagshtmlspecialchars

因此,所有這些功能:

if (isset($_POST['submit'])) { 

//gets rid of extra whitesapce and escapes 
$first_name = mysqli_real_escape_string($dbc, trim($_POST['first_name'])); 

//check if $first_name is a string 
if(!is_string($first_name) 
{ 
echo "not string"; 
} 

//gets rid of any <,>,& 
htmlspecialchars($first_name); 

//strips any tags with the first name 
strip_tags($first_name) 

//then insert into the database. 
....... 

}

我應該使用哪種功能SQL注入和我應該使用哪些對XSS?

什麼時候用戶可以插入xss腳本對我?何時有表格?

+0

我會建議適當的表單驗證,而不是僅僅用戶提供的數據。 – 2010-05-04 21:43:21

+0

適當的表單驗證是什麼意思? – ggfan 2010-05-05 02:08:41

+0

當我說適當的表單驗證時,我主要想到了一些使用編程語言中構建的html表單抽象的web框架中的例子,那就是創建一個類來表示一個表單,它將知道它具有哪些字段以及如何驗證它們,返回清理數據,打印出html等。在你的例子中,你可以使用正則表達式('\ w +')驗證你的$ first_name,如果驗證通過,你很確定你沒有任何不安全的字符反斜槓等,否則你提出一個錯誤。 – 2010-05-05 13:18:25

回答

1

對於SQL注入,mysql_real_escape_string應該工作。 (要完全確定,你可以使用準備好的語句)

對於XSS,htmlspecialchars應該可以工作。 strip_tags可能不是那麼安全,因爲有人可以巧妙地排除他們的javascript。

+0

因此,任何用戶可以輸入數據的地方,我應該使用htmlspecialchars,如果我將數據插入dbc,我應該使用mysql_real_espace_string並準備語句? – ggfan 2010-05-04 20:28:55

+1

是的。 (real_escape_string或準備好的語句)你不(同時可能不應該)一次使用兩者。 – 2010-05-04 20:29:50

+0

好的,謝謝!我看看準備好的陳述 – ggfan 2010-05-04 20:31:34

1

無論何時將用戶提供的信息嵌入到HTML中,都應該使用htmlspecialchars。無論何時您將用戶提供的信息嵌入到SQL中,都應該使用mysql_real_escape_string。遵守這些規則,你應該沒問題。

但是,請注意,更好的數據庫安全解決方案是使用準備/參數化查詢(請參閱herehere),因爲這些將處理您的轉義,從而消除遺忘的可能性。

此外,不要忘記檢查magic quotes

2

檢查數據是否爲字符串是無用的:字符串正是您用於注入的內容。

real_escape_string是避免SQL注入的一種合理但不能保證的方式,因爲轉義例程有錯誤風險並且不能正確轉義事件(事實上,以前存在錯誤)。正確的做法是使用parameterized queries - 這將數據從查詢結構中分離出來,使注射成爲不可能。但是,如果絕對不能使用參數化查詢,則real_escape_string(打開連接時使用set_charset)是最好的選擇。

您會希望在用戶可以觸摸的任何內容上使用htmlspecialchars,並且您希望在頁面上顯示時使用它。如果你想讓用戶格式化帖子或其他東西,那麼你應該爲他們提供一種格式化語言(BBCode)(並在之後轉換BBCode 運行htmlspecialchars)。如果你需要存儲純HTML,你不想使用htmlspecialchars,但你想確保只有信任的人可以在那裏寫。例如,如果您正在編寫博客,則可以在博客文章中允許使用純HTML,因爲只有博客編輯可以在其中編寫內容。然而,你不想在評論中允許它,因爲每個人都可以在那裏寫東西,這隻會讓它很容易做到像cross-site scripting這樣的東西。

1

如果您要打印HTML,請先用HTML Purifier清理它。把它看作是strip_tags()的高級(可定製)版本。

對於插入數據庫,我使用prepared statements。這是萬無一失的。