2011-10-24 8 views
15

Tôi đã thực hiện một số thử nghiệm và thật ngạc nhiên khi tôi đang truy vấn một bảng và truy vấn SELECT * FROM table WHERE email=0 trả về tất cả các hàng từ bảng.mySQL trả về tất cả các hàng khi trường = 0

Bảng này không có giá trị '0' và được điền bằng e-mail thông thường.

Tại sao điều này xảy ra? Điều này có thể dẫn đến các vấn đề bảo mật nghiêm trọng.

Có cách nào để tránh điều này mà không sửa đổi truy vấn không?

Tôi có thiếu gì đó ở đây không?

Cảm ơn.

Trả lời

21

Điều này là do nó đang chuyển đổi trường email (mà tôi giả định là trường varchar) thành số nguyên. Bất kỳ trường nào không có số nguyên hợp lệ sẽ bằng 0. Bạn nên đảm bảo rằng bạn chỉ so sánh các trường chuỗi với các giá trị chuỗi (tương tự với các ngày tháng, so với ngày tháng). Truy vấn phải như sau.

SELECT * FROM table WHERE email='0'; 
+3

Bạn nghĩ rằng mysql nên làm việc theo cách này? Tôi nghĩ đây là nơi dễ dàng giới thiệu lỗi. Tôi không hiểu tại sao nó cần phải làm như vậy không làm cho các chuyển đổi có ý nghĩa như chuyển đổi bất kỳ chuỗi thành 0. Tại sao không tốt hơn để chuyển đổi 0 đến '0' - nó sẽ làm cho ý nghĩa hơn nhiều –

6

cột email của bạn là một CHAR hoặc VARCHAR loại. Khi bạn sử dụng điều kiện email = 0, MySQL sẽ truyền nội dung của cột email đến một số nguyên để so sánh chúng với 0 mà bạn đã cung cấp. Nếu bạn đã bao quanh 0 trong dấu ngoặc kép, truy vấn sẽ hoạt động như mong đợi. (email = '0')

Chuyển đổi một chuỗi không phải số thành một số nguyên trong MySQL sẽ dẫn đến 0.

mysql> SELECT CAST('[email protected]' AS SIGNED); 
+-------------------------------------+ 
| CAST('[email protected]' AS SIGNED) | 
+-------------------------------------+ 
|         0 | 
+-------------------------------------+ 

Ngược lại, nếu bạn cố gắng điều tương tự với chuỗi số, họ có thể bỏ một cách chính xác:

mysql> SELECT CAST('12345' AS SIGNED); 
+-------------------------+ 
| CAST('12345' AS SIGNED) | 
+-------------------------+ 
|     12345 | 
+-------------------------+ 
-1

nếu bạn muốn để có được tất cả các kỷ lục, trong đó cột email không nên được để trống hoặc trống rỗng, sau đó bạn có thể sử dụng

SELECT * FROM table WHERE email IS NOT NULL; 
3

Trường email có thể là các ký tự và bạn đang khớp các giá trị số.

Hãy thử với,

SELECT * FROM table WHERE email='0';