2017-09-01 78 views
2

我正在用小而簡單的數據庫創建一個php頁面。試圖瞭解我的頁面是否易受攻擊

當我在線訪問它並嘗試在URL中傳遞參數「length」時:index.php/?length=1它工作正常,並獲取數據。

如果我添加了單引號像index.php/?length=1'我在頁面上沒有SQL錯誤...

,但如果我用index.php/?length=-1我看到SQL錯誤在我的網頁。

這是否意味着我的頁面很脆弱?

如何進一步測試並解決問題?

編輯:添加的代碼

$length = $wpdb->get_results($wpdb->prepare("SELECT `title`, `website`, `material`, `color`, `width`, `height`, `group`, `category`, `numbers_positive`, `numbers_negative`, `custom` FROM {$wpdb->shirts} WHERE `id` = '%d' ORDER BY `rank` ASC, `id` ASC", intval($shirt_id))); 

if (!isset($shirt[0])) return false; 

$shirt= $shirt[0]; 
$shirt->title = htmlspecialchars(stripslashes($shirt->title), ENT_QUOTES); 
$shirt->custom = maybe_unserialize($shirt->custom); 
$shirt->color = maybe_unserialize($shirt->color); 
if ($this->hasBridge()) { 
    global $lmBridge; 
    $shirt->shirtColor = $lmBridge->getShirtColor($shirt->color); 
} 
$shirt = (object)array_merge((array)$shirt,(array)$shirt->custom); 
unset($shirt->custom); 

return $shirt; 

回答

1

是的,從你給的網址的例子,好像你把用戶輸入並直接將其插入到你的MySQL聲明。這是絕對最差的。您應該始終解析用戶輸入,因爲來自用戶的直接輸入可能會導致字符串被轉義,並且他們會刪除數據庫中的每個表。這是一個很好的例子:Bobby Tables

此外,這是一個偉大的討論話題。有一個很好的答案here

編輯*使用WordPress框架,看看你的代碼,它不像看起來那麼糟糕。

+0

謝謝你回到我身邊!請耐心等待,因爲我正在努力學習和理解。 這是代碼:https://pastebin.com/sXhtPG7r 這段代碼在哪裏可能出現問題? 如果真的有問題,基於這段代碼我該如何嘗試並注入url?因爲我所做的基本測試沒有任何問題。 再次感謝 – qefseri

+0

啊,你在WordPress中使用準備好的語句。這確實使它更安全,因爲框架爲您處理了很多安全檢查。您看到的SQL錯誤可能是因爲id -1(負1)不存在,並且'intval'仍然會返回負數。被添加的報價被'intval'刪除 – Ice76

0

接受,但在-1上產生一個錯誤並不意味着你對注入攻擊是可以接受的。只要你改變輸入是一個整數並且只使用整數組件,你就相當安全。

通過分離查詢中的數據,預先準備的語句使其更加安全。這樣做意味着有人可以永不'爆發'你應該工作。這絕對是使用SQL的正確方式。

我們甚至可以再向前走一步,通過限制帳戶的能力來執行其他運行存儲查詢的任何內容,並將查詢存儲在SQL服務器端,而不是在您的PHP中。此時,即使他們爆發(他們不能),他們也只能訪問那些已定義的查詢。