多数大学生出来选择的工作和专业无关
首页 > 专业知识

PHP保护数据库的具体代码示例

时间:2018-03-17 16:35:21 [来源]:郑州PHP培训学校

   PHP保护数据库的具体代码示例

  我们要习惯于PHP保护数据库,而尽量去少用动态的SQL代码,并且不要对列直接使用输入,使用这种方法可以确保查阅文档以保证框架的安全性等。
  因为数据库管理不善导致数据丢失,为自己带来损失的例子不再少数。我们这次就要讲到PHP保护数据库的相关操作代码,为你的数据库保驾护航。美国某个州的狱政局在查询字符串中使用了 SQL 列名,因此泄露了保密数据。这次泄露允许恶意用户选择需要显示的列、提交页面并获得数据。这次泄露显示了用户如何能够以应用程序开发人员无法预料的方法执行输入,并表明了防御 SQL 注入攻击的必要性。
  下面代码显示了运行 SQL 语句的示例脚本。在本例中,SQL 语句是允许相同攻击的动态语句。此表单的所有者可能认为表单是安全的,因为他们已经把列名限定为选择列表。但是,代码疏忽了关于表单欺骗的最后一个习惯 — 代码将选项限定为下拉框并不意味着其他人不能够发布含有所需内容的表单(包括星号 [*])。
  <html>
  <head>
  <title>SQL Injection Example</title>
  </head>
  <body>
  <form id="myFrom" action="<?php echo $_SERVER['PHP_SELF']; ?>"method="post">
  <div><input type="text" name="account_number"value="<?php echo(isset($_POST['account_number']) ?
  $_POST['account_number'] : ''); ?>" />
  <select name="col">
  <option value="account_number">Account Number</option>
  <option value="name">Name</option>
  <option value="address">Address</option>
  </select>
  <input type="submit" value="Save" name="submit" /></div>
  </form>
  <?php
  if ($_POST['submit'] == 'Save') {
  /* do the form processing */
  $link = mysql_connect('hostname', 'user', 'password') ordie ('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 '<p>' . $select . '</p>';
  $result = mysql_query($select) or die('<p>' . mysql_error() . '</p>');echo '<table>';
  while ($row = mysql_fetch_assoc($result)) {echo '<tr>';
  echo '<td>' . $row[$col] . '</td>';
  echo '</tr>';
  }
  echo '</table>';
  mysql_close($link);
  }
  ?>
  </body>
  </html>
  因此,要形成PHP保护数据库的习惯,请尽可能避免使用动态 SQL 代码。如果无法避免动态 SQL 代码,请不要对列直接使用输入。下面则显示了除使用静态列外,还可以向帐户编号字段添加简单验证例程以确保输入值不是非数字值。
  PHP保护文件系统的具体代码分享
  PHP保护文件系统是非常凑效的。我们在文章中使用了PHP站点示例,来帮助大家解决文件系统的保护问题,增加PHP的经验积累。
  文件系统对于任何一个站点来说都是相当重要的,程序员们都在不遗余力的保护着自己的系统不受侵犯。今天我们就为大家讲解了PHP保护文件系统的具体代码示例。曾经有一个 Web 站点泄露了保存在 Web 服务器的文件中的客户数据。该 Web 站点的一个访问者使用 URL 查看了包含数据的文件。虽然文件被放错了位置,但是这个例子强调了针对攻击者保护文件系统的重要性。
  如果 PHP 应用程序对文件进行了任意处理并且含有用户可以输入的变量数据,请仔细检查用户输入以确保用户无法对文件系统执行任何不恰当的操作。清单 1 显示了下载具有指定名的图像的 PHP 站点示例。
  <?php
  if ($_POST['submit'] == 'Download') {
  $file = $_POST['fileName'];
  header("Content-Type: application/x-octet-stream");header("Content-Transfer-Encoding: binary");header("Content-Disposition: attachment; filename=\"" . $file . "\";" );$fh = fopen($file, 'r');
  while (! feof($fh))
  {
  echo(fread($fh, 1024));
  }
  fclose($fh);
  } else {
  echo("<html><head><");
  echo("title>Guard your filesystem</title></head>");echo("<body><form id=\"myFrom\" action=\"" . $_SERVER['PHP_SELF'] .
  "\" method=\"post\">");
  echo("<div><input type=\"text\" name=\"fileName\" value=\"");echo(isset($_REQUEST['fileName']) ? $_REQUEST['fileName'] : '');echo("\" />");
  echo("<input type=\"submit\" value=\"Download\" name=\"submit\" /></div>");echo("</form></body></html>");
  }
  正如您所见,清单 1 中比较危险的脚本将处理 Web 服务器拥有读取权限的所有文件,包括会话目录中的文件(请参阅 “保护会话数据”),甚至还包括一些系统文件(例如 /etc/passwd)。为了进行PHP保护文件系统演示,这个示例使用了一个可供用户键入文件名的文本框,但是可以在查询字符串中轻松地提供文件名。
  同时配置用户输入和文件系统访问权十分危险,因此最好把应用程序设计为使用数据库和隐藏生成的文件名来避免同时配置。但是,这样做并不总是有效。清单 2 提供了验证文件名的示例例程。它将使用正则表达式以确保文件名中仅使用有效字符,并且特别检查圆点字符:..。
  function isValidFileName($file) {
  /* don't allow .. and allow any "word" character \ / */return preg_match('/^(((?:\.)(?!\.))|\w)+$/', $file);}
  以上就是本文为大家分享的PHP保护文件系统的具体代码编写。
  使用Zend框架实现PHP文件上传
  本文将向读者详细介绍如何使用流行的Zend框架来创建我们自己的文件上传机制,该机制能够轻而易举地接收、确认和处理要上传的文件。
  Zend Framework是流行的PHP开发框架,使用Zend框架,能够方便快捷的实现各项常用功能。这里向你介绍使用Zend框架来创建文件上传功能,该机制能够轻而易举地接收、确认和处理要上传的文件。
  一、简介
  无论是管理YouTube上的视频、在SlideShare上共享PowerPoint演示文稿,还是使用开源电子商务平台Magento更新在线商店中的商品图像,我们都有用到基于web的文件上传功能。但是,这个功能到底是如何工作的呢?文件是如何从本地机器传送到远程服务器的?本文将向读者详细介绍如何使用流行的Zend框架来创建我们自己的PHP文件上传机制,该机制能够轻而易举地接收、确认和处理要上传的文件。
  二、配置处理文件上载的PHP
  PHP本身能够通过Web表单来完成文件上载,不过无论使用标准PHP代码还是使用Zend框架来管理文件上传,都有必要花一些时间来检测直接影响PHP的有关功能的配置伪指令,这些指令包括:
  ◆file_uploads:这个伪指令启用PHP的文件上载功能。在默认情形下,这个伪指令会被启用。
  ◆upload_max_filesize:这个伪指令定义了要上载的文件的最大尺寸。在默认情形下,这个伪指令被设置为2M。
  ◆upload_tmp_dir:这个伪指令定义了PHP临时存储要上传的文件的目录,文件在传入最终目的地之前将临时存放于此,该目录是由开发人员指定的。在默认情形下,这个伪指令不会赋值,这意味着PHP将使用系统的默认值,举例来说,许多linux发行版中的临时目录为/tmp。
  ◆post_max_size:设定POST 数据所允许的最大大小。php默认的post_max_size 为2M。
  ◆max_execution_time:虽然与文件上载的关系不是非常密切,但是这个伪指令在PHP的文件上载功能中却扮演了一个重要角色,因为它定义了PHP脚本的执行时间。对于尺寸特别大的文件来说,可能需要很长的时间才能传输到文件服务器,所以可以考虑将这个伪指令的默认值即30秒改为60乃至90秒。
  三、创建文件上载表单
  下面我们将创建一个Web表单示例,它能够用来浏览本地计算机的文件系统以及确定要上传的文件。我们将尽力使该示例保持简单,创建的文件上载表单的外观如图1所示。
  PHP文件上传表单
  这个表单的创建方式跟我们之前创建的其他表单大同小异,只是有一些轻微的区别。用于创建这个表单的HTML代码如清单1所示。按照Zend框架的惯例,我们将这个表单放入名为upload.phtml的视图中,它是名为admin的控制器中动作upload的一部分。
  <form enctype="multipart/form-data" method="post" action="/admin/upload">
  <p>
  What file would you like to upload?<br />
  <input type="file" name="video-upload" size="40" />
  p>
  <p>
  <input type="submit" name="submit" class="submit" value="Upload Video" />
  p>
  form>
  在这个表单中,有两处代码需要格外注意:
  enctype="multipart/form-data":当我们使用Web表单发送大量的二进制数据的时候,就应该使用这个表单属性。因为诸如电子表格以及视频等文件中含有大量的二进制数据,所以创建文件上载表单时应该包含这个属性。
  <input type="file" name="video-upload" size="40" />
  实战PHP上传文件代码演示
  两种PHP上传文件大小限制解决方案
  简单快速PHP上传文件使用方法总结
  新手必看PHP上传文件进度全面揭秘
  大师笔记之PHP上传文件代码
  上面这个表单元素会创建允许用户在本地文件系统搜索要上传的文件的表单机制。当提交按钮被按下的时候,这个文件将被上传,并将其发送给表单动作所标识的脚本(本例中,为upload.php)做进一步的处理。
  如上所述,文件将被上传给表单的动作属性所标识的脚本。然而,除非该脚本对该文件做实际的处理,否则数据会被丢失。在下一节中,我们将介绍如何使用Zend框架的Zend_File_Transfer组件来处理上传的文件。
 

上一篇:PHP安全常识之验证数据类型步骤

下一篇:PHP系列学习之日期函数