首页 理论教育 MM插入方法及SQL注入防范实现

MM插入方法及SQL注入防范实现

时间:2023-10-29 理论教育 版权反馈
【摘要】:图5-40插入一条数据仔细研究前面的建表、插入程序,发现除了SQL语句不一样外,别的地方没有多大的不同。这句话用PDO的exec方法执行了插入一条SQL语句,将一个条目插入到表中。出错则报错,无错打印一些与插入项目相关的信息。通过这一数据绑定过程,实现了防止SQL注入。

MM插入方法及SQL注入防范实现

1.数据插入简单范例(插入一条数据insert.php)

建好库和表后,就可以往表中插入数据了。建立一个insert.php的文件,复制以下程序到文件中。

执行程序后,在Workbench里就可以看到s008q库中,表addresslist中插入了一条数据,如图5-40所示。

图5-40 插入一条数据

仔细研究前面的建表、插入程序,发现除了SQL语句不一样外,别的地方没有多大的不同。下面详细讲解每条语句的含义。

PDO的英文全称是PHP Data Object,它与MySQL数据连接的语句是这样的:

这条语句建立(实例化)了一个PDO对象,以此实现数据库连接。库类型可以是mysql,也可以是现在流行的很多种数据库mssql、sybase、sqlite、oracle,等等。

这里使用PDO的exec方法设置了字符编码为utf8编码。

这句话用PDO的exec方法执行了插入一条SQL语句,将一个条目插入到表中。

$conn = null;

关闭PDO对象。

简单的几句话就完成了数据库的连接,并插入了一条内容。

2.一次插入多条数据(insert1.php)

将insert语句改为:

可以同时插入多条数据。

3.在插入程序中加入错误判断(insert2.php)

在运行以上程序的时候,初学者难免会有错,我们发现往往有错的时候在浏览器会出现一个白屏,数据库里就是没有我们要插入的内容。这时候,我们特别希望程序能有个报错的功能。

为此,我们对程序进行了完善:

(1)连接数据库对象错误处理方法

PDO采用的是面向对象的方式来实现错误处理的。

所有的程序都放在try{……}当中,通过catch来捕捉错误、打印错误代码和错误信息。这是java等面向对象语言共同的错误异常处理方法。

模式名称:PDO::ATTR_ERRMODE;(www.xing528.com)

模式的值有三种:

PDO::ERRMODE_WARNING是警告;

PDO::ERRMODE_SILENT 为静默;

PDO::ERRMODE_EXCEPTION实现异常抛出异常及处理。

不加这句设置属性的话,相当于设置为PDO::ERRMODE_SILENT(静默),只有执行的方法出错时才会起作用,其他一些错误则不给提示。

在调式程序时,建议将属性设置为PDO::ERRMODE_EXCEPTION,当出错时抛出exceptions 异常,用try catch捕获错误,并输出错误信息:

正式运行的程序有的时候是将错误输出到错误日志中:

(2)执行SQL对象过程错误处理方法

如果不写“$conn->setAttribute(PDO::ATTR_ERRMODE, PDO:: ERRMODE_EXCEPTION );”这句话也可以用以下程序处理错误。

这段是SQL对象执行结果的判断和处理。出错则报错,无错打印一些与插入项目相关的信息。

本范例中与前面的另一个不同是,把原来的常量换成了变量,方便以后用户输入内容传值入库。

到此,对于前面建库、建表中我们不理解的语言全部讲完了。

4.PDO数据库连接程序的完善(预编译过程和方法)

黑客有时会用一个注入的方法向你的数据库中注入垃圾数据,以下的程序可以防止这种黑客的注入。

是个预编译的过程,它返回一个PDOstatement对象。在$SQL中有两个占位符:name、:address未赋值,是通过

$stmt->bindParam(':name', $Name, PDO::PARAM_STR);

$stmt->bindParam(':address', $Address, PDO::PARAM_INT);

给预编译的结果绑定数据的,在绑定过程中设置了参数的数据类型。

这种预处理的思路是把操作的代码与要操作的数据分离开,用PDO->prepare()把操作的代码预编译,然后用预编译后返回的PDOstatement对象的bindParam()绑定数据,用预编译后返回的pdostatement对象的excute()方法来执行代码。

在绑定语句中PDO::PARAM_STR定义的是SQL CHAR、VARCHAR和其他字符串数据类型;

PDO_PARAM_BOOL:定义的是SQL BOOLEAN类型;

PDO_PARAM_INPUT_OUTPUT:参数传递给存储过程中使用此类型,因此,可以在过程执行后修改;

PDO_PARAM_INT:SQL INTEGER数据类型;

PDO_PARAM_NULL:SQL NULL数据类型;

PDO_PARAM_LOB:SQL大对象数据类型;

PDO_PARAM_STMT:PDOStatement对象类型,当前不可操作;

PDO_PARAM_STR:SQL CHAR、VARCHAR和其他字符串数据类型。

通过这一数据绑定过程,实现了防止SQL注入。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈