当前位置:   article > 正文

file_put_contents以及file_get_contents的用法与在使用过程中遇到的问题(PHP学习)

file put content 跨站

对数据的操作最基本的是增删改查,file_put_contents以及file_get_contents是对文件里的数据进行存入与取出。

先上代码:

  1. <?php
  2. $str = 'hello world';
  3. if(file_put_contents('01.txt',$str)){
  4. echo '数据存入成功','<br />';
  5. }else{
  6. echo '数据存入失败','<br />';
  7. }
  8. //返回的是:数据存入成功
  9. //原来相应的目录下是没有这个文件的
  10. //现在有这个文件了
  11. //从这里可以看出,如果没有这个文件的话
  12. //调用file_put_contents方法会自动创建这样的一个文件
  13. //然后把数据存入
  14. echo file_get_contents('01.txt'),'<br />';
  15. //返回hello world
  16. //把这个文件里的数值读出来
  17. //如果file_get_contents是要读一个不存在的文件
  18. //那么会报错,要读的文件一定要存在的
  19. if(file_put_contents('01.txt','new data to be insert')){
  20. echo '数据存入成功2','<br />';
  21. }else{
  22. echo '数据存入失败2','<br />';
  23. }
  24. echo file_get_contents('01.txt'),'<br />';
  25. //返回new data to be insert
  26. //说明用file_put_contents方法只能对数据进行替换
  27. //而不能在原来的基础上进行添加
  28. ?>

在用户登录或者查询数据等时候有些时候可能会有引号等对sql语句有影响的符号(sql注入攻击),这样等对他们进行数据库里的操作的时候会有影响,

这种情况应该怎么办呢?

:可以用addslashes 和 stripslashes

addslashes是可以使单引号(,),双引号("),反斜线(\)与NULL(NULL字符)加上反斜线进行转义

stripslashes是与addslashes相对的一个方法,是把这些转义过的,还原

如下代码:

  1. <?php
  2. $str = 'abcdfjaslffdfa"jflsadj';
  3. if(file_put_contents('01.txt',$str)){
  4. echo '数据存入成功','<br />';
  5. }else{
  6. echo '数据存入失败','<br />';
  7. }
  8. echo file_get_contents('01.txt'),'<br />';
  9. //返回abcdfjaslffdfa"jflsadj
  10. $str =addslashes($str);
  11. if(file_put_contents('01.txt',$str)){
  12. echo '数据存入成功2','<br />';
  13. }else{
  14. echo '数据存入失败2','<br />';
  15. }
  16. echo file_get_contents('01.txt'),'<br />';
  17. //返回 abcdfjaslffdfa\"jflsadj
  18. //经过转义
  19. echo stripslashes(file_get_contents('01.txt')),'<br />';
  20. //返回abcdfjaslffdfa"jflsadj
  21. //对转义字符串进行还原
  22. ?>

这种情况很多都是在用户进行表单输入的时候,后台处理的时候用

有些PHP版本magic_quotes_gpc这个配置是有用的,即自动魔术引号,即如果这个配置开启的话,$_POST ,$_COOKIE,$_SESSION这些值会自动进行转义,就不需要我们来转义

这种情况下怎么办呢?

答:为了兼容性和移植性,我们要对他进行判断,

看如下代码:

  1. <?php
  2. $textarea = $_POST['textarea'];
  3. if(get_magic_quotes_gpc()){
  4. echo '魔术引号以开启,$textarea不需要转义','<br />';
  5. }else{
  6. echo '魔术引号未开启,$textarea需要转义','<br />';
  7. $textarea = addslashes($textarea);
  8. }
  9. ?>

  

 

 

 

我们来看下面一个例子:

这是在网站里经常碰到的

先是一个form表单里填写数据,然后提交到php页面进行处理,然后对数据进行显示

form表单代码如下

  1. <html>
  2. <head>
  3. </head>
  4. <body>
  5. <form action="01.php" method="post">
  6. <div>
  7. <label for="name">Text Input:</label>
  8. <input type="text" name="name" id="name" value="" tabindex="1" />
  9. </div>
  10. <div>
  11. <label for="textarea">Textarea:</label>
  12. <textarea cols="40" rows="8" name="textarea" id="textarea"></textarea>
  13. </div>
  14. <div>
  15. <input type="submit" value="Submit" />
  16. </div>
  17. </form>
  18. </body>
  19. </html>

php处理页面,即01.php代码如下:

  1. <?php
  2. file_put_contents('01.txt', $_POST['textarea']);
  3. echo file_get_contents('01.txt'),'<br />';
  4. ?>

  如果在form表单的textarea控件里面输入

  1. <script type="text/javascript">
  2. while (true) {
  3. alert('a');
  4. };
  5. </script>

  就会无限弹出a,,而更有甚至利用这个漏洞,执行一些操作,如document.cookie等等

这种行为叫做XSS攻击

什么叫做XSS攻击呢?这种情况又该怎么办呢?

答:XSS攻击:跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆。

我们可以用htmlspecialchars方法,即html实体转义,即<>等这些html符号,都会被转化,那么当打印出来的时候,只会当他们是文字,而不是脚本了

  1. <?php
  2. file_put_contents('01.txt', htmlspecialchars($_POST['textarea']));
  3. echo file_get_contents('01.txt'),'<br />';
  4. //返回<script type="text/javascript"> while (true) { alert('a'); }; </script>
  5. ?>

  与htmlspecialchars方法相对的是htmlspecialchars_decode

 

  

  

转载于:https://www.cnblogs.com/ggbd-lie/p/3265421.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/617592
推荐阅读
相关标签
  

闽ICP备14008679号