2011-02-28 78 views
2

我是新手,只是要清楚。我聽到很多關於逃避數據以防止XSS攻擊的信息。我該如何做到這一點?如何在PHP中跳出輸出

這是我在做什麼現在 -

$s = mysqli_real_escape_string($connect,$_POST['name'])); 

難道這還不夠?謝謝

+0

你需要告訴我們你在處理數據。你是否將其插入數據庫?或者在網站上輸出它?您對數據所做的每件事都需要不同形式的衛生設施。 – 2011-02-28 11:47:17

+0

@pekoe都....在一個文件中,我接受並插入...其他...我輸出。 – Chrism 2011-02-28 11:47:57

+0

現在考慮我要在數據庫中插入$ s。它足夠安全嗎? – Chrism 2011-02-28 11:49:55

回答

6

如果你將數據輸出到HTML中,應該使用用htmlspecialchars() 否則,如果你存儲在數據庫中的數據,你應該使用mysqli_real_escape_string()逃脫投下數(或使用預準備語句對於兩者) 並且通過基於白名單的過濾來保護標識符/操作符。

如果以正確的方式使用它們,這兩種方法都是您所需要的。

+0

編輯您的答案,使其有幫助 – 2011-02-28 11:56:46

0

如果您剛剛開始修復您的代碼以抵禦攻擊(意思是SQL注入攻擊),那麼您將更好地檢出參數化查詢。你基本上做的是將你的內容(輸入)與命令(sql)分開,所以你不能讓它們被一個可能的用戶輸入的信息(比如名字)混淆。

您可以嘗試開始使用PDO類: 你可以從這裏開始閱讀PDO手冊:http://php.net/manual/en/book.pdo.php而這個頁面有一個很好的例子:http://php.net/manual/en/pdo.prepared-statements.php

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 

不過,你不需要使用PDO,您可以使用mysqli也看到http://php.net/manual/en/mysqli.prepare.php

<?php 
/* Script A -- We are already connected to the database */ 

$stmt = mysqli_prepare($link, "INSERT INTO table VALUES (?, ?, 100)"); /* Query 1 */ 
mysqli_stmt_bind_param($stmt, "si", $string, $integer); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt); // CLOSE $stmt 
?> 

因爲名字是一個單獨的值,我t永遠不會是一個SQL命令,所以你會自動安全的。

+0

我該怎麼做?對不起,很愚蠢。 – Chrism 2011-02-28 11:47:02

+0

爲你增加了一個例子和一些鏈接:) – Nanne 2011-02-28 11:49:28

+0

這可以防止SQL注入攻擊,而不是XSS攻擊。 – geoffspear 2011-02-28 11:50:31

3

您應該使用htmlspecialchars的輸出,而不是mysqli_real_escape_string

+0

按輸出,你的意思是回聲? – Chrism 2011-02-28 11:48:49

+0

@Chrism通過輸出他的意思是**你要求的輸出**。檢查您的問題標題以提醒。 – 2011-02-28 11:54:44

+0

在這種情況下,輸出意味着「以HTML格式輸入到HTML文檔中的東西」(而不是JavaScript)。不管你使用echo,print,'<?='還是別的東西。 – Quentin 2011-02-28 11:55:00