我有以下代码,当我上传名为" abc.htaccess"的文件时然后通过显示" attacked"来正常工作,但是当我上传abc.php或abcphp文件名时,它告诉我文件已上传。 那么if(false&& true)(与上传.php文件相同)和if(true&& true)(与上传.htaccess文件相同)的条件是什么。
<!DOCTYPE html>
<html>
<body>
<form action="" method="post" enctype="multipart/form-data">
Select image to upload: <input type="file" name="fileToUpload" id="fileToUpload"><input type="submit" value="Upload Image" name="submit">
</form>
<br />
<br />
<?php
$target_dir = "./";
$target_file = $target_dir . $_FILES["fileToUpload"]["name"];
echo "Filename: " . $_FILES["fileToUpload"]["name"];
var_dump(strpos(strtolower($_FILES["fileToUpload"]["name"]),"php"));
var_dump(strpos(strtolower($_FILES["fileToUpload"]["name"]), "htaccess"));
if(1==1 && 1==2){
echo "Condition test: 1==1 && 1==2";
}
if(1==1 && 2==2){
echo "Condition test: 1==1 && 2==2";
}
if((strpos(strtolower($_FILES["fileToUpload"]["name"]),"php") == false) && (strpos(strtolower($_FILES["fileToUpload"]["name"]), "htaccess") == false)){
if(isset($_POST["submit"])) {
move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $target_file);
echo "Uploaded file: <a href='http://" .$_SERVER['SERVER_NAME'] . "/" . $_FILES["fileToUpload"]["name"] . "' target='_blank'>" . $_FILES["fileToUpload" . "</a>";
echo "File uploaded";
}
}else{echo "attacked";}
?>
2上传时间的结果如下:
<pre>
1st:
Filename: phpminiadmin.phpint(0)
bool(false)
Condition: 1==1 && 2==2Uploaded file: <a href="http://domain.com/phpminiadmin.php" target="_blank">phpminiadmin.php</a>
2nd:
Filename: desktop.htaccessbool(false)
int(8)
Condition: 1==1 && 2==2attacked
</pre>
答案 0 :(得分:0)
在评估文件的字符串位置时,您的代码返回0&#34; phpminiadmin.php&#34;因此&#34; ==&#34;将其解释为FALSE。
例如,尝试使用文件名&#34; aphpminiadmin.php&#34;。您的代码将正常工作,因为strpos返回1显然不是假的。
因此,MonkeyZeus建议的更改将解决问题。
MonkeyZeus - 希望你不要介意我的答案。 &#39;只是觉得这个例子更清楚地说明了这个问题。