簡體   English   中英

使用php時如何防止SQL注入?

[英]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之類的東西,則默認情況下更“安全”-意外編寫易受攻擊的代碼會更困難。

您可以將值綁定准備好的語句

但是對於簡單的數字變量來說,將其轉換為整數就足夠了:

$bash = (int) $_REQUEST['id'];

使用這個,只有一個數字將被存儲到$bash 即使有人輸入?id=--%20DROP%20TABLE%20xy; ,因為這將被強制轉換為1 ;

我發現防止注入的最簡單方法之一就是使用准備好的語句

您可以按照CmdrMoozy的建議通過PDO在PHP中執行此操作。

預備語句更安全,因為占位符? 只能代表值,而不代表變量(即:永遠不會被解釋為表名,服務器變量,列名等。{當前}甚至不能代表值列表)。 這立即使對查詢邏輯的任何修改都變得不可變,僅保留了可能的不需要的值作為注入可能性(查找“ notanid”的id),這在大多數情況下都不是問題(它們只會變成空白/錯誤/錯誤頁面,即他們試圖入侵您的網站的錯誤)。

附錄:這些限制是在服務器上執行准備好的語句時要執行的限制。 當由庫模擬准備好的語句而不是實際上是在服務器端時,這可能不是正確的,但通常其中許多都是模擬的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM