對數據的操作最基本的是增刪改查,file_put_contents以及file_get_contents是對文件里的數據進行存入與取出。
先上代碼:
<?php $str = 'hello world'; if(file_put_contents('01.txt',$str)){ echo '數據存入成功','<br />'; }else{ echo '數據存入失敗','<br />'; } //返回的是:數據存入成功 //原來相應的目錄下是沒有這個文件的 //現在有這個文件了 //從這里可以看出,如果沒有這個文件的話 //調用file_put_contents方法會自動創建這樣的一個文件 //然后把數據存入 echo file_get_contents('01.txt'),'<br />'; //返回hello world //把這個文件里的數值讀出來 //如果file_get_contents是要讀一個不存在的文件 //那么會報錯,要讀的文件一定要存在的 if(file_put_contents('01.txt','new data to be insert')){ echo '數據存入成功2','<br />'; }else{ echo '數據存入失敗2','<br />'; } echo file_get_contents('01.txt'),'<br />'; //返回new data to be insert //說明用file_put_contents方法只能對數據進行替換 //而不能在原來的基礎上進行添加 ?>
在用戶登錄或者查詢數據等時候有些時候可能會有引號等對sql語句有影響的符號(sql注入攻擊),這樣等對他們進行數據庫里的操作的時候會有影響,
這種情況應該怎么辦呢?
答:可以用addslashes 和 stripslashes
addslashes是可以使單引號(,),雙引號("),反斜線(\)與NULL(NULL字符)加上反斜線進行轉義
stripslashes是與addslashes相對的一個方法,是把這些轉義過的,還原
如下代碼:
<?php $str = 'abcdfjaslffdfa"jflsadj'; if(file_put_contents('01.txt',$str)){ echo '數據存入成功','<br />'; }else{ echo '數據存入失敗','<br />'; } echo file_get_contents('01.txt'),'<br />'; //返回abcdfjaslffdfa"jflsadj $str =addslashes($str); if(file_put_contents('01.txt',$str)){ echo '數據存入成功2','<br />'; }else{ echo '數據存入失敗2','<br />'; } echo file_get_contents('01.txt'),'<br />'; //返回 abcdfjaslffdfa\"jflsadj //經過轉義 echo stripslashes(file_get_contents('01.txt')),'<br />'; //返回abcdfjaslffdfa"jflsadj //對轉義字符串進行還原 ?>
這種情況很多都是在用戶進行表單輸入的時候,后台處理的時候用
有些PHP版本magic_quotes_gpc這個配置是有用的,即自動魔術引號,即如果這個配置開啟的話,$_POST ,$_COOKIE,$_SESSION這些值會自動進行轉義,就不需要我們來轉義
這種情況下怎么辦呢?
答:為了兼容性和移植性,我們要對他進行判斷,
看如下代碼:
<?php $textarea = $_POST['textarea']; if(get_magic_quotes_gpc()){ echo '魔術引號以開啟,$textarea不需要轉義','<br />'; }else{ echo '魔術引號未開啟,$textarea需要轉義','<br />'; $textarea = addslashes($textarea); } ?>
我們來看下面一個例子:
這是在網站里經常碰到的
先是一個form表單里填寫數據,然后提交到php頁面進行處理,然后對數據進行顯示
form表單代碼如下
<html> <head> </head> <body> <form action="01.php" method="post"> <div> <label for="name">Text Input:</label> <input type="text" name="name" id="name" value="" tabindex="1" /> </div> <div> <label for="textarea">Textarea:</label> <textarea cols="40" rows="8" name="textarea" id="textarea"></textarea> </div> <div> <input type="submit" value="Submit" /> </div> </form> </body> </html>
php處理頁面,即01.php代碼如下:
<?php file_put_contents('01.txt', $_POST['textarea']); echo file_get_contents('01.txt'),'<br />'; ?>
如果在form表單的textarea控件里面輸入
<script type="text/javascript"> while (true) { alert('a'); }; </script>
就會無限彈出a,,而更有甚至利用這個漏洞,執行一些操作,如document.cookie等等
這種行為叫做XSS攻擊
什么叫做XSS攻擊呢?這種情況又該怎么辦呢?
答:XSS攻擊:跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆。
我們可以用htmlspecialchars方法,即html實體轉義,即<>等這些html符號,都會被轉化,那么當打印出來的時候,只會當他們是文字,而不是腳本了
<?php file_put_contents('01.txt', htmlspecialchars($_POST['textarea'])); echo file_get_contents('01.txt'),'<br />'; //返回<script type="text/javascript"> while (true) { alert('a'); }; </script> ?>
與htmlspecialchars方法相對的是htmlspecialchars_decode