www.adminn.cn
站长正能量分享网!

如何在PHP中防止SQL注入

AD:阿里云服务器企业会员更优惠 腾讯云香港,韩国免备案服务器1.8折优惠

本篇文章将给大家介绍关于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.  

模板优惠价: (点击购买)
版权声明:本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
文章名称:《如何在PHP中防止SQL注入》
文章链接:https://www.adminn.cn/news/7685.html
本站资源模板仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。2021.5月起,网站调整,暂不再分享免费模板。谢谢理解

Adminn.Cn 站长分享圈

帝国CMS精品模板腾讯云优惠券,代金券

2次开发,学习研究使用!扫码支付后联系QQ677123发货!

支付宝扫一扫打赏