![](/img/trans.png)
[英]What kind of security precautions should I take for a “contact us” form?
[英]What precautions should I take when using '0' in PHP as a number?
在PHP中0
被視為布爾值false。 因此,每當我遇到一個函數必須返回數值並且返回0的情況時,或者當我有一個MySQL bool
列且可能的值為0/1
,我都會使用如下代碼:
$active=(isActive()) ? 1 : 0;
$this->db->set('isActive',$active);
我想到了0
可能會轉換為null
或空字符串,例如""
。
為了使0
始終作為整數而不是其他東西,我需要采取哪些預防措施?
如果您想讓PHP以唯一的'false'來評估'false'的語句,請使用===代替通常的==
PHP確實允許您將變量轉換為特定類型。
<?php
$value = (bool) 0;
$value3 = (int) 3;
?>
如果您始終希望將0視為int,則將其強制轉換為1。
沒有。 0為0,即使邏輯評估認為它是錯誤的值,也不會改變其實際值。
我找不到PHP將0
轉換為null
或""
的單一情況。 如果必須將其轉換為字符串,則它將為"0"
;對於布爾值,它將為false
。 沒有“ null”類型,因此實際上您的0
對於PHP是安全的。 false
轉換為字符串時,會將false
轉換為""
(空字符串),但整數是安全的。
現在,這不能保證第三方代碼在傳遞其他期望值時傳遞整數時不會表現出奇怪的行為,但是您基本上是安全的。
在一些地方,對0
和'0'
進行了特殊處理。 這幾乎總是由於自動類型強制。 您已經注意到0
值為false
。 因此,如果PHP有理由將'0'
轉換為整數,則該結果也將為false。 需要注意的主要因素是empty()
函數。 記錄在案,順便說一句。
實際上,由於這個問題,我很少使用empty()
。 更狹窄地檢查更有意義,因此我使用isset()
, is_null()
和=== false
甚至== 0
(或!= 0
)。 也有其他檢查。 我有數據庫處理程序代碼,不僅可以使用is_null()
進行檢查,而且還可以進行is_numeric()
。
其他需要注意的地方是您使用其他開發人員的代碼的地方,他們對0
在自動類型強制轉換中的工作方式並不十分謹慎。 如果給一個函數一個0
但是當它應該使用0
時卻以null
結束,那么您可能已經在API中發現了一個錯誤,應該向開發人員提出。 實際上,當應該使用isset()
和/或is_null()
時,它們可能正在使用empty()
is_null()
。 :-)
如果將變量設置為0,除非將該變量強制轉換為其他變量,否則該變量將保持為0。 類型仍然是整數。
您可以使用is_numeric ()函數檢查變量是否存在。
例:
$active=(isActive()) ? 1 : 0;
if(is_numeric($active)){
$this->db->set('isActive',$active);
}
或者您可以使用比較運算符===代替通常的==。 它將比較數據類型以及變量的內容。
$active=(isActive()) ? 1 : 0;
if($active === 0 || $active === 1){
$this->db->set('isActive',$active);
}
希望這可以幫助!
最好使用===比較運算符,因為它會檢查類型以及它們的值是否相等。 在php中,如果您這樣做:
最好的選擇是在可能的地方使用true和false,而不是為標志設置1和0。 在您的示例中,執行以下操作:
$active=(isActive()) ? true : false;
甚至更好(假設isActive返回正確的布爾值):
$this->db->set('isActive',isActive());
而不是:
$active=(isActive()) ? 1 : 0;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.