我被迫生成動態SQL。我意識到這樣做很複雜,下面的例子很愚蠢,顯然不需要動態SQL,只是用來說明這個問題。防止動態SQL中的SQL注入
轉義用戶提供的數據是不夠的,下面的腳本中的第三個查詢對SQL注入是可疑的。
我發現設計應用程序通常是最容易的,以便所有用戶輸入都是整數,並且只需使用(int)$_POST['user_input']
對輸入進行類型轉換。
我現在需要將user_input設置爲文本。我應該如何防止SQL注入?一個選項是PHP的ctype_alpha()
,但是,我不希望「用戶,輸入」結果爲FALSE,但應該保持原樣或轉換爲「userinput」(對於我來說scenerio是好的)。我正在考慮像$user_input= preg_replace('/[^a-z0-9,]/i', '', $_POST['user_input']);
。這將是100%安全嗎?
編輯
注意,我不執行下面的查詢,但它插入到數據庫中,因此,準備語句不appliable。您可能認爲不應該使用動態SQL生成,但告訴我使用預準備語句是不正確的。
<?php
$id=123;
$query='SELECT * FROM someTable WHERE someColumn="'.$_POST['user_input'].'"';
$sql='INSERT INTO meta_table (id,sql) VALUES (?,?)';
$stmt=db::db()->prepare($sql);
$stmt->execute(array($id,$query));
$sql='SELECT sql FROM meta_table WHERE id=123';
$stmt = db::db()->exec($sql);
$query=$stmt->fetchColumn();
$stmt = db::db()->exec($query); //Prone to SQL Injection
$rs=$stmt->fetchColumn();
?>
雖然對於*真*動態SQL這是一項相當複雜的任務,我在你的查詢中看不到任何動態的東西。 –
@YourCommonSense。是的,我知道這個例子是學術性的,只是作爲一個愚蠢的例子。 – user1032531
沒關係,你的學術答案也是 –