这是因为用户可以输入类似VALUE“); DROP TABLE表; - ,使查询变成: 复制代码 代码如下: INSERT INTO table (column) VALUES('VALUE'); DROP TABLE table;'
我们应该怎么防止这种情况呢?请看下面 使用预备义语句和参数化查询。对于带有任何参数的sql语句都会被发送到数据库服务器,并被解析!对于攻击者想要恶意注入sql是不可能的! 实现这一目标基本上有两种选择: 1.使用PDO(PHP Data Objects ): 复制代码 代码如下: $stmt = $pdo- prepare('SELECT * FROM employees WHERE name = :name'); $stmt- execute(array(':name' = $name)); foreach ($stmt as $row) { // do something with $row }
2.使用mysqli: 复制代码 代码如下: $stmt = $dbConnection- prepare('SELECT * FROM employees WHERE name = ?'); $stmt- bind_param('s', $name); $stmt- execute(); $result = $stmt- get_result(); while ($row = $result- fetch_assoc()) { // do something with $row }
这里最重要的是,该参数值是和预编译的语句结合的,而不是和一个SQL字符串.SQL注入的工作原理是通过欺骗手段创建的SQL脚本包括恶意字符串发送到数据库.因此,通过发送实际的分开的sql参数,你会降低风险.使用准备好的语句时,你发送的任何参数,将只被视为字符串(虽然数据库引擎可能会做一些参数的优化,当然最终可能会为数字).在上面的例子中,如果变量$name包含'sarah';DELETE * FROM employees,结果只会是一个搜索的字符串"'sarah';DELETE * FROM employees",你不会得到一个空表。