2012-08-08 106 views
0

例子:動態選擇值

$user_input = $_POST['input']; 
'SELECT '.$user_input.' FROM table_name' 

因此它選擇基於安全數據庫中的一列(本例中沒有明顯的安全)值。這是實用的/允許的代碼?

+0

什麼是'$ var'? – nkr 2012-08-08 21:40:51

+0

對不起,它應該是$ user_input – 2012-08-08 21:42:49

+1

這是非常不安全的代碼。例如$ user_input =';從table_name中刪除; #'; – 2012-08-08 21:49:56

回答

1

在SQL中,您只需發送一個string到DBMS(如MySQL)。正因爲如此,您可以構建任何您想要的string並將其提交給DBMS。

您只需確保生成的SQL查詢有效。這意味着例如列存在,並且沒有無效符號出現。

+0

對,我有一個很大的if語句來確保該值是有效的,如果爲true,則發送查詢。謝謝! – 2012-08-08 21:46:51

1

就此而言,假設$user_input必須是有效的列名,這意味着它必須存在並且不得包含任何特殊字符,保留字等(除非它們已被轉義),否則此代碼有效。如你所說,然而,這段代碼並不安全,但只要你打算安全地建立查詢並使用PDO或MySQLi(不推薦使用mysql_*函數...),你應該沒問題。如果您需要一個不使用棄用函數的示例(包括mysql_real_escape_string,這也被棄用),我會提供一個。

我知道你說過,你知道這段代碼不安全,但如果你好奇,這裏有另一個例子。正如評價和this question討論,該輸入:

$user_input = '; DELETE FROM table_name ; *'; 
'SELECT '.$user_input.' FROM table_name' 

將刪除該表table_name的全部內容。儘管這段代碼引發了一個語法錯誤,MySQL仍將繼續執行它,從而有效截斷table_name