file_put_contents以及file_get_contents的用法與在使用過程中遇到的問題(PHP學習)


對數據的操作最基本的是增刪改查,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

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM