早在Sql注入橫行的前幾年,字符串轉化為整數就已經被列為每個web程序必備的操作了。web程序將get或post來的id、整數等值強制經過轉化函數轉化為整數,過濾掉危險字符,儘可能降低系統本身被Sql注入的可能性。
背景、概述
早在Sql注入橫行的前幾年,字符串轉化為整數就已經被列為每個web程序必備的操作了。web程序將get或post來的id、整數等值強制經過轉化函數轉化為整數,過濾掉危險字符,儘可能降低系統本身被Sql注入的可能性。
現如今,雖然Sql注入已經逐漸淡出歷史舞台,但是,為了保證web程序的正常運行,減少出錯概率,更好的保證用的滿意度,我們同樣需要將用户的不正確輸入轉化為我們所需要的。
轉化方式
在PHP中,我們可以使用3種方式將字符串轉化為整數。
1.強制類型轉換方式
強制類型轉換方式,就是“在要轉換的變量之前加上用括號括起來的目標類型”(摘自PHP手冊“類型戲法”節)的方式。
複製代碼 代碼如下:
<?php
$foo = "1"; // $foo 是字符串類型
$bar = (int)$foo; // $bar 是整型
?>
對於整型來説,強制轉換類型名稱為int或者integer。
2.內置函數方式
內置函數方式,就是使用PHP的內置函數intval進行變量的轉換操作。
複製代碼 代碼如下:
<?php
$foo = "1"; // $foo 是字符串類型
$bar = intval($foo); // $bar 是整型
?>
intval函數的格式為:
int intval(mixed $var [, int $base]); (摘自PHP手冊)
雖然PHP手冊中明確指出,intval()不能用於array和object的轉換。但是經過我測試,轉換array的時候不會出任何問題,轉換值為1,而不是想象中的0。恐怕是因為在PHP內部,array類型的變量也被認為是非零值得緣故吧。轉換object的時候,PHP會給出如下的 notice:
Object of class xxxx could not be converted to int in on line xx
轉換值同樣為1。
3.格式化字符串方式
格式化字符串方式,是利用sprintf的%d格式化指定的.變量,以達到類型轉換的目的。
複製代碼 代碼如下:
<?php
$foo = "1"; // $foo 是字符串類型
$bar = sprintf("%d", $foo); // $bar 是字符串類型
?>
嚴格意義上講sprintf的轉換結果還是string型,因此它不應該算是字符串轉化為整數的方式。但是經過他處理之後的字符串值確實已經成為了“被強制轉化為字符串類型的整數”。
實際測試
上面介紹了PHP中,將字符串轉化為整數的3種方式。對於一般的程序員來説,看到這裏就算結束了,下面的部分是針對變態程序員的。
1.基本功能測試
設定以下數組:
複製代碼 代碼如下:
<?php
$a[] = "1";
$a[] = "a1";
$a[] = "1a";
$a[] = "1a2";
$a[] = "0";
$a[] = array('4',2);
$a[] = "2.3";
$a[] = "-1";
$a[] = new Directory();
?>
使用三種方式依次轉化上面給出的數組中的元素,查看轉換情況。程序源代碼如下:
複製代碼 代碼如下:
<?php
$a[] = "1";
$a[] = "a1";
$a[] = "1a";
$a[] = "1a2";
$a[] = "0";
$a[] = array('4',2);
$a[] = "2.3";
$a[] = "-1";
$a[] = new Directory();
// int
print "(int)<br />";
foreach($a as $v)
{
var_dump((int)$v);
print "<br />";
}
// intval
print "intval();<br />";
foreach($a as $v)
{