攻擊者可將單引號分散在已知惡意字串中(如 uni'on sel'ect @@version-'-)繞過簡單過濾器。防禦端常見三種驗證策略:
function escape(input) {
input = replace(input, "'", "''");
return input;
}
問題:改變資料長度,可能導致截斷繞過;無法防禦數值型注入。
function validate_string(input) {
var known_bad = ["select","insert","update","delete","drop","--","'"];
for (var i=0; i= 0) return false;
return true;
}
問題:新攻擊手法層出不窮,黑名單永遠滯後;大小寫、編碼、註解均可繞過。
function validatePassword(input) {
var good_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for (var i=0; i
最安全但實施難度高(如人名含連字號、撇號)。
';SHUTDOWN-- 僅 12 字元即關閉 SQL Server。aaaaaaaaaaaaaaa' 經過濾變 aaaaaaaaaaaaaa'' 再截斷為 aaaaaaaaaaaaaa',密碼欄位以單引號開頭即可注入 '; SHUTDOWN--。在註解後附加 sp_password(--sp_password),SQL Server 追蹤會隱藏該批次完整文本,僅記錄 -- 'sp_password' was found...,干擾事後鑑識。
建議: 結合白名單與黑名單(先白名單再檢測已知危險模式),所有輸入(含資料庫回讀資料)統一驗證,防範二次注入。