[PHP]这样会被黑吗?求改进

2015-05-15 11:33:40 +08:00
 YAFEIML
因为有时候拉图片拉的不完整,所以判断下MD5

<?php
$target = $_GET['url'];
$filename = basename($target);
$tupian = './cache/'.$filename;
$kzm = explode(".",$filename);
$tupian_md5 = $tupian.'.txt';

if (file_exists($tupian_md5) ) {

if (count(file($tupian_md5)) == '1')
{
$md5file = md5_file($tupian);
file_put_contents($tupian_md5,PHP_EOL.$md5file,FILE_APPEND);
$content = file_get_contents($tupian);
}

else if (count(file($tupian_md5)) == '2' && substr_count(file_get_contents($tupian_md5),mb_substr(file_get_contents($tupian_md5),0,32)) == 2)

{
$content = file_get_contents($tupian);
}

else if (count(file($tupian_md5)) == '2' && substr_count(file_get_contents($tupian_md5),mb_substr(file_get_contents($tupian_md5),0,32)) != 2)

{
@unlink($tupian);
@unlink($tupian_md5);
$content = file_get_contents($target);
}

else
{
$content = file_get_contents($tupian);
}
}
else {
$md5file_t = md5_file($target);
file_put_contents($tupian_md5,$md5file_t);

$content = file_get_contents($target);

$fp = fopen($tupian, 'w+');
fwrite($fp, $content);
fclose($fp);
}

header('Content-Type: image/'.end($kzm).'');
echo $content;
?>
3208 次点击
所在节点    PHP
8 条回复
800126
2015-05-15 11:48:34 +08:00
你加一句“PHP才是最好的语言”,立马就有人回复你了。
ichou
2015-05-15 12:11:23 +08:00
代码贴到 gist 上再发上来会比较好
RIcter
2015-05-15 12:38:50 +08:00
会有任意文件读取吧?
p1n3
2015-05-15 12:53:53 +08:00
xx.php?url=file:///etc/passwd
extreme
2015-05-15 13:17:29 +08:00
用正则表达式对$_GET['url']以及$filename匹配下比较好,例如不允许有'../'之类的。
例如:preg_match('/^[a-zA-Z0-9\-]+\.(jpg|png|gif)$/', $_GET['url'])
就只允许文件名有字母,数字和'-',且扩展名仅能为jpg或png或gif。
对这个php文件设置openbasedir,甚至是chroot,更安全。
phithon
2015-05-15 15:27:53 +08:00
代码不加高亮我就不仔细看了,感觉会出任意文件读取、文件删除漏洞。4楼真相。
建议:
参数是url的话,正则判断 |^https?://.*\.(jpg|png|gif)$|is是否非法。
本地文件名的话,用$name = basename($name);处理一遍,再判断一遍后缀是否是图片就差不多了。
denghongcai
2015-05-15 16:14:06 +08:00
4楼的并没有任意文件读取,basename也不是个这种情况都照顾不到的函数的
ryd994
2015-05-17 01:54:07 +08:00
chroot 卍解

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/191254

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX