当前位置:首页 > PHP教程 > php应用 > 列表

如何在PHP中防止SQL注入

发布:smiling 来源: PHP粉丝网  添加日期:2020-01-07 15:38:57 浏览: 评论:0 

本篇文章将给大家介绍关于PHP中的SQL注入以及使用PHP-MySQLi和PHP-PDO驱动程序防止SQL注入的方法。下面我们来看具体的内容。

简单的SQL注入示例:

例如,A有一个银行网站。已为银行客户提供了一个网络界面,以查看其帐号和余额。您的银行网站使用http://example.com/get_account_details.php?account_id=102等网址从数据库中提取详细信息。

例如,get_account_details.php的代码如下所示。

$accountId = $_GET['account_id'];

$query = "SELECT accountNumber, balance FROM accounts WHERE accountId = $accountId";

客户accountId通过查询字符串作为account_id传递。与上面的Url一样,如果用户的帐户ID为102并且它在查询字符串中传递。Php脚本将创建如下所示的查询。

$query = "SELECT accountNumber, balance FROM accounts WHERE accountId = 102";

accountId 102获取accountNumber和余额详细信息,并提供给客户。

我们假设另一个场景,智能客户已经通过了account_id,就像0 OR 1=1查询字符串一样。现在会发生什么?PHP脚本将创建如下所示的查询并在数据库上执行。

$query = "SELECT accountNumber, balance FROM accounts WHERE accountId = 0 OR 1=1";

查看由脚本和数据库返回的结果创建的查询。您可以看到此查询返回了所有帐号和可用余额。

这称为SQL注入。这是一个简单的方式,其实可以有很多方法来进行SQL注入。下面我们就来看一下如何使用PHP MySQLi驱动程序和PHP PDO驱动程序防止SQL注入。

使用PHP-MySQLi驱动程序:

可以使用PHP-MySQLi驱动程序预处理语句来避免这些类型的SQL注入。

PHP防止SQL注入的代码如下:

  1. $accountId = $_GET['account_id']; 
  2.  
  3. if ($stmt = $mysqli->prepare('SELECT accountNumber, balance FROM accounts WHERE accountId = ?')) { 
  4.  
  5.     $stmt->bind_param("s"$accountId); 
  6.  
  7.     $stmt->execute(); 
  8.  
  9.  $result = $stmt->get_result(); 
  10.  
  11.  while ($row = $result->fetch_assoc()) { 
  12.  
  13.  // do something here 
  14. //phpfensi.com 
  15.  } 
  16.  
  17.     $stmt->close();  

使用PHP-PDO驱动程序:

可以使用PHP-PDO驱动程序prepare语句来避免这些类型的SQL注入。

PHP解决上面的SQL注入问题的代码如下:

  1. $accountId = $_GET['account_id'];  
  2.  
  3. if ($stmt = $pdo->prepare('SELECT accountNumber, balance FROM accounts WHERE accountId = :accountId')) { 
  4.  
  5.     $stmt->execute(array('name' => $name)); 
  6.  
  7.  foreach ($stmt as $row) { 
  8.  
  9.  // do something here 
  10.  
  11.  } 
  12.  
  13.   //phpfensi.com 
  14.  
  15.     $stmt->close();  
  16.  

Tags: SQL注入

分享到: