2011-08-18 65 views
2

爲什麼我在URL末尾添加'時出現錯誤?例如:http://mywebsite.com/singel?id=24'爲什麼我的URL末尾有一個撇號時會出現SQL錯誤?

我得到以下錯誤:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\' LIMIT 1' at line 1

這是無處不顯示,如果我在查詢字符串中的任何標識之後,把'

什麼是錯的,以及如何修復它? 謝謝。

+0

爲什麼要添加撇號在那裏? –

+0

cus我已經在網上閱讀過,如果你得到一個錯誤,這意味着你很容易slq注射。 – Meo

回答

7

您正在SQL查詢中插入一個非轉義變量。如果此變量恰好包含SQL特殊字符,則可能導致SQL語法錯誤或更糟。

您需要在將變量插入到SQL查詢中之前將其轉義。

實施例:

$query = "SELECT * FROM users WHERE id = " . mysql_real_escape_string($id); 

代替(這是錯誤的,不這樣做):

$query = "SELECT * FROM users WHERE id = $id LIMIT 1"; 

如果$id24',查詢變爲:

$query = "SELECT * FROM users WHERE id = 24' LIMIT 1"; 

正如你所看到的,有一個在24之後的,這是一個語法錯誤。

+0

你好,謝謝你的出色答案,這是我的代碼 $ id = mysql_real_escape_string($ id); $ sql ='SELECT id,post_title,post_date,post_content FROM wp_posts WHERE id = 62 ORDER BY post_date LIMIT 1'; $ res = mysql_query($ sql)或die(mysql_error()); – Meo

0

看看你應該學習一些關於SQL注入。你的腳本現在可注射

-1

這個錯誤通常意味着你打開sql注入。這個函數比mysql_real_escape_string()稍微複雜一些,因爲它也會執行一個PHP配置測試,以確保您不會兩次轉義數據並添加各種PHP版本支持! (按照PHP手冊1) 就在每個提交的項目運行這個小漂亮的功能,插入,更新或者聲明:

function sql_injection($value){ 
    $value = trim($value); 
    if(get_magic_quotes_gpc()) 
     $value = stripslashes($value); 
    if(function_exists("mysql_real_escape_string")){ 
     $value = mysql_real_escape_string($value); 
    }else 
     $value = addslashes($value); 
    return $value; 
} 

例:

$q = 'SELECT `blah` FROM `users` WHERE `id`='.sql_injection($_POST['id']); 
  • 這個函數不要替換服務器端驗證,並且在使用之前應驗證所有內容,始終假設最差:)
+0

所以如果我將添加'blah' slasesh它不會告訴我這個錯誤? – Meo

+0

在上面的例子中blah表示一個數據庫字段,該示例集中在sql_injection函數上,如果您在提交給數據庫的項目(變量)上使用它,則不應該看到此錯誤。 – Vlad

+0

也是這個函數或者簡單的mysql_real_escape_string(),只保護注入,並不意味着你的查詢不會中斷。例如對於數字字符,對於24或24(mysql_real_escape_string()的輸出),您將得到類似的錯誤,這是服務器驗證到位的地方!希望這可以幫助 – Vlad

相關問題