写入函数怎么在PHP中使用?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
下写入函数第二个参数数据的官网定义:
数据 要写入的数据。类型可以是,字符串,array 或者是,stream 资源(如上面所说的那样)。 , 如果,data 指定为,stream 资源,这里,stream 中所保存的缓存数据将被写入到指定文件中,这种用法就相似于使用,stream_copy_to_stream(),函数。 , 参数,data 可以是数组(但不能为多维数组),这就相当于,写入(文件名,美元,加入(& # 39;& # 39;,,数组)美元)。
可以看的到,数据参数可以是数组,会自动做<代码>加入(& # 39;& # 39;美元数组)代码>转换为字符串的
<强>该函数访问文件时,遵循以下规则:强>
- <李>
如果设置了FILE_USE_INCLUDE_PATH,那么将检查*文件名*副本的内置路径
李> <李>如果文件不存在,将创建一个文件
李> <李>打开文件
李> <李>如果设置了LOCK_EX,那么将锁定文件
李> <李>如果设置了FILE_APPEND,那么将移至文件末尾。否,则将会清除文件的内容
李> <李>向文件中写入数据
李> <李>关闭文件并对所有文件解锁
李> <李>如果成功,该函数将返回写入文件中的字符数。如果失败,则返回错误的。
李>但我们字符串过滤函数一般是用preg_match函数来过滤的,如:
如果(preg_match (& # 39;/\ & lt;/& # 39;,元数据)){ ,死(& # 39;黑客# 39;); }
我们知道,很多处理字符串的函数如果传入数组会出错返回零,如比较字符串,函数md5等,但preg_match函数出错返回假,这里我们可以通过<代码> var_dump (preg_match (& # 39;/\ & lt;/& # 39;,元数据));> 代码来验证,这样的话,preg_match的正则过滤就失效了
因此,猜测文件上传的代码是这样写的
& lt; ? php , 如果(收取($ _POST[& # 39;内容# 39;]),,,,收取($ _POST [& # 39; ext # 39;])) {=,美元data $ _POST[& # 39;内容# 39;];=,美元ext $ _POST [& # 39; ext # 39;]; , ,//var_dump (preg_match (& # 39;/\ & lt;/& # 39;,元数据)); ,如果(preg_match (& # 39;/\ & lt;/& # 39;,元数据)){ 死才能(& # 39;黑客# 39;); ,} 时间,filename 美元;=,(); ,用file_put_contents(文件名。ext美元,美元数据); } , ?在
于是我么可以传入<代码>内容[]=& lt; ?php phpinfo(); ?祝辞,ext=php代码>这样来绕过
<强>修复方法
强>
修复方法是使用写入文件函数来代替危险的写入函数,写入文件函数只能传入字符串,如果是数组会出错返回假
& lt; ? php , 如果(收取($ _POST[& # 39;内容# 39;]),,,,收取($ _POST [& # 39; ext # 39;])) {=,美元data $ _POST[& # 39;内容# 39;];=,美元ext $ _POST [& # 39; ext # 39;]; , ,//var_dump (preg_match (& # 39;/\ & lt;/& # 39;,元数据)); ,如果(preg_match (& # 39;/\ & lt;/& # 39;,元数据)){ 死才能(& # 39;黑客# 39;); ,} 时间,filename 美元;=,(); ,//写入(文件名。ext,美元,美元数据); ,f 美元;=,fopen(文件名。ext美元); f,美元,var_dump(写入文件(数据)); } , ?在
关于写入函数怎么在PHP中使用问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。