iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP的预处理查询如何防止SQL注入
  • 825
分享到

PHP的预处理查询如何防止SQL注入

2023-07-05 10:07:38 825人浏览 薄情痞子
摘要

这篇文章主要讲解了“PHP的预处理查询如何防止sql注入”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php的预处理查询如何防止SQL注入”吧!PHP的预处理查询是如何防止SQL注入的?目前

这篇文章主要讲解了“PHP的预处理查询如何防止sql注入”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php的预处理查询如何防止SQL注入”吧!

PHP的预处理查询是如何防止SQL注入的?

目前最有效的防止 sql 注入的方式使用预处理语句和参数化查询。

以最常用的 PHP PDO 扩展为例。

官方文档中对预处理语句的介绍

什么是预处理语句?

可以把它看作是想要运行的 SQL 的一种编译过的模板,它可以使用变量参数进行定制。

预处理语句的两大好处:

1;查询仅需解析(或预处理)一次,但可以用相同或不同的参数执行多次。当查询准备好后,数据库将分析、编译和优化执行该查询的计划。对于复杂的查询,此过程要花费较长的时间,如果需要以不同参数多次重复相同的查询,那么该过程将大大降低应用程序的速度。通过使用预处理语句,可以避免重复分析 / 编译 / 优化周期。简言之,预处理语句占用更少的资源,因而运行得更快。

提供给预处理语句的参数不需要用引号括起来,驱动程序会自动处理。如果应用程序只使用预处理语句,可以确保不会发生 SQL 注入。(然而,如果查询的其他部分是由未转义的输入来构建的,则仍存在 SQL 注入的风险)。

PDO 的特性在于驱动程序不支持预处理的时候,PDO 将模拟处理,此时的预处理-参数化查询过程在 PDO 的模拟器中完成。PDO 模拟器根据 DSN 中指定的字符集对输入参数进行本地转义,然后拼接成完整的 SQL 语句,发送给 MySQL 服务端。

所以,PDO 模拟器能否正确的转义输入参数,是拦截 SQL 注入的关键。

小于 5.3.6 的 PHP 版本,DSN (Data Source Name) 是默认忽略 charset 参数的。这时如果使用 PDO 的本地转义,仍然可能导致 SQL 注入。

因此,像 Laravel 框架底层会直接设置 PDO::ATTR_EMULATE_PREPARES=false,来确保 SQL 语句和参数值在被发送到 Mysql 服务器之前不会被 PHP 解析。

PHP 的实现

// 查询$calories = 150;$colour = 'red';  $sth = $dbh->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour');  $sth->bindValue(':calories', $calories, PDO::PARAM_INT);  $sth->bindValue(':colour', $colour, PDO::PARAM_STR);  $sth->execute();
// 插入,修改,删除$preparedStmt = $db->prepare('INSERT INTO table (column) VALUES (:column)');$preparedStmt->execute(array(':column' => $unsafeValue));

Laravel 的底层实现

// 查询的实现public function select($query, $bindings = [], $useReadPdo = true){    return $this->run($query, $bindings, function ($query, $bindings) use ($useReadPdo) {        if ($this->pretending()) {                return [];        }        $statement = $this->prepared(                $this->getPdoForSelect($useReadPdo)->prepare($query)        );        $this->bindValues($statement, $this->prepareBindings($bindings));        $statement->execute();        return $statement->fetchAll();    });}// 修改删除的实现public function affectingStatement($query, $bindings = []){    return $this->run($query, $bindings, function ($query, $bindings) {        if ($this->pretending()) {                return 0;        }        $statement = $this->getPdo()->prepare($query);        $this->bindValues($statement, $this->prepareBindings($bindings));        $statement->execute();        $this->recordsHaveBeenModified(                ($count = $statement->rowCount()) > 0        );        return $count;    });}

感谢各位的阅读,以上就是“PHP的预处理查询如何防止SQL注入”的内容了,经过本文的学习后,相信大家对PHP的预处理查询如何防止SQL注入这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: PHP的预处理查询如何防止SQL注入

本文链接: https://www.lsjlt.com/news/351330.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP的预处理查询如何防止SQL注入
    这篇文章主要讲解了“PHP的预处理查询如何防止SQL注入”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP的预处理查询如何防止SQL注入”吧!PHP的预处理查询是如何防止SQL注入的?目前...
    99+
    2023-07-05
  • 一文解析PHP的预处理查询怎么防止SQL注入
    本篇文章给大家带来了关于php的相关知识,其中主要跟大家聊一聊什么是预处理语句?PHP的预处理查询是如何防止SQL注入的?感兴趣的朋友下面一起来看一下吧,希望对大家有帮助。PHP的预处理查询是如何防止SQL注入的?目前最有效的防止 sql ...
    99+
    2023-05-14
    SQL注入 php
  • mysql预处理如何防止sql注入
    mysql预处理防止sql注入的方法:预处理的语法://发送一条sql给mysql服务器,mysql服务器会解析这条sql  $pdo->prepare('select * from b...
    99+
    2024-04-02
  • 参数化sql查询如何防止sql注入
    使用参数化查询语句进行查询的示例:string Account =Request.Form["Account"]; string sql = "select id,Name,Account from User where...
    99+
    2024-04-02
  • mybatis模糊查询如何防止sql注入
    mybatis模糊查询防止sql注入的方法:bind + #{}模糊查询可以防止SQL注入,bind元素可以从OGNL表达式中创建一个变量并将其绑定到上下文,例如:<select id="selectBl...
    99+
    2024-04-02
  • PHP中如何使用预处理语句防止SQL注入攻击?
    php 中使用预处理语句可以有效防御 sql 注入攻击。预处理语句通过允许在执行查询之前定义查询参数,从而阻止攻击者插入恶意字符串。它具有更高的安全性、更好的性能和易于使用的优点。 P...
    99+
    2024-05-06
    mysql 防止sql注入 php脚本
  • php如何预防sql注入漏洞
    php预防sql注入漏洞的方法:利用magic_quotes_gpc指令或它的搭挡addslashes()函数进行过滤,例如:<php//php防注入和XSS攻击通用过滤$_GET    &nb...
    99+
    2024-04-02
  • php框架中如何防止sql注入
    php框架中防止sql注入的方法:在php.ini配置文件中打开php的安全模式,例如:safe_mode = on当safe_mode打开时,将safe_mode_gid关闭,例如:safe_mode_gid = off在安全模式下指定要...
    99+
    2024-04-02
  • hibernate的SQL如何防止注入
    hibernate防止SQL注入的方法:使用named parameter方法(在查询字符串中使用:),例如:usernameString//前台输入的用户名passwordString//前台输入的密码//hql语句String quer...
    99+
    2024-04-02
  • oracle如何防止sql注入
    oracle防止sql注入的方法:oracle中的DBMS_ASSERT包中包含了相关的函数,将传入的参数进行检查,若不符合相关规则,那sql语句执行会报错,从而达到防止sql注入的风险,例如:ENQUOTE_LITERAL:输入字符串,并...
    99+
    2024-04-02
  • nodejs如何防止sql注入
    nodejs防止sql注入的方法:使用escape()对传入参数进行编码,例如:var userId = 1, name = 'test';var query = connection.query('SELECT * FROM us...
    99+
    2024-04-02
  • spring如何防止sql注入
    spring防止sql注入的方法:可以通过编写一个webFilter过滤器来防止sql注入,例如:@Component@WebFilter(urlPatterns = ")|" +"(\\b(select|update|and|or|del...
    99+
    2024-04-02
  • tp5如何防止sql注入
    tp5防止sql注入的方法:在application/config.php中设置全局的过滤规则,如:// 默认全局过滤方法 用逗号分隔多个'default_filter' => 'htmlspecialchars,addslashes,st...
    99+
    2024-04-02
  • like如何防止sql注入
    like防止sql注入的示例:在不同数据库下的用法不同,例如://mysql环境select * from test where school_name like concat('%',${name},'%')...
    99+
    2024-04-02
  • net如何防止sql注入
    net防止sql注入的方法:在直接处理SQL语句时,将传递的值进行参数化,然后在进行赋值,例如:cmd.CommandText = @"select count(*) from UserInfo where UserNa...
    99+
    2024-04-02
  • laravel如何防止sql注入
    laravel防止sql注入的方法:当你使用Eloquent查询时,如:User::where('name', $input_name)->first();因为Eloquent 内部使用的是PDO参数绑定,所以你的请求是安全的,使...
    99+
    2024-04-02
  • esapi如何防止sql注入
    esapi防止sql注入的方法:设置一个过滤器,代码示例:String sqlStr=“select name from tableA where id=”+  ESAPI.encoder().encodeForSQL(...
    99+
    2024-04-02
  • ef如何防止sql注入
    ef防止sql注入的示例:ef作为一个orm框架,本身放置了sql的注入,例如查询视图"select * from VM where 条件 = {0}"时的方法:function bool&...
    99+
    2024-04-02
  • ssh如何防止sql注入
    ssh防止sql注入的方法:在对应的web文件中添加以下代码:<filter>    <filter-name>httpHeaderSecurity</filter-na...
    99+
    2024-04-02
  • beego如何防止sql注入
    beego框架里的Raw函数使用了占位符,并且beego是经过mysql的数据库驱动封装打包后再传到mysql中的,这个过程中已经实现了防止SQL注入,因此不再存在SQL注入的危险。...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作