当前位置: 首页 > article >正文

1、SQL注入攻击的防范

原文地址: SQL注入攻击的防范 更多内容请关注:代码安全

PHP安全编码——书写安全的代码

1、SQL注入攻击的防范

提问

    问题1:什么是SQL注入攻击?
    问题2:有几种简单方法防范SQL注入攻击?
    问题3:mysql_real_escape_string对参数处理时,为什么必须加上单引号?

课程单元

    什么是SQL注入攻击
    SQL注入攻击的危害
    SQL注入攻击示例
    如何防范SQL注入攻击

1. 什么是SQL注入攻击

    SQL注入攻击,指的是通过构建特殊的输入作为参数,传入后台处理程序(比如PHP代码),通过执行SQL语句,来执行攻击者所要的操作,从而达到攻击的目的。
    SQL注入攻击危害严重,是网上最常见的攻击方式之一,一般写代码时不小心就很容易遗留漏洞,然而又非常容易防范。

2. SQL注入攻击的危害

    攻击者可能可以绕过系统的安全措施,比如绕过登录帐号密码,直接进入系统。
    攻击者可能可以任意读取、修改数据库中的数据。
    攻击者可能可以通过对数据库进行操作,而取得登录系统的权限,直接进入系统,进行任意操作。

3. SQL注入攻击示例

    这是一个简单的登录系统

图片

    假设对应的html如下:

图片

    假设处理该登录操作的php代码如下:

图片

    我们在用户名输入框输入:admin’ or 1 = 1#,密码框输入123456,则产生了如下结果:

图片

    根据这个结果,生成的$sql是这样的:

图片

    这个$sql的执行结果,会导致执行登录成功之后的操作。这样,我们就在没有用户名和密码的情况下,成功登录了系统。
    同理,我们可以执行任意的其他数据库操作,一步步取出数据库全部数据,甚至取得系统登录权限。

4. 如何防范SQL注入攻击

    1、最小权限原则
    2、关闭错误提示
    3、对查询参数进行转义
    4、使用参数化查询

4.1. 最小权限原则

    虚拟站点使用的数据库用户一定不要使用root等最高权限用户,必须针对每个虚拟站点单独设置一个用户,这个用户只能允许虚拟站点所在的ip登录,只能访问当前虚拟站点所使用的数据库,并且只有有限的少数几个权限。这样如果出现问题,可以尽可能将问题缩小在当前数据库之内,不至于扩大化引起其他数据库和其他站点问题。

图片

4.2. 关闭错误提示

    对于php,在php.ini中,设置:
    display_errors = Off

    如果没有修改php.ini的权限,在代码中设置:
    ini_set(“display_errors”, “Off”);

    这样如果代码出现问题,只会显示空白页面,不会显示详细的错误信息,减少泄漏代码和服务器配置情况的可能性。

4.3. 对查询参数进行转义

    php提供了mysql_real_escape_string方法,用于转义 SQL 语句中使用的字符串中的特殊字符,可以安全用于 mysql_query()。
    对于刚才的登录,我们将$sql加上mysql_real_escape_string改成如下格式:

图片

    我们依然在用户名输入框输入:admin’ or 1 = 1#,密码框输入123456,此时结果如下:

图片

    这次我们成功防范了针对登录的SQL注入。

    mysql_real_escape_string使用必须注意:
    所有参数都必须使用该方法进行转义,包括$_GET、$_POST、$_SESSION、$_COOKIE
    在参数前后必须加上单引号,下面的写法是正确的

图片

    下面的写法是错误的,起不到防范SQL注入效果

图片

4.4. 使用参数化查询

    建议采用mysqli取代传统的mysql方法。
    对于刚才的登录操作,可以使用mysqli改成参数化查询,可以有效避免SQL注入问题。

图片


http://www.kler.cn/a/614075.html

相关文章:

  • 1921.消灭怪物的最大数量
  • -JavaEE 应用Servlet 路由技术JDBCMybatis 数据库生命周期
  • Gateway实战(二)、负载均衡
  • 【Java】JVM
  • pytest-xdist 进行高效并行自动化测试
  • LeetCode hot 100—LRU缓存
  • SQL 通用表表达式(CTE )
  • MetInfo6.0.0目录遍历漏洞原理分析
  • C++11QT复习 (三)
  • QT mingw编译器使用gdb调试
  • 2025 年前端新趋势:拥抱 Web Component 与性能优化
  • aioredis.from_url函数详解
  • 7.1 分治-快排专题:LeetCode 75. 颜色分类
  • postgresql+patroni+etcd高可用安装
  • 微软开源 “Hyperlight Wasm”,将轻量级虚拟机技术扩展至 WASM
  • 使用ModbusRTU读取松下测高仪的高度
  • 微软和Linux
  • 深入理解MySQL中的脏读、幻读、不可重复读(附实战复现源码)
  • 【VSCode的安装与配置】
  • vue create创建 Vue-router 工程