2014-03-30 20 views
0

我試圖確保我能夠正確防範SQL注入。是否有可能執行SQL注入攻擊,其中惡意SQL存儲在數據庫表中?

如果我有一個包含列C1的MySQL表T1,並且存儲在行C1中的值是某個SQL,那麼是否存在任何可以在選擇時執行的SQL存儲?

如果它包含「SELECT * FROM T2」,那麼選擇C1只會返回該SQL字符串,但我只是想知道是否有任何可以執行SQL存儲的方式?

我不想在數據庫表中存儲來自用戶的未驗證數據,這樣當我選擇它時,期望它成爲名字或類似的東西,它會執行一些惡意SQL。被選中時,它

感謝,

保羅

回答

1

會被處決?

被選擇時,它

1

將執行號?

不,如果您只是選擇內容,則不行。

只有當您以不安全的方式將其複製到另一個字符串中並將該字符串作爲查詢執行時,纔可以執行SQL。

例如:

$sql1 = "SELECT name FROM users"; 
$name = $pdo->query($sql1)->fetchColumn(); 

// the following is unsafe: 
$sql2 = "SELECT * FROM user_activity WHERE user_name = '$name'"; 
$stmt = $pdo->query($sql2); 

這被稱爲 「二階SQL注入」,但它並不少見。該修復與SQL查詢中的任何其他動態值相同:使用查詢參數。

$sql2 = "SELECT * FROM user_activity WHERE user_name = ?"; 
$stmt = $pdo->prepare($sql2); 
$stmt->execute(array($name));