预防数据库注入攻击方法(Mysql)
导语:近年来数据库注入漏洞出现率是很高的,owasp排名也在前10当中。大多数都是由于开发人员缺乏安全意识造成了注入漏洞。学习信息安全技术,不仅要学会漏洞利用,也需要我们有修补漏洞的能力,来提高应用的安全性。常用来预防数据库注入的方案大致有本文中的三种。
一、预处理语句及参数绑定
预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。
预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。
预处理语句的工作原理如下:
1.预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如:
2.数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。
3.执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。
下面放一个预编译参数绑定的demo
二、存储过程
存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。
存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。
存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
存储过程的创建和调用
存储过程就是具有名字的一段代码,用来完成一个特定的功能。
创建的存储过程保存在数据库的数据字典中。
存储过程的应用参考:https://www.runoob.com/w3cnote/mysql-stored-procedure.html
概论来源:https://www.runoob.com/w3cnote/mysql-stored-procedure.html
三、过滤用户输入
关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 cookie)的任何数据都是不可信任的。此时需要我们取控制外部的输入,过滤其中不合法、有危害的内容。
1,使用PHP 函数对输入内容过滤。如
mysql_real_escape_string() 这个函数会对一些例如单引号、双引号、反斜杠等特殊字符添加一个反斜杠以确保在查询这些数据之前,用户提供的输入是干净的
addslashes() 这个函数的原理跟mysql_real_escape_string()相似。但是当在php.ini文件中,“magic_quotes_gpc“的值是“on”的时候,就不要使用这个函数。magic_quotes_gpc 的默认值是on,对所有的 GET、POST 和 COOKIE 数据自动运行 addslashes()。不要对已经被 magic_quotes_gpc 转义过的字符串使用 addslashes(),因为这样会导致双层转义。你可以使用get_magic_quotes_gpc()函数来确定它是否开启。
2,使用正则表达式过滤输入。
3,采用白名单机制,只允许指定的输入内容。