一、 建立一个安全抽象层

我们并不建议你手工地把前面介绍的技术应用于每一个用户输入的实例中,而是强烈推荐你为此创建一个抽象层。一个简单的抽象是把你的校验方案加入到一个函数中,并且针对用户输入的每一项调用这个函数。当然,我们还可以创建一种更复杂的更高一级的抽象-把一个安全的查询封装到一个类中,从而应用于整个应用程序。在网上已经存在许多这种现成的免费的类;在本篇中,我们正要讨论其中的一些。

进行这种抽象至少存在三个优点(而且每一个都会改进安全级别):

1. 本地化代码。

2. 使查询的构造更快且更为可靠-因为这可以把部分工作交由抽象代码来实现。

3. 当基于安全特征进行构建并且恰当使用时,这将会有效地防止我们前面所讨论的各种各样的注入式攻击。

二、 改进现有的应用程序

如果你想改进一个现有的应用程序,则使用一个简单的抽象层是最适当的。一个能够简单地"清理"你所收集的任何用户输入内容的函数可能看起来如下所示:

function safe( $string ) {

return "'" . mysql_real_escape_string( $string ) . "'"

}

【注意】我们已经构建了相应于值要求的单引号以及mysql_real_escape_string()函数。接下来,就可以使用这个函数来构造一个$query变量,如下所示:

$variety = safe( $_POST['variety'] );

$query = " SELECT * from wines WHERE variety=" . $variety;

现在,你的用户试图进行一个注入式攻击-通过输入下列内容作为变量$variety的值:

lagrein' or 1=1;

注意,如果不进行上面的"清理",则最后的查询将如下所示(这将导致无法预料的结果):

SELECT * from wines WHERE variety = 'lagrein' or 1=1;'

然而现在,既然用户的输入已经被清理,那么查询语句就成为下面这样一种无危害的形式:

SELECT * from wines WHERE variety = 'lagrein\' or 1=1\;'

既然数据库中不存在与指定的值相应的variety域(这正是恶意用户所输入的内容-lagrein' or 1=1;),那么,这个查询将不能返回任何结果,并且注入将会失败。

三、 保护一个新的应用程序

如果你正在创建一个新的应用程序,那么,你可以从头开始创建一个安全抽象层。如今,PHP 5新改进的对于MySQL的支持(这主要体现在新的mysqli扩展中)为这种安全特征提供了强有力的支持(既有过程性的,也有面向对象特征的)。你可以从站点http://php.net/mysqli上获取有关mysqli的信息。注意,只有�

php阻止输入sql,在PHP中全面阻止SQL注入式攻击之三相关推荐

  1. 在PHP中全面阻止SQL注入式攻击之三

    一. 建立一个安全抽象层 我们并不建议你手工地把前面介绍的技术应用于每一个用户输入的实例中,而是强烈推荐你为此创建一个抽象层.一个简单的抽象是把你的校验方案加入到一个函数中,并且针对用户输入的每一项调 ...

  2. java批量执行sql语句_Java中批量执行sql语句

    在我们实际项目开发过程中,可能有的功能在后台需要执行几条sql语句甚至需要批量的执行一些sql语句,如果是循环一条一条执行,我想大家都知道这样做的效率特别低,尤其是批量sql时,但是如果我们先循环把整 ...

  3. dede 模板 php sql,dedecms模板中使用{dede:sql=””}实现分页功能详解

    相信很多使用织梦dedecms的朋友在网上查找关于dede:sql标签进行分页的解决方案时都不尽如人意,尤其是在列表页使用dede:sql调用外部数据(所谓调用外部数据就是指在后台只是创建个空栏目,然 ...

  4. oracle中的pl SQL,Oracle数据中的PL/SQL介绍

    PL/SQL是Procedure Language Sturtured Query Language的缩写.PL/SQL的优点:有利于客户/服务器环境应用的性能提高.PL/SQL是 什么是Pl/SQL ...

  5. php sqlite3 sql,在PHP中准备SQLite SQL语句

    我正在尝试如何最好地在PHP中准备我的SQLite SQL字符串. SQLite3类附带了一个escapeString()函数,但这是我的问题: 尝试1) $sql = "INSERT IN ...

  6. sql中截取字符串函数_SQL Server 2017中的顶级SQL字符串函数

    sql中截取字符串函数 SQL Server 2017 has been in the talk for its many features that simplify a developer's l ...

  7. SQL Server数据库中批量导入数据的四种方法总结

    在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是, ...

  8. SQL FILESTREAM数据库中的事务日志备份

    In the continuation of our SQL FILESTREAM article series, we'll be covering transaction log backups ...

  9. SQL Server数据库中批量导入数据

    在软件项目实施的时候,数据导入一直是项目人员比较头疼的问题.其实,在SQL Server中集成了很多成批导入数据的方法.有些项目实施顾问头疼的问题,在我们数据库管理员眼中,是小菜一碟.现在的重点就是, ...

最新文章

  1. JAVA SHA1 加密 对应 c# SHA1 加密
  2. kafka重置到最新offset偏移量
  3. HJ106 字符逆序
  4. 【PTA】JAVA提交的一些注意点
  5. Spring AOP进行日志记录,管理
  6. JDK8和JDK1.8有何区别
  7. Python把docx文档中的题库导入SQLite数据库
  8. win7升级的神秘KEY
  9. 动态规划——Russian Doll Envelopes
  10. 抵御风险——漫谈运维核心价值和方法论
  11. 通过SQL Server命令行启动及停止SQL服务的方法
  12. 要管理组策略 您必须以域用户账户登录此计算机,让AD域用户账户只能登陆管理员指定的客户端计算机...
  13. java性能优化权威指南_《Java性能优化权威指南》PDF 下载
  14. 适用于低配机器,从USB摄像头拉H264流的Qt播放器
  15. 国密(1) - 私钥Key文件( PEM格式)编解码方法
  16. python和c++实现 不改变长宽比缩放图片
  17. 一些基础知识:脑科学、神经科学、心理学
  18. 分享一个C语言矿井逃生迷宫小游戏【附源码】
  19. MySQL三种插入方式
  20. Vue创建项目的步骤

热门文章

  1. 在线公开课 | 从理论走向实践,多角度详解Cloud Native
  2. 大厂必问的分布式究竟是什么鬼?
  3. 你需要掌握的事件分发高阶知识
  4. 【BAT面试现场】如何判断一个数是否在40亿个整数中?
  5. java 判断日期连续_如何在Java中检查日期是否大于另一个日期?[重复]
  6. 二阶振荡环节的谐振频率_自动控制系统时域分析十三:对数频率特性
  7. windows oracle 内存大,如何设计Oracle数据库内存的大小
  8. linux根文件系统 /etc/resolv.conf 文件详解
  9. Oracle查询所有序列;[oracle中如何创建表的自增ID(通过序列);oracle sql语句大全
  10. SpringBoot集成Editor.md 流程详细