例子:動態選擇值
$user_input = $_POST['input'];
'SELECT '.$user_input.' FROM table_name'
因此它選擇基於安全數據庫中的一列(本例中沒有明顯的安全)值。這是實用的/允許的代碼?
例子:動態選擇值
$user_input = $_POST['input'];
'SELECT '.$user_input.' FROM table_name'
因此它選擇基於安全數據庫中的一列(本例中沒有明顯的安全)值。這是實用的/允許的代碼?
在SQL中,您只需發送一個string
到DBMS(如MySQL)。正因爲如此,您可以構建任何您想要的string
並將其提交給DBMS。
您只需確保生成的SQL查詢有效。這意味着例如列存在,並且沒有無效符號出現。
對,我有一個很大的if語句來確保該值是有效的,如果爲true,則發送查詢。謝謝! – 2012-08-08 21:46:51
就此而言,假設$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
。
什麼是'$ var'? – nkr 2012-08-08 21:40:51
對不起,它應該是$ user_input – 2012-08-08 21:42:49
這是非常不安全的代碼。例如$ user_input =';從table_name中刪除; #'; – 2012-08-08 21:49:56