如何防止 PHP 中的 SQL 注入?

如何防止 PHP 中的 SQL 注入


避免 SQL 注入攻击的正确方法,无论使用哪个数据库,都是将数据与 SQL 分离,这样数据就一直是数据,永远不会被 SQL 解析器解释为命令。可以使用格式正确的数据部分创建 SQL 语句,但如果您不完全理解细节,则应始终使用准备好的语句和参数化查询。这些是与任何参数分开发送到数据库服务器并由数据库服务器解析的 SQL 语句。这样攻击者就不可能注入恶意SQL。


文章来源地址https://www.toymoban.com/diary/php/278.html

基本上你有两种选择来实现这一目标:

1、使用 PDO对于任何受支持的数据库驱动程序):

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);

foreach ($stmt as $row) {
    // Do something with $row
}


2、使用 MySQLi(对于 MySQL):从 PHP 8.2+ 开始,我们可以使用 execute_query() 它以一种方法准备、绑定参数和执行 SQL 语句:

$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
 while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }

UP TO PHP8.1:

$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
 $stmt->bind_param('s', $name); // 's' specifies the variable type => 'string'
 $stmt->execute();
 $result = $stmt->get_result();
 while ($row = $result->fetch_assoc()) {
     // Do something with $row
 }

如果您要连接到 MySQL 以外的数据库,则可以参考特定于驱动程序的第二个选项(例如,pg_prepare() 对于pg_execute() PostgreSQL)。PDO 是通用选项。


正确设置连接

PDO

请注意,当使用PDO访问 MySQL 数据库时,默认情况下不使用真正的准备好的语句。要解决此问题,您必须禁用准备语句的模拟。使用PDO创建连接的示例是:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password');

$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

在上面的例子中,错误模式并不是绝对必要的,但建议添加它。这样,PDO 将通过抛出PDOException.

然而,强制的是第一setAttribute()行,它告诉 PDO 禁用模拟的准备语句并使用真正的准备语句。这可以确保语句和值在发送到 MySQL 服务器之前不会被 PHP 解析(让可能的攻击者没有机会注入恶意 SQL)。

尽管您可以在构造函数的选项中设置charset,但需要注意的是,“旧”版本的 PHP(5.3.6 之前)会默默地忽略DSN 中的字符集参数。

mysqli

对于 mysqli,我们必须遵循相同的例程:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); // error reporting
$dbConnection = new mysqli('127.0.0.1', 'username', 'password', 'test');
$dbConnection->set_charset('utf8mb4'); // charset

解释

您传递给的 SQL 语句prepare由数据库服务器解析和编译。通过指定参数(如上例所示的参数?或命名参数),您可以告诉数据库引擎您要过滤的位置。:name然后,当您调用 时execute,准备好的语句将与您指定的参数值结合起来。


这里重要的是参数值与编译的语句结合在一起,而不是 SQL 字符串。SQL 注入的工作原理是在脚本创建要发送到数据库的 SQL 时欺骗脚本包含恶意字符串。因此,通过将实际的 SQL 与参数分开发送,您可以限制最终出现意外结果的风险。


使用准备好的语句时发送的任何参数都将被视为字符串(尽管数据库引擎可能会进行一些优化,因此参数当然也可能最终为数字)。在上面的示例中,如果$name变量包含'Sarah'; DELETE FROM employees结果,则只需搜索字符串"'Sarah'; DELETE FROM employees",并且最终不会得到空表。


使用准备好的语句的另一个好处是,如果您在同一个会话中多次执行相同的语句,它只会被解析和编译一次,从而提高速度。


哦,既然您询问了如何进行插入,这里有一个示例(使用 PDO):

$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');

$preparedStatement->execute([ 'column' => $unsafeValue ]);

准备好的语句可以用于动态查询吗?

虽然您仍然可以对查询参数使用准备好的语句,但动态查询本身的结构无法参数化,并且某些查询功能也无法参数化。

对于这些特定场景,最好的办法是使用白名单过滤器来限制可能的值。

// Value whitelist
// $dir can only be 'DESC', otherwise it will be 'ASC'
if (empty($dir) || $dir !== 'DESC') {
    $dir = 'ASC';
 }



到此这篇关于如何防止 PHP 中的 SQL 注入?的文章就介绍到这了,更多相关内容可以在右上角搜索或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

原文地址:https://www.toymoban.com/diary/php/278.html

如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用
上一篇 2023年08月19日 16:46
下一篇 2023年08月19日 16:46

相关文章

  • PHP 安全:如何防止PHP中的SQL注入?

    SQL注入防护对于确保数据库的安全性和完整性至关重要。它涉及实施有效措施来阻止将未经授权的 SQL 代码注入应用程序的恶意尝试。开发人员可以利用输入验证和参数化查询等技术来清理用户输入,确保任何潜在的恶意代码都无害。此外,使用预准备语句和存储过程可以通

    2024年04月29日
    浏览(46)
  • PHP中如何防止SQL注入攻击?

    防止 SQL 注入攻击是 Web 应用程序安全性的一个关键方面。以下是一些在 PHP 中防止 SQL 注入攻击的常见做法: 使用预处理语句: 使用预处理语句和参数化查询可以有效防止 SQL 注入攻击。PHP 中的 PDO(PHP Data Objects)和 MySQLi(MySQL Improved)都支持预处理语句。 使用 PDO 示例:

    2024年02月04日
    浏览(62)
  • 【面试题11】PHP如何防止SQL注入

    本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题, 对标资深工程师/架构师序列 ,欢迎大家提前关注锁定。 SQL注入是一种针对应用程序的安全漏洞攻击,攻击者通过在Web表单输入恶意SQL语句来伪装成合法用户,进而获取服务器端数据库的

    2024年02月11日
    浏览(42)
  • .Net 全局过滤,防止SQL注入

    问题背景:由于公司需要整改的老系统的漏洞检查,而系统就是没有使用参数化SQL即拼接查询语句开发的程序,导致漏洞扫描出现大量SQL注入问题。 解决方法:最好的办法就是不写拼接SQL,改用参数化SQL,推荐新项目使用,老项目改起来比较麻烦,花费的时间也多,最后选择

    2024年01月18日
    浏览(48)
  • 确保你的数据库安全:如何防止SQL注入攻击

    最近,越来越多的组织和公司受到SQL注入攻击的困扰。这种攻击可以导致数据库中的敏感信息泄露,破坏数据完整性,甚至可能导致整个系统崩溃。如果您是一名数据库管理员或网站管理员,您需要了解如何保护您的数据库免受SQL注入攻击的威胁。在本文中,小德将介绍什么

    2024年02月02日
    浏览(53)
  • 金山终端安全系统V9.0 update_software_info_v2.php处SQL注入漏洞复现 [附POC]

    免责声明:请勿利用文章内的相关

    2024年02月03日
    浏览(58)
  • MySQL 安全及防止 SQL 注入攻击

    如果通过网页获取用户输入的数据并将其插入  MySQL  数据库,那么就有可能发生  SQL 注入攻击的安全问题 作为研发,有一条铁律需要记住,那就是 永远不要相信用户的数据,哪怕他一再承诺是安全的 SQL  注入,就是通过把  SQL  命令插入到  Web  表单递交或输入域名或页

    2024年02月02日
    浏览(59)
  • PHP常见的SQL防注入方法

    产生原因主要就是一些数据没有经过严格的验证,然后直接拼接 SQL 去查询。导致产生漏洞,比如: 因为没有对 $_GET[‘id’] 做数据类型验证,注入者可提交任何类型的数据,比如 \\\" and 1= 1 or \\\" 等不安全的数据。如果按照下面方式写,就安全一些。 把 id 转换成 int 类型,就可

    2024年02月07日
    浏览(42)
  • 加强Web应用程序安全:防止SQL注入

    数据库在Web应用程序中存储和组织数据时起着至关重要的作用,它是存储用户信息、内容和其他应用程序数据的中央存储库。而数据库实现了高效的数据检索、操作和管理,使Web应用程序能够向用户提供动态和个性化的内容。然而,数据库和网络应用程序之间的通信不畅可能

    2024年02月14日
    浏览(39)
  • SQL注入原理以及Spring Boot如何防止SQL注入(含详细示例代码)

    点击下载《SQL注入原理以及Spring Boot如何防止SQL注入(含详细示例代码)》 SQL注入是一种针对数据库的攻击技术,攻击者通过在应用程序的输入字段中插入或“注入”恶意的SQL代码,从而在数据库服务器上执行非授权的SQL查询。这种攻击可能导致数据泄露、数据篡改、甚至执

    2024年02月20日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包