PHP IF 工作不正确的情况
PHP condition with IF working incorrect
我有以下代码,当我上传名为 "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>
您的代码在评估文件 "phpminiadmin.php" 的字符串位置时返回 0,因此“==”将其解释为 FALSE。
例如尝试使用文件名 "aphpminiadmin.php"。然后您的代码将正常工作,因为 strpos returns a 1 显然不是 false.
因此,MonkeyZeus 建议的更改将解决此问题。
MonkeyZeus - 希望您不介意我搭讪您的回答。 '只是觉得这个例子更清楚地说明了问题。
我有以下代码,当我上传名为 "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>
您的代码在评估文件 "phpminiadmin.php" 的字符串位置时返回 0,因此“==”将其解释为 FALSE。
例如尝试使用文件名 "aphpminiadmin.php"。然后您的代码将正常工作,因为 strpos returns a 1 显然不是 false.
因此,MonkeyZeus 建议的更改将解决此问题。
MonkeyZeus - 希望您不介意我搭讪您的回答。 '只是觉得这个例子更清楚地说明了问题。