PHP中的常用函数
目錄
mysql_connect()、mysqli_query()、mysqli_real_escape_string
is_string(var)
mysqli_num_rows(result)、mysqli_fetch_assoc()?
mysqli_fetch_array()
unset()
php_uname
ini_get()
trim()
代碼審計中的常見函數
?addslashes()
stripslashes()
get_magic_quotes_gpc()
htmlspecialchars()
array_map
str_replace
stripos()?
strrpos()
substr()
intval()
strrchr()
傳送門 -》PHP學習筆記
mysql_connect()、mysqli_query()、mysqli_real_escape_string
mysqli_real_escape_string():會對輸入的特殊字符進行轉義,如單引號雙引號等,比如輸入admin',經過這個函數轉義就會變成admin\',將單引號轉義了,就避免了sql注入
<?php $con=mysqli_connect("localhost","root","123456","RUNOOB"); //打開一個到mysql服務器的新的連接 if (mysqli_connect_errno($con)) //返回最近調用函數的最后一個錯誤代碼 { echo "連接 MySQL 失敗: " . mysqli_connect_error(); } // 修改數據庫連接字符集為 utf8,這樣的操作在針對中文字符非常有用,很多數據庫查詢亂碼的情況都是字符集的問題。 mysqli_set_charset($con,"utf8");$query="select username,email from member where id=$id"; mysqli_query($con,$query); //執行某個針對數據庫的查$newname="您好"; // 轉義特殊字符 $newpers=mysqli_real_escape_string($con,$newname); // 轉義后插入,執行成功 mysqli_query($con,"INSERT into websites2 (name) VALUES ('$newpers')"); ?>is_string(var)
檢測變量var是否是字符串,是則返回?true,否則返回?false
mysqli_num_rows(result)、mysqli_fetch_assoc()?
- mysqli_num_rows():返回結果集中行的數量,result規定由 mysqli_query()、mysqli_store_result() 或 mysqli_use_result() 返回的結果集標識符
- mysqli_fetch_assoc() :函數從結果集中取得一行作為關聯數組。假如從數據庫表中取出一個用戶的用戶名和密碼,表中的字段為username和password,其中一行數據為test,123456。用assoc來取得結果集中的 一行 是array([username]=>'test',[password]=>'123456'),也就是結果的數組中的索引是 所查數據庫表的字段名,駐數組中的值為我們要查詢的值。
再通過一個例子來理解mysql_fetch_assoc()。如下連接數據庫,再執行查詢所有表的操作,通過mysql_fetch_assoc()函數以數組的方式返回所有的查詢結果
<?php $con = mysql_connect( '127.0.0.1', 'root', 'root' );if ( !$con ) {die( '數據庫鏈接出錯,請檢查賬號密碼及地址是否正確: ' . mysql_error() );}else{echo '數據庫連接成功'.'<br/>';}$result = mysql_query('show databases;') or die ( mysql_error() );;While($row = mysql_fetch_assoc($result)){ print_r($row);} ?>mysqli_fetch_array()
從結果集中取得一行作為數字數組或關聯數組:
<?php // 1.連接數據庫 $con=mysqli_connect("127.0.0.1","root","root","mycms"); if (mysqli_connect_errno($con)) { echo "連接 MySQL 失敗: " . mysqli_connect_error(); } $sql="select * from sc_config where ID=1"; $result=mysqli_query($con,$sql); print_r($result); //將全部結果以數組的形式輸出 $row=mysqli_fetch_array($result,MYSQLI_ASSOC); print_r("<pre>"); //格式化輸出 print_r($row); ?>瀏覽器輸出結果如下
?在數據庫中執行這條sql語句的結果如下 :"select * from sc_config where ID=1"
即mysqli_fetch_array()就是將結果以數組的形式全部進行輸出
unset()
php使用unset()刪除數組中某個單元(鍵)的方法
| 1 2 3 4 5 6 | <?php $arr = array("朝陽區","海淀區","西城區","東城區","豐臺區"); unset($arr[3]);? ?//刪除第四個元素"東城區" echo "<pre>"; print_r($arr); ?> |
輸出結果如下:
| 1 2 3 4 5 6 7 | Array ( ??[0] => 朝陽區 ??[1] => 海淀區 ??[2] => 西城區 ??[4] => 豐臺區 ) |
還有個用法
<?php $con = mysql_connect( '127.0.0.1', 'root', 'root' );if ( !$con ) {die( '數據庫鏈接出錯,請檢查賬號密碼及地址是否正確: ' . mysql_error() );}else{echo '數據庫連接成功'.'<br/>';}$result = mysql_query('show databases;') or die ( mysql_error() );;//print_r($result);While($row = mysql_fetch_assoc($result)){ $data[] = $row['Database'];print_r($data); //這里輸出的數組信息很亂,重復數據多} echo "<br/>"."<br/>"."<br/>"; unset($result, $row); //去除重復 print_r($data); ?>setcookie()
setcookie() 函數向客戶端發送一個 HTTP cookie。cookie 是由服務器發送到瀏覽器的變量。cookie 通常是服務器嵌入到用戶計算機中的小文本文件。每當計算機通過瀏覽器請求一個頁面,就會發送這個 cookie。
setcookie(name,value,expire)| name | 必需。規定 cookie 的名稱。 |
| value | 必需。規定 cookie 的值。 |
| expire | 可選。規定 cookie 的有效期 |
php_uname
php_uname(string) —?返回運行 PHP 的系統的有關信息。string的內容如下
- 'a':此為默認。包含序列?"s n r v m"?里的所有模式。
- 's':操作系統名稱。例如:?FreeBSD。
- 'n':主機名。例如:?localhost.example.com。
- 'r':版本名稱,例如:?5.1.2-RELEASE。
- 'v':版本信息。操作系統之間有很大的不同。
- 'm':機器類型。例如:i386。
ini_get()
ini.get(string):用來獲取php.pin配置環境中變量的值。如果選型的值為布爾型如on、off、true、false之類的則返回0或者1,否則返回值本身
<?phpecho ini_get('default_socket_timeout').'<br>';echo ini_get('allow_url_include').'<br>'; //返回0echo ini_get('allow_url_fopen').'<br>'; ?>輸出如下
trim()
trim() 函數移除字符串兩側的空白字符或其他預定義字符。
trim(string,charlist)| string | 必需。規定要檢查的字符串。 |
| charlist | 可選。規定從字符串中刪除哪些字符。如果被省略,則移除以下所有字符:
|
1. 移除字符兩邊空格
<?php$str = " Hello World! ";echo $str . "<br>";echo trim($str); ?>?注:不能移除單引號雙引號這些,即這個不能防止注入
代碼審計中的常見函數
?addslashes()
addslashes() 函數能夠在預定義的字符前添加反斜杠進行轉義。在sql中用的比較多,防止sql注入
預定義字符是:
- 單引號(')
- 雙引號(")
- 反斜杠(\)
- NULL
stripslashes()
stripslashes() 函數,刪除由?addslashes()?函數添加的反斜杠。
<?php$a = "who's you";$b = addslashes($a); #輸出who\'s you,自動對字符串中的單引號進行了轉義echo $b.'<br/>';echo stripslashes($b); #刪除添加的反斜杠 ?>是不是有點負負得正的感覺
get_magic_quotes_gpc()
get_magic_quotes_gpc函數能夠取得 PHP 環境變數 magic_quotes_gpc 的值,返回 0 表示關閉本功能;返回 1 表示本功能打開。那么magic_quotes_gpc是干嘛用的了?默認情況下,PHP 指令 magic_quotes_gpc 為 on,它會對所有的 GET、POST 和 COOKIE 數據自動運行 addslashes()即自動進行轉義。在php5.4及更高版本中,這個函數被去掉了,也即是php解析器不會自動為POST、GET、COOKIE過來的數據增加轉義字符"\",而是把安全編碼交給了用戶自己,從而避免了magic_quotes_gpc未設置,用戶依賴這個設置而帶來了安全隱患。
所以在高版本的php.ini配置文件中是找不到get_magic_quotes_gpc()該函數的。
不要對已經被 magic_quotes_gpc 轉義過的字符串使用 addslashes(),因為這樣會導致雙層轉義。
總結如下:
1. 對于magic_quotes_gpc=on的情況,
我們可以不對輸入和輸出數據庫的字符串數據作addslashes()和stripslashes()的操作,數據也會正常顯示。
如果此時你對輸入的數據作了addslashes()處理,那么在輸出的時候就必須使用stripslashes()去掉多余的反斜杠。
2. 對于magic_quotes_gpc=off 的情況
必須使用addslashes()對輸入數據進行處理,但并不需要使用stripslashes()格式化輸出
因為addslashes()并未將反斜杠一起寫入數據庫,只是幫助mysql完成了sql語句的執行
htmlspecialchars()
htmlspecialchars() 函數把預定義的字符 "<" 、">" 、"&" 轉換為 HTML 實體。這樣可以防止xss攻擊
<?php$a = "<script>alert(/1/)</script>";#echo $a #輸出這條肯定會彈窗的echo htmlspecialchars($a); #這里進行了轉義處理,不會彈窗 ?>看下源碼,<>被轉換成了HTML實體,所以不能執行xss。
array_map
array_map - 將回調函數作用到數組中的每一個元素上。那什么是回調函數了?
- 我們調用php系統提供的函數叫直接調用,也叫: 直調
- php系統調用用戶自定義的函數,必須要通過一個代理函數來調用,叫間接調用,也叫回調
str_replace
搜索字符中的某些字符進行替換。該函數區分大小寫,可雙寫繞過
<?php$name = str_replace( 'xss', '', 'asfxss' ); echo $name."</br>"; //輸出asf$name = str_replace( 'xss', '', 'asfXSS' ); echo $name."</br>"; //輸出asfXSS$name = str_replace( 'xss', '', 'asxssf' ); echo $name."</br>"; //輸出asf$name = str_replace( 'xss', '', 'asfxsxsss' ); echo $name."</br>"; //輸出asfxss$name = str_replace( 'xss', '', 'asfxsXSSs' ); echo $name."</br>"; //輸出asfxsXSSs$name = str_replace( '<script>', '', '</script>' ); echo $name."</br>"; //輸出</script> ?>strip_tags()?
strip_tags() 函數剝去 HTML、XML 以及 PHP 的標簽。
strip_tags(string,allow)| string | 必需。規定要檢查的字符串。 |
| allow | 可選。規定允許的標簽。這些標簽不會被刪除。 |
如下在字符中除了有 Hello World!外還有很多標簽<><script><li>經過這個函數處理后就會把這些標簽移除
<?php//不規定允許的標簽echo strip_tags("<><script><span>Hello<li> <b>world!</b>"); //輸出Hello world!echo "</br>";//規定允許的標簽echo strip_tags("Hello<script><b><i>world!</i></b>","<script>"); ?>stripos()?
stripos() 函數查找字符串在另一字符串中第一次出現的位置(不區分大小寫)
stripos(string,find,start)| string | 必需。規定要搜索的字符串。 |
| find | 必需。規定要查找的字符。 |
| start | 可選。規定開始搜索的位置。 |
strrpos()
strrpos() 函數查找字符串在另一字符串中最后一次出現的位置(區分大小寫)。
注釋:strrpos() 函數是區分大小寫的。
相關函數:
- strpos()?- 查找字符串在另一字符串中第一次出現的位置(區分大小寫)
- stripos()?- 查找字符串在另一字符串中第一次出現的位置(不區分大小寫)
- strripos()?- 查找字符串在另一字符串中最后一次出現的位置(不區分大小寫)
substr()
substr() 函數返回字符串的一部分。
<?php #從字符串中的索引1位置開始截取直到最后 echo substr("hello world", 1) #輸出 ello world ?>如下語句的意思為,返回文件的后綴名
$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);即<?php echo strrpos("shell.php",".")+1; #輸出6 echo substr("shell.php", strrpos("shell.php",".")+1); #輸出php ?>intval()
intval()?函數用于獲取變量的整數值。成功時返回 var 的 integer 值,失敗時返回 0。
<?phpecho intval(1.24); //輸出 1echo "<br/>";echo intval("你好"); //輸出 0echo "<br/>";echo intval("2 你好"); //輸出2echo "<br/>";echo intval("200 你好"); //輸出200echo "<br/>";echo intval("你好200"); //輸出0 ?>strrchr()
?strrchr() 函數查找字符串在另一個字符串中最后一次出現的位置,并返回從該位置到字符串結尾的所有字符。
<?php echo strrchr("date.php.php",'.p'); ?>總結
- 上一篇: C语言 程序代码编写规范
- 下一篇: 做技术知道了哪些事情代表自己成熟了?