如果我不小心加倍逃離一個字符串,數據庫會受到傷害嗎?雙重逃逸是否可能對DB造成傷害?
對於這個問題的目的,讓我沒有使用存儲過程或參數化查詢
例如說,假設我得到以下輸入:
bob's bike
我逃脫即:
bob\'s bike
但我的代碼是可怕的,並再次逃脫它:
現在bob\\\'s bike
,如果我插入到數據庫中,在DB的值將是
bob\'s bike
這雖然不是我想要的東西,不會傷害DB。假設我採取了所有其他必要的安全預防措施,是否有可能雙重逃脫對數據庫執行某種惡意操作?
如果我不小心加倍逃離一個字符串,數據庫會受到傷害嗎?雙重逃逸是否可能對DB造成傷害?
對於這個問題的目的,讓我沒有使用存儲過程或參數化查詢
例如說,假設我得到以下輸入:
bob's bike
我逃脫即:
bob\'s bike
但我的代碼是可怕的,並再次逃脫它:
現在bob\\\'s bike
,如果我插入到數據庫中,在DB的值將是
bob\'s bike
這雖然不是我想要的東西,不會傷害DB。假設我採取了所有其他必要的安全預防措施,是否有可能雙重逃脫對數據庫執行某種惡意操作?
在安全性方面,單次逃脫同樣有害/無害,因爲雙重逃逸。
最大的問題是,你需要雙unescape。否則,如果你只有single-unescape,你最終會在數據庫輸出中出現反斜槓。
例如,如果通過unescape()函數運行bob\\\'s bike
,它將輸出bob\'s bike
,然後將打印到頁面,除非您再次忽略它。但是不要多次嘲笑,因爲這可以消除有意的反斜槓(並且可能造成更多傷害)。
這個問題與PHP的魔術引號功能有什麼關係嗎?只是好奇...
假設我採取其他一切 必要的安全防範措施
硬編碼SQL和/或參數值到應用程序不應該被認爲是「採取必要的安全防範措施」,因爲你永遠是主題到SQL注入攻擊(在Web應用程序的情況下)。
如果可以,最好使用存儲過程,如果這不是一個選項,至少應該使用參數化查詢(綁定變量是另一個術語)。
但是要回答你的問題,在數據庫中存儲bob\'s bike
本身並不會造成任何傷害,但要小心考慮上面提到的其他問題,從安全角度來看,它們非常重要。