2010-07-08 66 views
3

我正在使用php並在mysql服務器上運行sql查詢。 爲了防止sql注入,我正在使用mysql_real_escape_string。如何投射bigint,以防止在PHP中的SQL注入?

我也使用(INT),用於數字鑄造,以下列方式:

$desired_age = 12; 
$query = "select id from users where (age > ".(int)$desired_age.")"; 
$result = mysql_query($query); 

這項工作。

但是,當變量包含較大數字時,由於它們大於int,因此它們失敗。

$user_id = 5633847511239487; 
$query = "select age from users where (id = ".(int)$user_id.")"; 
$result = mysql_query($query); 
// this will not produce the desired result, 
// since the user_id is actually being cast to int 

有另一種方式投下大量(如BIGINT),除了使用mysql_real_escape_string的,當涉及到SQL注入預防?

+0

這裏也有一個問題$ user_id = 5633847511239487;將不會持有你的想法,並且沒有辦法讓這個數字返回,你需要把它保存爲一個字符串,而不是一個int - $ user_id ='5633847511239487'; – nathan 2010-07-08 13:58:19

+0

而不是處理消毒輸入的麻煩,使用參數化查詢來避免SQL注入。 http://bobby-tables.com/php.html在PHP中向你展示瞭如何。 – 2012-12-12 21:56:58

回答

3

您可以使用類似:

preg_replace('/[^0-9]/','',$user_id); 

替換字符串中的所有非數字符號。 但實際上沒有必要這樣做,只要使用mysql_real_escape_string(),因爲一旦建立$ query,您的整數值將被轉換爲字符串。

+0

...只是發佈這與is_numeric形成對比,這也允許浮動值,如「1.12」,這可能不完全是耶胡達想要的:) – michael 2010-07-08 14:01:22

+0

我測試了preg_replace解決方案,發現它限於14個字符。 所以我使用mysql_real_escape_string字符串和數字用戶輸入。 tnx大家 – yehuda 2010-07-09 09:14:40

1

驗證輸入。如果它是一個數字,不要只是簡單地逃避它,驗證它。這兒有幾個PHP功能,這做的伎倆,比如is_numeric()來 - 檢測變量是否爲數字或數字字符串

http://www.php.net/is_numeric

10

如果生成自己的用戶ID,沒有必要因爲沒有SQL注入或其他字符串問題的機會,所以將其轉換爲MySQL。

如果是用戶提交的值,則使用filter_var()(或is_numeric())來驗證它是一個數字而不是字符串。

+0

也會說同樣的事情,鑄造是有用的,但只適用於查詢字符串中不是用戶輸入結果的數字。它阻止人們操縱查詢字符串。至於用戶輸入,檢查值是否是數字是最好的選擇,因爲它允許您給出友好的消息。 – 2010-07-08 13:57:55

1

使用服務器端準備好的參數化語句(並因此刪除對xyz_real_escape_string())的需要和/或將該ID作爲字符串處理。 MySQL服務器內置了字符串< - >數字轉換的規則,如果您決定更改爲id字段的類型/結構,則不必更改php代碼。除非您有(微)優化的具體需求,否則通常不需要讓代碼對數據庫中id字段的結構和值範圍做出這種假設。

$pdo = new PDO('mysql:...'); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $pdo->prepare('SELECT age FROM users WHERE id=?'); 
$stmt->execute(array('5633847511239487')); 
0

經過一番研究,我得出了這樣的設置

private function escapeInt($value) 
{ 
    if (is_float($value)) 
    { 
     return number_format($value, 0, '.', ''); // may lose precision on big numbers 
    } 
    elseif(preg_match('/^-?[0-9]+$/', $value)) 
    { 
     return (string)$value; 
    } 
    else 
    { 
     $this->error("Invalid value"); 
    } 
} 

獨立的情況下彩車因爲$i = 184467440737095;成爲浮在32位系統上,因此將崩潰,以科學記數法轉換爲字符串時, 。
而簡單的正則表達式爲休息

0

您甚至可以通過*1乘以變量,你可以檢查它的最大值和最小值,你可以接受(年齡BIGINT是不是一種選擇,在所有...那爲什麼還要允許數字超過你準備好的價值? 而且還有PDO與它的查詢準備。