如果我有一個會話變量$_SESSION['username']
,並且用戶名只能包含字母,數字,下劃線和連字符,並且我將其直接放入SQL,那麼這對注入來說是否容易受到攻擊?
$sessionUsername = $_SESSION['username'];
SELECT x FROM y WHERE z='$sessionUsername'
如果我有一個會話變量$_SESSION['username']
,並且用戶名只能包含字母,數字,下劃線和連字符,並且我將其直接放入SQL,那麼這對注入來說是否容易受到攻擊?
$sessionUsername = $_SESSION['username'];
SELECT x FROM y WHERE z='$sessionUsername'
會話變量可以從外部改變,所以是的,這是一個風險。有幾種方法可以克服這種風險,關鍵是您可以使用準備好的語句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;
}
}
「會話變量可以從外部改變」在哪裏? – 2015-07-03 21:42:07
@Dagon以外的PHP :) – user2864740
只有當你有權訪問服務器,在這種情況下,它的遊戲無論如何 – 2015-07-03 21:42:49
只需使用佔位符,我們就可以停止擔心這些愚蠢的問題:它並不重要。現在,也許真正的問題是:「可以*請求*修改$ _SESSION直接嗎?」當使用基於cookie的會話時,它是「否」。然而,會話的* store *可能會被泄露(但你可能已經被破壞了),或者其他一些代碼可能不希望會話值直接在SQL中使用(這更可能並且可能被利用)。但是沒有必要讓它成爲一個問題。因爲它不是佔位符。 – user2864740
取決於。會話變量由腳本控制,但是它們是如何設置的?他們是否依賴於任何類型的用戶輸入? – jonbaldie
如果你使用準備好的語句,那麼你應該沒問題,因爲他們阻止SQL注入 – George