2011-11-14 80 views
3

我有一個SQL查詢是這樣的:我需要轉義子查詢嗎?

UPDATE User SET flag='Y' WHERE email=(SELECT email FROM Forum WHERE id='$id'); 

因爲電子郵件地址可以由單引號和一些特殊字符(S *一個「{F`%$的= * +〜&。 ^#| g!/ hd @ [66.112.45.34] and vy。「(),:;; <> []」.VY。「vy \\ \ @ \」vy「.unal @ str.exe.com are both有效的電子郵件地址),我不知道是否有必要單獨做的子查詢,躲避輸出,然後在主查詢中使用它。

,你有何建議?

ADD NOTE:$id是一個安全的數字。

+0

如果有疑問,逃避它有什麼可失去的 – Maxpm

+0

查詢是否需要有escpe什麼 – Randy

+0

@蘭迪,你能。解釋爲什麼 –

回答

1

你不需要因爲有一個子查詢逃避什麼,當然你需要躲避id值把它的字符串中。

如果可能的話,你應該使用參數化查詢,而不是串聯的值轉換成字符串。那麼你不必逃避任何事情。

+0

你沒有寫出原因,symcbean寫下了原因。他是對的嗎? –

+0

@ BenHuh:他的解釋涵蓋了最常見的情況,但它不正確。僅僅因爲數據不會離開數據庫並不意味着它不需要轉義。如果您在數據庫中動態創建查詢,則您在查詢中放入的任何值仍需要轉義。 – Guffa

+0

那麼你是什麼意思「你不需要逃避任何事情,因爲有一個子查詢」?對不起,我不太明白。 –

1

你不應該需要在子查詢中轉義任何東西。但是,無論查詢將電子郵件最初插入到數據庫中,都需要轉義該字段。當您添加或修改email字段時,請務必轉義。

+0

您不會轉義值,因爲它將存儲在該字段中,您將該值轉義爲在查詢中使用它。如何在查詢中使用該值無關緊要。 – Guffa

+0

@Guffa我更明確指出,在子查詢中使用它時,電子郵件字段的值應該已經是乾淨的,並且查詢是沒有任何用戶生成的數據直接被注入的問題進去。 – danielrsmith

+0

@ danielrsmith,我認爲有一個誤解,數據是乾淨的。轉義是針對查詢本身,而不是數據。 –

1

回答所需的信息是:「哪裏的$ id來自」

如果可以在外部修改它需要被引用。如果它例如作爲GET參數http://www.foo.com/foo.php?id=222傳遞,則需要引用它(對POST同樣)。

隨着行情的一點點的參數可以關閉子查詢,並可以執行的每個查詢,E。 。克,通過提供"'); DELETE * FROM User; --「作爲$id值:

UPDATE User SET flag='Y' WHERE email=(SELECT email FROM Forum WHERE id=''); 
DELETE * FROM User; --'); 
+0

我的問題與'$ id'無關,而是從表'Forum'查詢的'email',然後在主查詢中再次應用。你可以假設'$ id'是一個安全的數字。 –

+0

那麼,你不必。用上面問題中的「查詢條件」替換$ ID。如果它是純粹的內部數據,那麼你不需要。或者你會在選擇子句中對字符串進行協商時轉義? –