PHP保护数据库的具体代码示例
创始人
2024-06-12 14:01:43
0

因为数据库管理不善导致数据丢失,为自己带来损失的例子不再少数。我们这次就要讲到PHP保护数据库的相关操作代码,为你的数据库保驾护航。美国某个州的狱政局在查询字符串中使用了 SQL 列名,因此泄露了保密数据。这次泄露允许恶意用户选择需要显示的列、提交页面并获得数据。这次泄露显示了用户如何能够以应用程序开发人员无法预料的方法执行输入,并表明了防御 SQL 注入攻击的必要性。

#t#下面代码显示了运行 SQL 语句的示例脚本。在本例中,SQL 语句是允许相同攻击的动态语句。此表单的所有者可能认为表单是安全的,因为他们已经把列名限定为选择列表。但是,代码疏忽了关于表单欺骗的最后一个习惯 — 代码将选项限定为下拉框并不意味着其他人不能够发布含有所需内容的表单(包括星号 [*])。

  1.    
  2.    
  3. </FONT></STRONG>SQL Injection Example<STRONG><FONT color=#006699>   
  4.    
  5.    
  6.  id="myFrom" action=""   
  7.     method="post">   
  8.  type="text" name="account_number"   
  9.     value=" echo(isset($_POST['account_number']) ?    
  10.         $_POST['account_number'] : ''); ?>/>   
  11.  name="col">   
  12.  value="account_number">Account Number   
  13.  value="name">Name   
  14.  value="address">Address   
  15.    
  16.  type="submit" value="Save" name="submit" />
   
  •    
  •    
  • if ($_POST['submit'] == 'Save') {   
  •     /* do the form processing */   
  •     $link = mysql_connect('hostname', 'user', 'password') or    
  •         die ('Could not connect' . mysql_error());   
  •     mysql_select_db('test', $link);   
  •            
  •         $col = $_POST['col'];   
  •  
  •     $select = "SELECT " . $col . " FROM account_data WHERE account_number = "    
  •         . $_POST['account_number'] . ";" ;   
  •     echo '

    ' . $select . '

    ';   
  •  
  •     $result = mysql_query($select) or die('

    ' . mysql_error() . '

    ');   
  •  
  •     echo '';   
  •     while ($row = mysql_fetch_assoc($result)) {   
  •         echo '
  • ';   
  •         echo '
  • ';   
  •         echo '
  • ';   
  •     }   
  •     echo '
  • ' . $row[$col] . '
    ';   
  •  
  •     mysql_close($link);   
  • }   
  • ?>   
  •    
  •   
  • 因此,要形成PHP保护数据库的习惯,请尽可能避免使用动态 SQL 代码。如果无法避免动态 SQL 代码,请不要对列直接使用输入。下面则显示了除使用静态列外,还可以向帐户编号字段添加简单验证例程以确保输入值不是非数字值。

    1.    
    2.    
    3. </FONT></STRONG>SQL Injection Example<STRONG><FONT color=#006699>   
    4.    
    5.    
    6.  id="myFrom" action=""   
    7.     method="post">   
    8.  type="text" name="account_number"   
    9.     value=" echo(isset($_POST['account_number']) ?    
    10.         $_POST['account_number'] : ''); ?>/>  type="submit"   
    11.     value="Save" name="submit" />
       
  •    
  •    
  • function isValidAccountNumber($number)    
  • {   
  •     return is_numeric($number);   
  • }   
  • if ($_POST['submit'] == 'Save') {   
  •  
  •     /* Remember habit #1--validate your data! */   
  •     if (isset($_POST['account_number']) &   
  •     isValidAccountNumber($_POST['account_number'])) {   
  •  
  •         /* do the form processing */   
  •         $link = mysql_connect('hostname', 'user', 'password') or   
  •         die ('Could not connect' . mysql_error());   
  •         mysql_select_db('test', $link);   
  •  
  •         $select = sprintf("SELECT account_number, name, address " .   
  •         " FROM account_data WHERE account_number = %s;",   
  •         mysql_real_escape_string($_POST['account_number']));   
  •         echo '

    ' . $select . '

    ';   
  •         $result = mysql_query($select) or die('

    ' . mysql_error() . '

    ');   
  •  
  •         echo '';   
  •         while ($row = mysql_fetch_assoc($result)) {   
  •             echo '
  • ';   
  •             echo '
  • ';   
  •             echo '
  • ';   
  •             echo '
  • ';   
  •             echo '
  • ';   
  •         }   
  •         echo '
  • ' . $row['account_number'] . '' . $row['name'] . '' . $row['address'] . '
    ';   
  •  
  •         mysql_close($link);   
  •     } else {   
  •         echo " style=\"font-color:red\">" .   
  •     "Please supply a valid account number!";   
  •  
  •     }   
  • }   
  • ?>   
  •    
  •    
  • 在这次PHP保护数据库的例子中还展示了 mysql_real_escape_string() 函数的用法。此函数将正确地过滤您的输入,因此它不包括无效字符。如果您一直依赖于 magic_quotes_gpc,那么需要注意它已被弃用并且将在 PHP V6 中删除。从现在开始应避免使用它并在此情况下编写安全的 PHP 应用程序。此外,如果使用的是 ISP,则有可能您的 ISP 没有启用 magic_quotes_gpc。

    最后,在改进的PHP保护数据库示例中,您可以看到该 SQL 语句和输出没有包括动态列选项。使用这种方法,如果把列添加到稍后含有不同信息的表中,则可以输出这些列。如果要使用框架以与数据库结合使用,则您的框架可能已经为您执行了 SQL 验证。确保查阅文档以保证框架的安全性;如果仍然不确定,请进行验证以确保稳妥。即使使用框架进行数据库交互,仍然需要执行其他验证。

    相关内容

    热门资讯

    如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
    如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
    施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
    20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
    德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
    为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
    《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
    2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...