2011-12-05 21 views
6

là an toàn để sử dụng cast (int) thay vì thoát?

class opinion 
{ 
    function loadbyopinionid($opinionid){ 
     $opinionid=(int)$opinionid; 
     mysql_query("select * from fe_opinion where opinionid=$opinionid"); 
     //more code 
    } 
} 
+3

bạn nên sử dụng các thông số. – SLaks

+0

vì bạn đang dường như không sử dụng nó như là chuỗi trong bối cảnh SQL, thoát nó với '_escape_string 'sẽ không hữu ích. – mario

Trả lời

13

mysql_real_scape_string là dành cho các chuỗi. nó sẽ không làm cho một số nguyên 'an toàn' để sử dụng. ví dụ.

$safe = mysql_real_escape_string($_GET['page']); 

sẽ làm NOTHING nơi

$_GET['page'] = "0 = 0"; 

vì không có metacharacters SQL trong đó. truy vấn của bạn sẽ kết thúc một cái gì đó giống như

SELECT ... WHERE somefield = 0 = 0 

Tuy nhiên, làm intval() sẽ chuyển đổi mà 0=0 thành một đồng bằng 0.

+2

Chính xác.' (int) $ value' là an toàn, nhưng người ta phải ghi nhớ, rằng có những tác dụng phụ như '(int) '5abc' === 5'. Vì vậy, một trong những nên xác nhận, rằng chuỗi nhất định là * chỉ * một số, ví dụ bằng cách sử dụng 'ctype_digit()'. – apfelbox

+0

Sẽ không đồng ý ... bởi vì ai đó có thể vượt qua chuỗi nơi số nguyên được mong đợi ... nó an toàn hơn nhiều để sử dụng nó với tất cả các thông số. –

-3

Có nó là an toàn, nhưng bạn nên thoát khỏi giá trị trong truy vấn ..where opinionid = '$ opinionid"

BTW (1) Không bao giờ sử dụng Select * Solution Chọn Field, Field2 .. ..

(2) (int) $ foo là ít perfomanter sau đó intval ($ foo)

+0

Như tôi nhớ, intval() là chậm hơn (int) (vi cải tiến mà thường không có giá trị nỗ lực, vì nó là sự khác biệt là vô hình cho mắt). –

Các vấn đề liên quan