本文章向大家介绍什么是SQL注入攻击,以及在php网站开发中,如何防止SQL注入攻击。PHP防止SQL注入攻击有三种常用方法,第一种方法是使用PHP转义字符串mysql_real_escape_string()函数,第二种方法是使用mysqli的prepare语句,第三种方法是使用PDO。
毕业开始从事winform到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机会接触相关开发……必须的各种借口。这几天把sql注入的相关知识整理了下,希望大家多多提意见。
对于sql注入的攻防,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经验,为避免后知后觉的犯下大错,专门查看大量前辈们的心得,这方面的资料颇多,将其精简出自己觉得重要的,就成了该文。
什么是SQL注入攻击
SQL注入是一个网络安全漏洞,攻击者可以利用该漏洞来干扰应用程序对其数据库的查询。通常,它使攻击者可以查看他们通常无法检索的数据。这可能包括其他用户的数据,或者应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除此数据,从而导致应用程序内容或行为的永久更改。
下面我们以登录模块来说明SQL注入攻击,登录模块其实就是执行SQL查询,看是否能匹配到查询结果。以下是从普通用户和尝试使用SQL注入的不良用户收集的示例字符串。
上面的php代码将输出如下:
正常SQL: SELECT * FROM customers WHERE username = 'timmy'
注入式SQL: SELECT * FROM customers WHERE username = '' OR 1''
正常SQL查询没有问题,因为我们的MySQL语句将从用户名等于timmy的客户中选择所有内容。
但是,注入攻击SQL实际上的查询行为与我们预期的有所不同。通过使用单引号(')结束了我们的MySQL查询的字符串部分
username=''
然后使用OR子句1(始终为true)添加到我们的WHERE语句中。
username='' or 1
此OR子句1始终为 true ,因此该语句将查询customers表中的所有数据!
如何防止SQL注入
有三种方法可以防止SQL注入攻击。第一种方法使用mysql_real_escape_string()函数,第二种方法使用mysqli的prepare语句,第三种方法使用PDO(对于任何受支持的数据库驱动程序)。
mysql_real_escape_string()
mysqli的prepare语句
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);