sql注入实例以及如何防sql注入

概述

  sql注入就是利用某些数据库的外接接口将用户数据插入到实际的数据库操作语言当中,从而达到入侵数据库乃至操作系统的目的。在安全领域,我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。没有(运行时)编译,就没有注入。所以从根本上防止上述类型攻击的手段,还是避免数据变成代码被执行,时刻分清代码和数据的界限。而具体到sql注入来说,被执行的恶意代码是通过数据库的sql解释引擎编译得到的,所以只要避免用户输入的数据被数据库系统编译就可以了。
  与其他数据库不同,mysql可以运行在不同的sql mode(sql服务器模式)下,并且可以为不同客户端应用不同模式。这样每个应用程序可以根据自己的需求来定制服务器的操作模式。模式定义mysql应支持哪些sql语法,以及应执行哪种数据验证检查。这有点类似于apache配置不同级别的错误日志,报告哪些错误,又不报告哪些错误。

SQL注入

1.注入实例

//php代码$unsafe_variable = $_POST['user_input'];   mysql_query("INSERT INTO `table` (`column`) VALUES ('{$unsafe_variable}')");

当post中代码如下时候:

value'); DROP TABLE table;--

查询代码变成

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

这样会直接删除table表,你的数据被破坏了。

2.防止sql注入

方法一
prepareStatement+Bind-Variable:SQL语句和查询的参数分别发送给数据库服务器进行解析。
对于php来说有两种实现方式。

//使用PDO(PHP data object)$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');  $stmt->execute(array('name' => $name));  foreach ($stmt as $row) {      // do something with $row  }//使用mysql扩展-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}

方式二
对查询语句进行转义(最常见的方式):使用应用程序提供的转换函数。
|应用|函数|

|--------||MySQL C API|mysql_real_escape_string()||MySQL++|escape和quote修饰符||PHP|使用mysql_real_escape_string()(适用于PHP4.3.0以前),之后可以使用mysqli或pdo||Perl DBI|placeholder或quote()||Ruby DBI|placeholder或quote()|

方式三
使用自己定义函数进行校验:其本质上还是对输入非法数据进行转义和过滤。
输入验证可以分为:1.整理数据使之有效;2.拒绝已知的非法输入;3.只接收已知的合法输入。

方式四
使用存储过程。
存储过程参见: (9)mysql中的存储过程和自定义函数

sql服务器模式

1.sql模式语法

#查看当前sql模式select @@sql_mode;#查看当前sql模式SELECT @@session.sql_mode;#修改当前sql模式SET [SESSION][GLOBAL] sql_mode='modes';

其中session选项表示只在本次连接生效;而global表示在本次连接不生效,下次连接生效。

也可以使用“–sql-mode=’modes’”,在MySQL启动时候设置sql_mode。

可以在数据库操作0中设置。

2.sql_mode常用值

ONLY_FULL_GROUP_BY:
对于GROUP BY数据库操作1操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。

NO_AUTO_VALUE_ON_ZERO:
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。

STRICT_TRANS_TABLES:
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制。

ViiTor实时翻译 ViiTor实时翻译

AI实时多语言翻译专家!强大的语音识别、AR翻译功能。

ViiTor实时翻译 116 查看详情 ViiTor实时翻译

NO_ZERO_IN_DATE:
在严格模式下,不允许日期和月份为零。

NO_ZERO_DATE:
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。

ERROR_FOR_pISION_BY_ZERO:
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如 果未给出该模式,那么数据被零除时MySQL返回NULL。

NO_AUTO_CREATE_USER:
禁止GRANT创建密码为空的用户。

NO_ENGINE_SUBSTITUTION:
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常。

PIPES_AS_CONCAT:
将”||”视为数据库操作2的连接数据库操作3而非或数据库操作4,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似。

ANSI_QUOTES:
启用ANSI_QUOTES后,不能用双引号来数据库操作5字符串,因为它被解释为识别符。

说明

ORACLE的sql_mode设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER。

【相关推荐】

1. 数据库操作6

2. 数据库操作7

3. 数据库操作8

以上就是sql注入实例以及如何防sql注入的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/412666.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 23:52:15
下一篇 2025年11月6日 23:56:22

相关推荐

  • 解析CSS伪类和伪元素的常见用法和实例

    深入探讨CSS伪类和伪元素的常见用法和实例解析 在前端开发中,CSS是我们常用的样式设计语言之一。除了基本的选择器和属性,CSS还提供了一些特殊的选择器,称为伪类和伪元素。本文将深入探讨CSS伪类和伪元素的常见用法和实例解析,并附上具体的代码示例。 一、伪类的常见用法和实例解析 :hover伪类 :…

    2025年12月24日
    000
  • 用CSS实现的一张图完成的按钮实例

    本篇文章主要介绍如何用css实现的一张图完成的按钮实例,很好用很奥妙,值得收藏和分享 通过css来读取图片坐标系实现局部背景图,感兴趣的小伙伴参考一下。 网易126登录按钮代码如下: .inp_L1,.inp_L2,{background:url(/upload/20080515201218970.…

    好文分享 2025年12月24日
    000
  • css的重绘与重排实现实例

    本文主要和大家介绍了css重绘与重排的方法的相关资料,小编觉得挺不错的,现在分享给大家,希望能帮助到大家。 浏览器加载页面原理 通常在文档初次加载时,浏览器引擎会解析HTML文档来构建DOM树,之后根据DOM元素的几何属性构建一棵用于渲染的树。渲染树的每个节点都有大小和边距等属性,类似于 盒子模型 …

    好文分享 2025年12月24日
    000
  • 用css设置网页占满屏幕的实例代码

    本文用css设置网页高100%宽100%占满屏幕,可以看一下,挺不错的 css设置网页高100%宽100%占满屏幕*{margin: 0;padding: 0;-moz-box-sizing: border-box;-webkit-box-sizing: border-box;box-sizing:…

    好文分享 2025年12月23日
    000
  • Java JDBC中SQL INSERT语句的常见语法错误及修复指南

    本文旨在解决java jdbc应用中常见的sql `insert`语句语法错误,特别是因缺少括号而导致的错误。我们将深入分析错误信息,指出问题根源,并提供正确的sql语句范例及java jdbc `preparedstatement`的使用方法。文章还将涵盖jdbc数据库操作的最佳实践、错误处理和调…

    2025年12月23日
    000
  • Servlet页面导航与用户认证:Redirect与Forward深度解析

    本文深入探讨了Java Servlet中实现页面导航的两种核心机制:客户端重定向(`sendRedirect`)和服务器端转发(`forward`)。通过一个实际的登录认证场景,详细阐述了它们的工作原理、适用场景及在用户认证、会话管理和Cookie处理中的应用,旨在帮助开发者构建结构清晰、功能完善的…

    2025年12月23日
    000
  • PHP表单提交防重复执行:理解与实践 $_POST 清除机制

    本文旨在解决php表单提交后,因页面刷新导致相关函数重复执行的问题。核心在于理解$_post数据的持久性。通过在函数执行完毕后立即使用unset($_post[‘key’])清除对应的$_post条目,可以有效确保功能仅在用户主动提交表单时执行一次,避免不必要的重复操作。 在…

    2025年12月23日
    000
  • PHP教程:将数据库查询结果动态展示到HTML Textarea的最佳实践

    本教程详细介绍了如何使用php将数据库(例如供应商表)的查询结果动态地显示到html `textarea`元素中。文章涵盖了两种实现方式:已废弃的`mysql_*`函数(并强调其不安全性及淘汰原因),以及推荐使用的php数据对象(pdo)扩展。通过具体代码示例,读者将学习如何连接数据库、执行查询、遍…

    2025年12月23日
    000
  • PHP教程:将数据库查询结果动态展示到HTML Textarea

    本文详细介绍了如何利用PHP从数据库中查询数据,并将其动态地格式化输出到HTML的“元素中。文章首先概述了基本思路,随后提供了基于现代PHP数据对象(PDO)的完整解决方案,并强调了`mysql_*`函数已废弃的风险。通过具体代码示例,读者将学习如何建立数据库连接、执行查询、遍历结果集,以及将数据…

    2025年12月23日
    000
  • PHP中防止表单提交后刷新页面重复执行的策略

    php中,表单提交后刷新页面可能导致操作重复执行,这是因为`$_post`数据在某些情况下会保持。本文将深入解析此问题,并提供一种简洁有效的解决方案:通过在功能执行后立即使用`unset()`函数移除`$_post`中对应的键值对,确保操作仅在首次提交时触发,从而提升脚本的稳定性和用户体验。 理解问…

    2025年12月23日
    000
  • 使用PHP将数据库查询结果展示到HTML Textarea

    本教程详细介绍了如何利用PHP从数据库中查询数据,并将其动态地格式化后展示在一个HTML 元素中。文章重点推荐并演示了使用现代的PDO扩展进行数据库操作,包括建立连接、执行查询、遍历结果集,以及将数据以指定格式输出到文本区域的完整过程,同时强调了弃用mysql_*函数的重要性及其替代方案。 在Web…

    2025年12月23日
    000
  • PHP表单提交与数据库插入故障排除:关键的name属性

    本文旨在解决PHP表单提交后数据未能成功插入数据库的问题,尤其是在处理注册或登录功能时。核心问题通常源于HTML表单提交按钮缺少`name`属性,导致服务器端PHP脚本无法通过`$_POST`超全局变量正确识别提交动作。教程将详细阐述其原理,提供正确的代码示例,并探讨相关最佳实践。 1. 理解PHP…

    2025年12月23日
    000
  • PHP isset()与表单提交:理解$_POST和GET方法的关键差异

    在使用php处理表单提交时,开发者常遇到`isset($_post[‘submit’])`不生效的问题。这通常是由于html表单的默认提交方法为`get`,导致数据通过url而非请求体传输。本文将深入解析`get`与`post`方法的区别,并指导如何正确配置表单,确保`$_p…

    2025年12月23日
    000
  • 掌握PHP表单提交:理解GET与POST及isset()的正确使用

    本文旨在解决php表单提交中`isset($_post)`始终返回`false`的常见问题。核心在于表单默认提交方式为`get`,导致数据通过url而非请求体传输。教程将详细解释`get`与`post`方法的区别,指导读者如何通过在` 数据传输: GET 方法将表单数据附加到 URL 的查询字符串中…

    2025年12月23日
    000
  • 解决PHP表单提交与数据库插入失败:提交按钮name属性的关键作用

    本教程旨在解决php表单提交后数据无法插入数据库的问题。核心原因在于html `submit` 按钮缺少 `name` 属性,导致后端php脚本无法通过 `isset($_post[‘name’])` 正确识别表单提交事件。文章将详细阐述这一常见错误,提供正确的html和ph…

    2025年12月23日
    000
  • PHP表单提交与isset($_POST):理解GET与POST方法

    在使用PHP处理表单提交时,开发者常遇到`isset($_POST)`无法检测到提交按钮的问题。这通常是由于HTML表单默认使用`GET`方法提交数据,导致数据通过`$_GET`超全局变量而非`$_POST`可用。本文将深入探讨这一常见误区,并提供明确的解决方案,指导您正确配置表单的`method`…

    2025年12月23日
    000
  • PHP表单提交:解决 isset($_POST) 不生效的问题

    本教程旨在解决php表单提交中`isset($_post)`无法正确检测提交按钮的问题。核心原因在于html表单默认的`get`提交方法。文章将详细解释`$_get`与`$_post`超全局变量的区别,并提供正确的代码示例,指导开发者通过在` 根据需求选择方法:如果数据不敏感且希望用户能够分享或收藏…

    2025年12月23日
    000
  • 深入理解HTML表单中的value与name属性:以文本输入框和下拉菜单为例

    本文旨在阐明html表单中value和name属性的关键作用,特别针对input type=”text”和select元素。对于文本输入框,value属性默认为空字符串,其内容由用户输入决定,而name属性则是数据提交至服务器的标识符。对于下拉菜单,value属性定义每个选项…

    2025年12月23日
    000
  • PHP表单提交与isset()函数:深入理解GET与POST方法

    本教程详细解析了php中`isset($_post)`函数在表单提交时可能失效的原因。核心问题在于html表单的默认提交方法为get,导致数据通过`$_get`超全局变量传递,而非`$_post`。文章将指导读者如何通过明确设置表单的`method=”post”`属性,确保数…

    2025年12月23日
    000
  • 深入解析HTML表单中value与name属性的机制与应用

    本文旨在深入探讨html表单中`input`文本框和`select`下拉菜单的`value`与`name`属性。我们将阐明为何文本输入框的`value`属性常被省略而由用户动态填充,以及`name`属性在表单数据提交至服务器时的核心作用。同时,文章还将区分`value`和`placeholder`的…

    2025年12月23日
    000

发表回复

登录后才能评论
关注微信