[英]how to protect from sql injection when using php?id=
您好,我需要幫助找到一種方法來防止當前項目上的sql注入,我正在制作bash教程站點,但我遇到了問題。 我將大部分內容放在數據庫中,根據用戶單擊的鏈接,它將不同的數據拖到頁面上。 我就是這樣做的
<a href="bash_cmds.php?id=1">apt-get </a><br>
並在bash_cmds.php上
<?php
require_once("connections/connect.php");
$dbcon = new connection();
$bash = $_REQUEST['id'];
$query2 = "SELECT * FROM bash_cmds WHERE id = $bash ";
$results = $dbcon->dbconnect()->query($query2);
if($results){
while($row = $results->fetch(PDO::FETCH_ASSOC)){
$bash_cmd = $row['bash_command'];
$how = $row['how_to'];
}
} else { return false; }
?>
<?php echo $bash_cmd ?>
<br />
<table>
<tr><td><?php echo $how ?> </td></tr>
</table>
但是,這使我容易受到sql注入的影響,我運行了sqlmap
並能夠提取所有數據庫和表。 有人可以幫忙嗎,我非常感謝您提供的信息非常寶貴。
有兩種方法可以做到這一點。 我相信最好的方法是使用一些數據庫抽象層(PHP中內置了一個很好的名為PDO的層) 並使用其准備好的語句API 。 您可以在此處閱讀有關PDO的更多信息,並且可以看到將值綁定到?
的特定功能?
這里的占位符。
另外,您可以使用mysqli_real_escape_string
API函數,該函數應轉義$bash
變量中的所有SQL。
當然,在這種情況下,只需使用(int)
或intval()
來確保ID是整數就足夠了,但是通常使用這種方法的危險在於,很容易忘記一次執行此操作,這您的應用程序容易受到攻擊。 有人可能會說,如果您使用PDO之類的東西,則默認情況下更“安全”-意外編寫易受攻擊的代碼會更困難。
我發現防止注入的最簡單方法之一就是使用准備好的語句 。
您可以按照CmdrMoozy的建議通過PDO在PHP中執行此操作。
預備語句更安全,因為占位符?
只能代表值,而不代表變量(即:永遠不會被解釋為表名,服務器變量,列名等。{當前}甚至不能代表值列表)。 這立即使對查詢邏輯的任何修改都變得不可變,僅保留了可能的不需要的值作為注入可能性(查找“ notanid”的id),這在大多數情況下都不是問題(它們只會變成空白/錯誤/錯誤頁面,即他們試圖入侵您的網站的錯誤)。
附錄:這些限制是在服務器上執行准備好的語句時要執行的限制。 當由庫模擬准備好的語句而不是實際上是在服務器端時,這可能不是正確的,但通常其中許多都是模擬的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.