2015-07-03 111 views
1

如果我有一個會話變量$_SESSION['username'],並且用戶名只能包含字母,數字,下劃線和連字符,並且我將其直接放入SQL,那麼這對注入來說是否容易受到攻擊?

$sessionUsername = $_SESSION['username']; 
SELECT x FROM y WHERE z='$sessionUsername' 
+0

只需使用佔位符,我們就可以停止擔心這些愚蠢的問題:它並不重要。現在,也許真正的問題是:「可以*請求*修改$ _SESSION直接嗎?」當使用基於cookie的會話時,它是「否」。然而,會話的* store *可能會被泄露(但你可能已經被破壞了),或者其他一些代碼可能不希望會話值直接在SQL中使用(這更可能並且可能被利用)。但是沒有必要讓它成爲一個問題。因爲它不是佔位符。 – user2864740

+0

取決於。會話變量由腳本控制,但是它們是如何設置的?他們是否依賴於任何類型的用戶輸入? – jonbaldie

+0

如果你使用準備好的語句,那麼你應該沒問題,因爲他們阻止SQL注入 – George

回答

0

會話變量可以從外部改變,所以是的,這是一個風險。有幾種方法可以克服這種風險,關鍵是您可以使用準備好的語句which is recommended。或者您可以使用filter_var來排列潛在的線程,但建議使用絕對準備好的語句。

準備報表的示例。未經測試,但應該沒問題。

<?php 
$dataFromDb = array(); 

$conn = new mysqli('HOST', 'USER', 'PASS', 'DATABASE'); 
$query = "SELECT x FROM y WHERE z = ?"; 
if ($stmt = $conn->prepare($query)) { 
    $stmt->bind_param('s', $_SESSION['username']); 
    $stmt->execute(); 
    $result = $stmt->get_result(); 
    while ($results = $result->fetch_array(MYSQLI_ASSOC)) { 
     $dataFromDb[] = $results; 
    } 
} 
+0

「會話變量可以從外部改變」在哪裏? – 2015-07-03 21:42:07

+2

@Dagon以外的PHP :) – user2864740

+3

只有當你有權訪問服務器,在這種情況下,它的遊戲無論如何 – 2015-07-03 21:42:49

相關問題