我正试图获得一个foreach循环,以便从我的表单中为我提供复选框值(具有值的文件名),并将其添加到zip文件中。
<input type="checkbox" name="download[0]" value="Fact_Sheet_1.pdf" />
<input type="checkbox" name="download[1]" value="Fact_Sheet_2.pdf" />
<input type="checkbox" name="download[2]" value="Fact_Sheet_3.pdf" />
<input type="checkbox" name="download[3]" value="Fact_Sheet_4.pdf" />
<input type="checkbox" name="download[4]" value="Fact_Sheet_5.pdf" />
如果我点击一个复选框,效果很好,但当我勾选多个复选框时,只有一个文件会添加到zip文件中。
我的代码在下面。如有任何建议,我们将不胜感激。
if(isset($_POST['submit']) )
{
foreach ($_POST['download'] as $key => $val) {
$filename = 'Fact_Sheets/' . $val;
}
}
system("zip -r files/zipfile $filename");
foreach ($_POST['download'] as $key => $val) {
$filename = 'Fact_Sheets/' . $val;
}
system("zip -r files/zipfile $filename");
每次都覆盖$filename
。
相反,建立它:
$filenames = '';
foreach ($_POST['download'] as $key => $val) {
$filenames .= '"Fact_Sheets/' . $val . '" ';
}
system("zip -r files/zipfile $filenames");
(还要注意的是,将input
命名为类似"download[]"
的名称是惯例,这样索引就可以自动为您完成。不过,这并不重要。)
但是不要这样做。正如评论中所讨论的,它有一个GAPING FLAW。不要写这些代码,即使你"只是在测试",或者即使你会"稍后修复"。一开始就不要让它存在,否则你会犯错误,或者不小心把它留在原地,或者找不到时间好好做。
我认为不写这个答案并不是在鼓励你,但我得出结论,如果我允许接受其他答案,这可能是一个危险的答案,会让事情变得更糟
一开始您使用的是$filename =
而不是$filename .=
(变量名应该是$filenames
)
如果你不检查文件是否存在并且不包含无效字符,我可能会伪造请求并发送给你:download[8]=../../../../../../../../etc/passwd
所以你的整个代码应该是这样的:
if(isset($_POST['submit']) ) {
$filenames = array();
foreach ($_POST['download'] as $key => $val) {
if( basename( $val) != $val){
throw new Exception( 'Hacker attempt!');
}
$filename = 'Fact_Sheets/' . $val;
if( !file_exists( $filename)){
throw new Exception( 'Invalid file!');
}
$filenames[] = escapeshellarg( $filename);
}
if( count( $filenames)){
system("zip -r files/zipfile " . implode( ' ', $filenames));
}
}
是的,没错,你也应该使用擒纵器。想象一下:
download[8]=`rm -rf *`
为什么不使用phpzip库?
将代码更改为以下代码:
<input type="checkbox" name="download[]" value="Fact_Sheet_1.pdf" />
<input type="checkbox" name="download[]" value="Fact_Sheet_2.pdf" />
<input type="checkbox" name="download[]" value="Fact_Sheet_3.pdf" />
<input type="checkbox" name="download[]" value="Fact_Sheet_4.pdf" />
<input type="checkbox" name="download[]" value="Fact_Sheet_5.pdf" />