PHP的查询处理怎么防止SQL注入(php的查询处理怎么防止sql注入乱码)

admin651156年前2条评论

一淘模板(56admin.com)给人人带来了对于于php的相干知识,其中主要跟人人聊一聊甚么是预解决语句?PHP的预解决盘问是怎样防范SQL注入的?感兴趣的朋侪下面一起来看一下吧,对于人人有帮助。

PHP的查询处理怎么防止SQL注入(php的查询处理怎么防止sql注入乱码) 技术教程

PHP的预解决盘问是怎样防范SQL注入的?

现在最实用的防范sql注入的形式应用预解决语句以及参数化盘问。

以最罕用的PHPPDO扩年夜为例。

民间文档中对于预解决语句的介绍

甚么是预解决语句?

能够把它看做是想要运行的SQL的一种编译过的模板,它能够应用变量参数停止定制。

预解决语句的两年夜好处:

1;盘问仅需剖析(或者预解决)一次,但能够用相同或者分比方的参数实行屡次。当盘问准备好后,数据库将剖析、编译以及优化实行该盘问的设想。对于简单的盘问,此进程要生产较长的时日,如果需要以分比方参数屡次重复相同的盘问,那末该进程将年夜年夜升高应用程序的速率。通过应用预解决语句,能够阻挠重复剖析/编译/优化周期。简言之,预解决语句占用更少的资本,因而运行患上更快。

2.提供应预解决语句的参数不需要用引号括起来,驱动程序会主动解决。如果应用程序只应用预解决语句,能够确保不会发生SQL注入。(然而,如果盘问的其余整体是由未转义的输入来构建的,则仍存在SQL注入的危险)。

PDO的特点在于驱动程序不反对于预解决的时刻,PDO将模拟解决,此时的预解决-参数化盘问进程在PDO的模拟器中实现。PDO模拟器依据DSN中指定的字符集对于输入参数停止内陆转义,而后拼接成完好的SQL语句,发送给MySQL效劳端。

以是,PDO模拟器是否准确的转义输入参数,是拦截SQL注入的症结。

小于5.3.6的PHP版本,DSN(DataSourceName)是默认马虎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 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;});}

 

你可能想看:

本文链接:https://addon.ciliseo.com/php-de-zha-xun-chu-li-zen-me-fang-zhi-sql-zhu-ru.html

SQL注入PHPSQL语句参数过程模拟器底层驱动程序应用程序如何防止模板不同

网友评论

  • 2025-03-0210:44:15

    模拟器,实用之选体验千般游戏世界。

  • 2025-03-0417:40:12

    模拟器高度逼真,满足各行业体验需求。

扫一扫二维码添加客服微信

关于我们建站招商建站服务