自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

PHP保護(hù)數(shù)據(jù)庫的具體代碼示例

開發(fā) 后端
我們要習(xí)慣于PHP保護(hù)數(shù)據(jù)庫,而盡量去少用動態(tài)的SQL代碼,并且不要對列直接使用輸入,使用這種方法可以確保查閱文檔以保證框架的安全性等。

因?yàn)閿?shù)據(jù)庫管理不善導(dǎo)致數(shù)據(jù)丟失,為自己帶來損失的例子不再少數(shù)。我們這次就要講到PHP保護(hù)數(shù)據(jù)庫的相關(guān)操作代碼,為你的數(shù)據(jù)庫保駕護(hù)航。美國某個州的獄政局在查詢字符串中使用了 SQL 列名,因此泄露了保密數(shù)據(jù)。這次泄露允許惡意用戶選擇需要顯示的列、提交頁面并獲得數(shù)據(jù)。這次泄露顯示了用戶如何能夠以應(yīng)用程序開發(fā)人員無法預(yù)料的方法執(zhí)行輸入,并表明了防御 SQL 注入攻擊的必要性。

#t#下面代碼顯示了運(yùn)行 SQL 語句的示例腳本。在本例中,SQL 語句是允許相同攻擊的動態(tài)語句。此表單的所有者可能認(rèn)為表單是安全的,因?yàn)樗麄円呀?jīng)把列名限定為選擇列表。但是,代碼疏忽了關(guān)于表單欺騙的最后一個習(xí)慣 — 代碼將選項(xiàng)限定為下拉框并不意味著其他人不能夠發(fā)布含有所需內(nèi)容的表單(包括星號 [*])。

  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保護(hù)數(shù)據(jù)庫的習(xí)慣,請盡可能避免使用動態(tài) SQL 代碼。如果無法避免動態(tài) SQL 代碼,請不要對列直接使用輸入。下面則顯示了除使用靜態(tài)列外,還可以向帳戶編號字段添加簡單驗(yàn)證例程以確保輸入值不是非數(shù)字值。

  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保護(hù)數(shù)據(jù)庫的例子中還展示了 mysql_real_escape_string() 函數(shù)的用法。此函數(shù)將正確地過濾您的輸入,因此它不包括無效字符。如果您一直依賴于 magic_quotes_gpc,那么需要注意它已被棄用并且將在 PHP V6 中刪除。從現(xiàn)在開始應(yīng)避免使用它并在此情況下編寫安全的 PHP 應(yīng)用程序。此外,如果使用的是 ISP,則有可能您的 ISP 沒有啟用 magic_quotes_gpc。

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

責(zé)任編輯:曹凱 來源: CSDN
相關(guān)推薦

2009-12-03 13:34:04

PHP連接數(shù)據(jù)庫

2009-11-24 13:26:17

2009-12-01 14:33:06

PHP生成html文件

2009-11-30 17:02:13

PHP函數(shù)preg_m

2011-08-16 19:11:15

Oracle數(shù)據(jù)庫創(chuàng)建Schema

2011-08-09 17:24:21

SQL Server 數(shù)據(jù)庫日志

2010-05-27 10:10:00

連接MySQL數(shù)據(jù)庫

2011-08-16 16:37:40

Oracle數(shù)據(jù)庫樹形查詢根節(jié)點(diǎn)

2011-08-18 16:42:04

Oracle數(shù)據(jù)庫維護(hù)SQL代碼示例

2009-12-11 13:43:55

PHP獲得所有數(shù)據(jù)庫

2009-12-03 15:23:48

PHP建立和關(guān)閉數(shù)據(jù)庫

2009-11-26 16:49:27

PHP刪除數(shù)據(jù)庫表

2010-06-01 10:47:21

連接MySQL數(shù)據(jù)庫

2011-08-18 18:34:00

Oracle數(shù)據(jù)庫創(chuàng)建自增字段

2010-04-19 11:37:20

Oracle數(shù)據(jù)庫

2010-05-26 09:44:41

MySQL數(shù)據(jù)庫使用

2010-04-21 11:53:03

Oracle數(shù)據(jù)庫

2010-05-17 17:35:30

MySQL數(shù)據(jù)庫

2011-08-02 13:44:49

JSPJDBCSQL Server

2010-08-16 14:21:13

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號