程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP保護數據庫的具體代碼示例

PHP保護數據庫的具體代碼示例

編輯:關於PHP編程

因為數據庫管理不善導致數據丟失,為自己帶來損失的例子不再少數。我們這次就要講到下面代碼顯示了運行 SQL 語句的示例腳本。在本例中,SQL 語句是允許相同攻擊的動態語句。此表單的所有者可能認為表單是安全的,因為他們已經把列名限定為選擇列表。但是,代碼疏忽了關於表單欺騙的最後一個習慣 — 代碼將選項限定為下拉框並不意味著其他人不能夠發布含有所需內容的表單(包括星號 [*])。

  1. <html>   
  2. <head>   
  3. <title>SQL Injection Example</title>   
  4. </head>   
  5. <body>   
  6. <form id="myFrom" action="<?php echo $_SERVER['PHP_SELF']; ?>"   
  7.     method="post">   
  8. <div><input type="text" name="account_number"   
  9.     value="<?php echo(isset($_POST['account_number']) ?    
  10.         $_POST['account_number'] : ''); ?>/>   
  11. <select name="col">   
  12. <option value="account_number">Account Number</option>   
  13. <option value="name">Name</option>   
  14. <option value="address">Address</option>   
  15. </select>   
  16. <input type="submit" value="Save" name="submit" /></div>   
  17. </form>   
  18. <?php   
  19. if ($_POST['submit'] == 'Save') {   
  20.     /* do the form processing */   
  21.     $link = mysql_connect('hostname', 'user', 'password') or    
  22.         die ('Could not connect' . mysql_error());   
  23.     mysql_select_db('test', $link);   
  24.            
  25.         $col = $_POST['col'];   
  26.  
  27.     $select = "SELECT " . $col . " FROM account_data WHERE account_number = "    
  28.         . $_POST['account_number'] . ";" ;   
  29.     echo '<p>' . $select . '</p>';   
  30.  
  31.     $result = mysql_query($select) or die('<p>' . mysql_error() . '</p>');   
  32.  
  33.     echo '<table>';   
  34.     while ($row = mysql_fetch_assoc($result)) {   
  35.         echo '<tr>';   
  36.         echo '<td>' . $row[$col] . '</td>';   
  37.         echo '</tr>';   
  38.     }   
  39.     echo '</table>';   
  40.  
  41.     mysql_close($link);   
  42. }   
  43. ?>   
  44. </body>   
  45. </html>  

因此,要形成PHP保護數據庫的習慣,請盡可能避免使用動態 SQL 代碼。如果無法避免動態 SQL 代碼,請不要對列直接使用輸入。下面則顯示了除使用靜態列外,還可以向帳戶編號字段添加簡單驗證例程以確保輸入值不是非數字值。

  1. <html>   
  2. <head>   
  3. <title>SQL Injection Example</title>   
  4. </head>   
  5. <body>   
  6. <form id="myFrom" action="<?php echo $_SERVER['PHP_SELF']; ?>"   
  7.     method="post">   
  8. <div><input type="text" name="account_number"   
  9.     value="<?php echo(isset($_POST['account_number']) ?    
  10.         $_POST['account_number'] : ''); ?>/> <input type="submit"   
  11.     value="Save" name="submit" /></div>   
  12. </form>   
  13. <?php   
  14. function isValidAccountNumber($number)    
  15. {   
  16.     return is_numeric($number);   
  17. }   
  18. if ($_POST['submit'] == 'Save') {   
  19.  
  20.     /* Remember habit #1--validate your data! */   
  21.     if (isset($_POST['account_number']) &   
  22.     isValidAccountNumber($_POST['account_number'])) {   
  23.  
  24.         /* do the form processing */   
  25.         $link = mysql_connect('hostname', 'user', 'password') or   
  26.         die ('Could not connect' . mysql_error());   
  27.         mysql_select_db('test', $link);   
  28.  
  29.         $select = sprintf("SELECT account_number, name, address " .   
  30.         " FROM account_data WHERE account_number = %s;",   
  31.         mysql_real_escape_string($_POST['account_number']));   
  32.         echo '<p>' . $select . '</p>';   
  33.         $result = mysql_query($select) or die('<p>' . mysql_error() . '</p>');   
  34.  
  35.         echo '<table>';   
  36.         while ($row = mysql_fetch_assoc($result)) {   
  37.             echo '<tr>';   
  38.             echo '<td>' . $row['account_number'] . '</td>';   
  39.             echo '<td>' . $row['name'] . '</td>';   
  40.             echo '<td>' . $row['address'] . '</td>';   
  41.             echo '</tr>';   
  42.         }   
  43.         echo '</table>';   
  44.  
  45.         mysql_close($link);   
  46.     } else {   
  47.         echo "<span style="font-color:red">" .   
  48.     "Please supply a valid account number!</span>";   
  49.  
  50.     }   
  51. }   
  52. ?>   
  53. </body>   
  54. </html>   

在這次PHP保護數據庫的例子中還展示了 mysql_real_escape_string() 函數的用法。此函數將正確地過濾您的輸入,因此它不包括無效字符。如果您一直依賴於 magic_quotes_gpc,那麼需要注意它已被棄用並且將在 PHP V6 中刪除。從現在開始應避免使用它並在此情況下編寫安全的 PHP 應用程序。此外,如果使用的是 ISP,則有可能您的 ISP 沒有啟用 magic_quotes_gpc。

最後,在改進的PHP保護數據庫示例中,您可以看到該 SQL 語句和輸出沒有包括動態列選項。使用這種方法,如果把列添加到稍後含有不同信息的表中,則可以輸出這些列。如果要使用框架以與數據庫結合使用,則您的框架可能已經為您執行了 SQL 驗證。確保查閱文檔以保證框架的安全性;如果仍然不確定,請進行驗證以確保穩妥。即使使用框架進行數據庫交互,仍然需要執行其他驗證。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved