[英]File Path Back Slashes
我使用PHP,Appache和PHPMyAdmin整理了一個相當基本的本地數據庫驅動的網站。 該站點允許用戶以兩種格式上載cad詳細文件。 除了文件路徑,他們還可以上傳文件名,相關的服務組以及詳細信息ID。
從上載頁面上載文件時,除了一個小問題外,基本上一切都可以順利進行。 一切都很好地提交到數據庫,但是文件的鏈接缺少必要的反斜杠。
但是,我可以進入數據庫本身,然后在文件路徑中輸入反斜杠。
形成:
<form method="post" action="add.php">
<table border="0">
<tr><td>Detail ID: </td><td><input type="number" name="id" /></td></tr>
<tr><td>Detail Name: </td><td><input type="text" name="name" /></td></tr>
<tr><td>Service Group: </td><td><input type="text" name="service" /></td></tr>
<tr><td>PDF: </td><td><input type="file" name="pdf" enctype="multipart/form-data"/></td></tr>
<tr><td>DWG: </td><td><input type="file" name="dwg"/></td></tr>
<tr><td></td><td><input type="submit" value="Submit" />
<input type="reset" value="Reset" /></td></tr>
</table>
</form>
PHP:
$con=mysql_connect("localhost","root","");
/* Select the database */
mysql_select_db("hrg_test");
/* Store the values submitted by form in variable */
$id=$_POST['id'];
$name=$_POST['name'];
$service=$_POST['service'];
$pdf=$_POST['pdf'];
$dwg=$_POST['dwg'];
/* Write a query to insert details into database */
$insert_detail=mysql_query("INSERT INTO hrg_test (id, name, service, pdf, dwg) VALUES ('$id', '$name', '$service', '$pdf', '$dwg')");
if($insert_detail)
{ echo "Detail Succesfully Added! <br /><br /><a href='add.html'>Add Another Detail</a>"; }
else
{ echo "Error".mysql_error(); }
/* closing the if else statements */
mysql_close($con);
?>
我已經讀過關於魔術引號和反斜杠的信息,盡管如果這是問題,我不確定如何將它們綁在一起。 也許我只是以錯誤的方式去做。
任何幫助將不勝感激。
我想您可以通過在每個輸入POST變量分配中使用它們來使此工作正常。
$pdf=mysql_real_escape_string($_POST['pdf']);
然而。 這里的問題更深。 目前可能只是本地腳本。 我們都去過那里。 令人驚訝的是,事情可以快速改變,而且可能並非總是有時間重構(老板喜歡原型,昨天想要完成的應用程序),或者有人(也許是您)復制了代碼以在更公共的環境中使用。 即使此腳本位於“僅管理員”區域的后面,惡意代碼編寫者(或心懷不滿的admin?)也可以訪問管理系統,然后能夠上載各種討厭的內容,並對數據庫進行不愉快的操作! 不要相信任何人。
概述一些問題以及如何以不到零的成本進行改進就可以節省一點精力。
mysql_real_escape_string()
但這仍然會留下安全漏洞,並讓您有機會忘記轉義。 但是,如果我們選擇PDO擴展名,則可以使用參數化查詢,您的所有問題都將得到神奇的解決。 這是一些示例代碼,不僅安全,而且更簡單(並且更簡短,一點也不重要)。
$dbh = new PDO('mysql:host=localhost;dbname=hrg_test', 'root', '');
$stmt = $dbh->prepare("INSERT INTO hrg_test (id, name, service, pdf, dwg) VALUES(?,?,?,?,?)");
$result = $stmt->execute(array($_POST['id'],$_POST['name'],$_POST['service'],$_POST['pdf'],$_POST['dwg']));
if($result){
echo "Detail Succesfully Added! <br /><br /><a href='add.html'>Add Another Detail</a>";
}
else {
var_dump($stmt->errorInfo());
}
我將忽略安全性問題,因為這是在本地站點上(沒有人讀過並理解其含義)。 您應該查看較新的方法,例如mysqli或PDO,但請嘗試使用mysql_real_escape_string()包裝這些值。 如果存在問題,那應該可以避免斜線並允許將其存儲。
附帶說明,我還為封閉的公司Intranet開發。 即使我知道怎么做,我的老板還是懇求我放棄很多不必要的安全措施,因為只有員工才能進入。
如果您還要回答這個問題,則指出存在安全問題是可以的……否則,您就是在浪費自己和其他人的時間。
要注意的另一件事是使用雙引號。 我注意到您的echo語句使用雙引號(“),這導致對引號內的字符串進行預處理(變量已展開等)。如果您處理任何數據,並將路徑放在雙引號內的字符串中,則反斜杠將將以下字符轉換為文字,並使您的反斜杠消失。
例如:
$UploadPath = "New\Drawings";
$NewPath = "C:\UPLOADS\$UploadPath";
在這種情況下,$ NewPath將轉換為'C:UPLOADSNewDrawings',因為每個反斜杠都會使它后面的字符成為文字。 使用單引號(')將防止這種情況,或者使用雙反斜杠。
Joe的觀點並不是說安全性並不重要,只是您不必在SO這樣的網站上用代碼來評論安全性。 實際上,我很想看到像SO這樣的網站完全禁止它。 如果我要詢問安全性,那很好,但是如果我發布一個代碼片段(我可能只是為了說明我的意思而寫的),那么我就不必處理大量評論,例如“這里有37個鏈接有關安全性”或“樂於讓您的數據庫充值”或有人想留下的簡短評論。
目標始終應該是回答OP的問題。 這幾乎就像有人繞過安全性原則的那一刻,他們認為他們需要拖曳互聯網以保護錯誤的編碼器不犯錯誤。 老實說,我發現它完全是放錯了地方的能量,因為VAST大多數人都回答“我知道,這只是出於張貼目的的一個例子”。
更不用說,在您的示例中,您說的是“簡單得多?” 包括花括號行在內,您的代碼段是11行代碼,並使用了人們應該學習的語法,但可能還不習慣。 OP發布了14行代碼(其中5行使不需要的局部變量成為可能,並將他的代碼減少到9行。那這是“容易得多”嗎?我討厭在這里成為魔鬼的擁護者,但是我說PDO / mysqli更簡單是一種觀點,可以肯定它們會更好,但是更簡單是一個折騰。
如果安全是問題的重點,那么您的答案將是不錯的。老實說,我想考慮一下您的劫持行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.