这是我的代码:
$ost=$_GET['id']; //get the ID from the URL
$path = "audio/soundtracks/$ost"; //use the ID to select a path
// Open the folder
$dir_handle = @opendir($path) or die("Unable to open $path");
// Loop through the files
while ($file = readdir($dir_handle)) {
if($file == "." || $file == ".." || $file == "index.php" )
continue;
echo "<a href='$path/$file'>$file</a><br />"; //return the name of the track
}
// Close
closedir($dir_handle);
它的目的是自动列出目录中包含的每个声道,其名称由通过URL传递的ID给出。每个轨道以“### - title.mp3”格式命名,例如“101 - Overture.mp3”。
它工作正常,但由于某种原因,结果列表是随机排序的。有没有办法按标题对曲目进行排序?另外,我几乎是PHP的新手,GET功能有任何安全问题吗?提前谢谢。
编辑:GET仅用于指定路径,它不应该与数据库交互。这足以防止攻击吗?
$ost = $_GET['id'];
$bad = array("../","=","<", ">", "/","\"","`","~","'","$","%","#");
$ost = str_replace($bad, "", $ost);
$path = "audio/soundtracks/$ost";
答案 0 :(得分:1)
在使用之前对GET参数进行一些检查。就像检查它是数字,正确的长度等。如果用于db,则使用msyql_real_escape_String。
循环目录时,将文件保存在php中的数组中,标题为索引。像这样,你可以随意排序:
while ($file = readdir($dir_handle)) {
if($file == "." || $file == ".." || $file == "index.php" )
continue;
$array[$file] = "<a href='$path/$file'>$file</a><br />"; //return the name of the track
}
排序($数组);
...之后,分别循环和打印数组。
首先循环到数组,然后在我眼中分离打印是一种更好的编码实践。它更灵活。
答案 1 :(得分:0)
除了检查长度并在$ _GET上使用转义字符串安全措施之外,您还可以将ID编码并解码为URL并在使用之前对其进行解码。
//before putting into URL
$id = $rows["id"];
$id = base64_encode($id);
<a href="yourUrl.php?id='$id'"
//in yourUrl.php
$id = $_GET['id'];
$id = base64_decode($id);