簡體   English   中英

is_numeric()是否意味着var對MySQL是安全的?

[英]Does is_numeric() mean a var is safe for MySQL?

問題說這一切都有希望,如果我檢查一個變量為is_numeric()返回true,是否可以直接放入MySQL查詢,或者我是否需要應用標准轉義? 我在想零字符,溢出漏洞和東西。

一個模棱兩可的例子是:

if(is_numeric($_GET['user_id'])) {
    mysql_query("SELECT * FROM `users` WHERE id = ".$_GET['user_id']);
}

MySQL中的數據類型是INT()。

在我看來,最安全的方法是將user_id轉換為整數,如果它是無效的,它將返回0。

$user_id = (int) $_GET['user_id'];

if ($user_id > 0) {
    mysql_query("SELECT * FROM `users` WHERE `id` = " . $user_id);
}

考慮到“10E3” is_numeric ,沒有。

如果你想要數字(如在數字中, 只有數字 ),你將需要檢查ctype_digit (它仍然會破壞像0123這樣的數字的SQL)或者將數字轉換為intfloat 如果數字不是所有數字都可以接受,則需要應用SQL安全轉義和引用。

來自http://php.net/manual/en/function.is-numeric.php

使用is_numeric()轉義SQL字符串時要小心。 is_numeric('0123')返回true但不帶引號的0123無法插入SQL。 PHP將沒有引號的0123解釋為文字八進制數; 但SQL只會引發語法錯誤。

因為程序必須為不存在的id變體做好准備,所以這一行應該足夠了:

mysql_query(sprintf("SELECT * FROM `users` WHERE `id` = %d LIMIT 1",$_GET['user_id'])); 

無論什么都不是十進制數,我們在sprintf內傳遞將轉為十進制。 零(〜錯誤輸入)具有與沒有現有id相同的狀態。

保存條件並聲明額外變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM