如何避免SQL注入风险?PHP PDO扩展的prepare方法详解及获取IT学习视频教程

想要获得完整的学习视频教程(包括更多IT学习视频)的学生可以添加QQ2084533608并在加入时填写验证信息:学习

如何避免SQL注入风险?PHP PDO扩展的prepare方法详解及获取IT学习视频教程

编辑推出了另一个微信公共帐户“工作面试助理”,该帐户为您提供面试技巧,面试问题,面试经验等,并与您分享。学生可以长时间按下并确定要遵循的QR码。

当我们使用传统的MySQL_Connect和MySQL_QUERY方法连接到查询数据库时,如果过滤不严格,则有SQL注入的风险,从而导致网站受到攻击并丢失控制。尽管MySQL_REAL_ESCAPE_STRING()函数可用于过滤用户的提交值,但也存在缺陷。使用PHP的PDO扩展准备方法可以避免SQL注入的风险。

PDO(PHP数据对象)是PHP5添加的一项新功能,因为在PHP 5之前,PHP4/PHP3是一堆数据库扩展程序,用于连接和处理每个数据库,例如PHP_MYSQL.DLL。 PHP6还将使用PDO默认连接,并且MySQL扩展名将用作助手。

1。PDO配置

在使用PDO扩展程序之前,必须启用此扩展名。在php.ini中,删除“;” “扩展= p​​hp_pdo.dll”之前的数字。要连接到数据库,您还需要删除“;”;在与PDO相关的数据库扩展程序之前。 (通常使用php_pdo_mysql.dll),然后重新启动Apache服务器。

扩展= p​​hp_pdo.dll

扩展= p​​hp_pdo_mysql.dll

2。PDO连接到MySQL数据库

$ dbh = new PDO(“ mysql:host = localhost; dbname = db_demo”,“ root”,“ passwork”);

默认值不是很长的连接。要在数据库中使用长连接,您需要在结尾添加以下参数:

$ dbh = new PDO(“ mysql:host = localhost; dbname = db_demo”,“ root”,“ password”,“ array(pdo :: attry :: attr_persistent => true)”);

$ dbh = null; //(发布)

3。PDO设置属性

1)有三种方法可以处理PDO中的错误:

•PDO :: errmode_silent不显示错误消息,仅设置了错误代码

•PDO :: errmode_warning显示警告错误

•PDO :: errmode_exception引发异常

以下语句可用于设置错误处理方法以抛出异常

$ db-> setAttribute(pdo :: attr_errmode,pdo :: errmode_exception);

将设置为pdo :: errmode_silent时,您可以通过调用errorcode()获得errorcode()或errorInfo(),在其他情况下,也可以获取。

2)由于不同的数据库处理返回字段名称的不同情况,因此PDO提供PDO :: attr_case设置项目(包括pdo :: case_lower,pdo :: case_natural,pdo :: case_upper)来确定返回的字段名称。上和下情况。

3)通过设置PDO :: attr_oracle_nulls type(包括pdo :: null_natural,pdo :: null_empty_string,pdo :: null_to_to_string),指定PHP中数据库返回的空值的相应值。

4。PDO的常见方法和应用

PDO :: query()主要用于记录结果和返回的操作,尤其是选择操作。

PDO :: exec()主要用于未经结果集返回的操作,例如插入,更新等。

PDO :: prepar()主要是预处理操作。它要求$ rs-> execute()在预处理中执行SQL语句。该方法可以绑定参数并具有相对功能强大的功能(这取决于这是为了防止SQL注入)

pdo :: lastinsertid()返回最后一个插入操作,主要密钥列类型是自我内存的最后一个自我内置ID

pdostatement :: fetch()用于获取记录

pdostatement :: fetchall()是将所有记录放入集合中

pdostatement :: fetchcolumn()是通过获得结果指定第一个记录的字段。默认值是第一个字段。

pdostatement :: rowcount():它主要用于pdo :: query()和pdo :: po pdo :: progence()的删除,插入和更新操作的结果集,对于pdo :: exec(exec()方法是无效的并选择操作。

5。PDO操作MySQL数据库实例

统计数据有多少行数据

$ sql =“从测试中选择计数(*)”;

$ num = $ dbh->查询($ sql) - > fetchColumn();

准备方法

$ stmt = $ dbh->准备(“从测试中选择 *”);

如果($ stmt-> execute()){

while($ row = $ stmt-> fetch()){

print_r($ row);

准备参数化查询

$ stmt = $ dbh->准备(“从test where name =?”中选择 *);

如果($ stmt-> execute(array(“ david”))){

while($ row = $ stmt-> fetch(pdo :: fetch_assoc)){

print_r($ row);

如何防止SQL注入

使用PDO访问MySQL数据库时,默认情况下不使用真实准备的语句。要解决此问题,您必须禁用准备的陈述的仿真效果。这是使用PDO创建链接的示例:

$ dbh = new PDO('mySQL:dbname = dbtest; host = 127.0.0.1; charset = utf8','user','pass');

$ dbh-> setAttribute(pdo :: attr_emulate_prepares,false);

LINE setAttribute()是强制性的,该行告诉PDO禁用模拟预处理语句并使用真实的eprepared语句。这样可以确保在传递给MySQL Server之前,PHP不会对SQL语句和相应的值(禁止所有可能的恶意SQL注入攻击)解析。尽管您可以在配置文件(charset = utf8)中设置字符集属性,但应注意的是,旧版本的php(<5.3.6)忽略了DSN中的字符参数。

让我们看一个完整的代码用法示例:

$ dbh = new PDO(“ mysql:host = localhost; dbname = demo”,“ user”,“ pass”);

$ dbh-> setAttribute(pdo :: attr_emulate_prepares,false); //禁用准备陈述的仿真效果

$ dbh-> exec(“设置名称'utf8'”);

$ sql =“从测试中选择 * name =?and password =?”;

$ stmt = $ dbh->准备($ sql);

$ exeres = $ stmt-> execute(array($ testName,$ pass));

如果($ everes){

while($ row = $ stmt-> fetch(pdo :: fetch_assoc)){

print_r($ row);

$ dbh = null;

上述代码可以防止SQL注入。为什么?

当调用Prepary()时,查询语句已发送到数据库服务器。目前,只有占位符?将其发送给,没有用户提交的数据;当调用execute()时,用户提交的值将传输到数据库,它们分别传输,两者是独立的,而SQL攻击者没有机会。

但是我们需要注意以下情况。 PDO无法帮助您防止SQL注入

1。你不能让占位符吗?而不是一组值,例如:

从博客中选择 *在(?)中的userId;

2。您不能让占位符替换数据表名称或列名称,例如:

从博客订单中选择 *?

3。你不能让占位符?而不是任何其他SQL语法,例如:

从blog中选择extract(?从dateTime_column)作为variable_datetime_element;

你可能想看:
« 上一篇
下一篇 »

相关推荐

php实时推送,php实地培训

2026年10月05日

52阅读

php乱码出现问号的原因,php乱码出现问号的原因有哪些

2026年10月05日

44阅读

php一句话木马,一句话木马ctf

2026年10月05日

47阅读

php获取数组长度,php中如何获取数组的长度

2026年10月05日

48阅读

php面试题库及答案,php程序员面试真题库

2026年10月05日

46阅读

phpcontent-type修改,php源码二次修改需要多少钱

2026年10月05日

42阅读