版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、永远不要信任用户的输入。对用户的输入进行校验<PHP防SQL注入类>详细设计说明书2014年5月目录1.防注入的指导思想22.功能设计22.1脚本解析安全设置22.2正式地址禁用错误报告22.3使用参数化查询32.4对请求提交的数据进行验证42.5转化敏感字符43.详细设计54.防注入功能测试74.1代码准备:74.2注入测试94.3防止Sql注入101. 防注入的指导思想² 永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。² 永远不要使用动态拼装sql,可以使用参数化的sql或者直
2、接使用存储过程进行数据查询存取。² 永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。² 不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。² 应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装² sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。2. 功能设计2.1 脚本解析安全设置ini文件中可以配置一些涉
3、及安全性的设置,通过这些设置可以增加SQL的注入难度,降低SQL注入风险。主要的从以下几个方面设置:² 设置“magic_quotes_gpc”为“on”² 设置“register_globals”为“off”² 设置“safe_mode”为“on”² 设置“open_basedir”为“on”² 设置“display_errmors”为“off”2.2 正式地址禁用错误报告屏蔽错误提示可以有效的保护数据库信息,增加SQL的注入难度,降低SQL注入风险。在配置文件开头加代码:error_reporting(0);2.3 使用参数化查询PHP数据
4、库连接类PDO(或其他数据库抽象类库)的prepare()方法构造参数化查询,可以有效的阻止Sql注入,这比自己编写Sql注入过滤函数库有效很多很多。PDO使用举例:<?php$pdo = new PDO("mysql:host=;dbname=test;","root");$pdo->setAttribute(PDO:ATTR_EMULATE_PREPARES, false); /设置禁止php本地转义。$sql="select * from
5、0;info where id =? and name = ?"if($age)$sql.=" and age =?"/构建动态Sql$st = $pdo->prepare();$id = 21;$name = 'zhangsan' $st->bindParam(1,$id);$st->bindParam(2,$name);if($age)$st->bindParam(3,$age);$
6、st->execute();$st->fetchAll();?>2.4 对请求提交的数据进行验证SQL注入攻击实质上是构造畸形的SQL语句,通过WEB应用程序送达数据库系统执行的。如果WEB应用程序对用户输入的参数进行过滤,使得参数构造的SQL语句不能送达数据库系统执行。² 验证输入的数据是否符合规定的数据类型,长度是否合法,。如金额必须是数字、公司编码必须是6位、日期类型的格式是否正确等。对请求的数据进行验证是很有必要的,既保证了数据的完整性,又可以防止SQL注入。² 在前端浏览器,限制表单内容的输入长度,比如公司编码的文本框最大长度为6,发车凭证最大为
7、11,运单号的最大长度为13等。2.5 转化敏感字符2.5.1 要转化的敏感字符单引号(')、双引号(")、反斜线()等2.5.2 用PDO的quote()方法进行转化<?phprequire './config/config.php'$injection="'"if(!get_magic_quotes_gpc()$injection=$pdo->quote($injection); /只对未进行magic_quotes_gpc转义的变量转义。避免进行双层转义echo $injection;?>输出:'
8、39;'2.5.3 用php的mysql_real_escape_string()方法进行转化mysql_real_escape_string()转义 SQL 语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集。并不转义 % 、 _、x00、 n、 r。<?phprequire './config/config.php'$injection="'"if(!get_magic_quotes_gpc()$injection=mysql_real_escape_string($injection); /只对未进行magic_quotes
9、_gpc转义的变量转义。避免进行双层转义echo $injection;?>输出:'3. 详细设计对POST、GET、REQUERE的请求数据进行过滤<?php/* * 功能:对用户请求提交的数据进行校验转义 * 日期:2014年5月20日 * author lujiang * */class safeprivate $tpobj;/* * 析构函数 * */function _construct()$this->tpobj=''/* * * param $obj 要处理的对象 * return 转义后字符 * name 数据转义函数 */public
10、 static function tranParams($obj)if(!get_magic_quotes_gpc() if(is_array($obj) foreach($obj as $key => $val) $obj$key = self:tranparams($val);else $obj = mysql_real_escape_string($obj);return $obj;/* * name 对post、get进行转义 * */public static function tranRequest()global $_POST;global $_GET;global $_R
11、EQUEST;global $_SESSION;if(!get_magic_quotes_gpc() $_POST=self:tranParams($_POST); $_GET=self:tranParams($_GET); $_REQUEST=self:tranParams($_REQUEST); $_SESSION=self:tranParams($_SESSION); 4. 防注入功能测试4.1 代码准备:4.1.1 前端登录页面<!DOCTYPE html PUBLIC "-/W3C/DTD HTML 4.01 Transitional/EN" "h
12、ttp://TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body><div style="width: 30%"><form action="test.php
13、" method="post"><fieldset><legend>SQL注入演示</legend>账号:<input type="text" id="u" name="u" value="1"/><br/><br/>密码:<input type="text" id="p" name="p" value=""/><
14、;br/><br/><input type="submit" id="s" name="s" value="提交"/></fieldset></form></div></body></html>4.1.2 采用PDO连接数据库<?php$host=''$user="person"$password="person"$dbname="tes
15、t"$port="3306"try $DSN="mysql:host=$host;dbname=$dbname"$pdo=new PDO($DSN,$user,$password);$pdo->query('set names UTF8');$pdo->setAttribute(PDO:ATTR_ERRMODE,PDO:ERRMODE_EXCEPTION); catch (PDOException $e) echo 'error: '.$e->getMessage();?>4.1.3 登录
16、功能处理页面<?php include 'safe_class.php'include 'db.config.php'header("Content-Type: text/html; charset=UTF-8");error_reporting(1);$user=$_POST'u'$pwd=$_POST'p'$sql = "SELECT * FROM users WHERE u='" . $user . "' AND p='" . $pwd
17、 . "'"$userArr=$pdo->query($sql)->fetchAll();if($userArr)echo '登录成功!'elseecho '登录失败!'?>4.2 注入测试4.2.1 通过注入实现登录在用户名处录入:' or 1 = 1 - 点击提交,提示:登录成功!4.2.2 通过注入判断订单表的名称在用户名处录入:' And (Select count(*) from order)<>0 -点击提交,程序报错,如下图说明表名不是order。在用户名处录入:'
18、And (Select count(*) from order)<>0 -点击提交,程序未报错,提示:登录失败!。说明订单表的名称是:orders。4.3 防止Sql注入4.3.1 在登录功能页面中加入请求转义功能代码:safe:tranRequest();<?php include 'safe_class.php'include 'db.config.php'header("Content-Type: text/html; charset=UTF-8");error_reporting(1);safe:tranRequest();$user=$_POST'u'$pwd=$_POST'p'$sql = "SELECT * FROM users WHERE u='" . $user . "' AND p='" . $pwd
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年四川邮电职业技术学院单招职业适应性考试题库及答案详解(考点梳理)
- 2026年安康职业技术学院单招综合素质考试题库附参考答案详解(能力提升)
- (甘肃一模)2026年甘肃省高三年级第一次模拟考试地理试题(含答案)
- 农家乐柴火灶使用安全教育培训
- 2026年宁夏固原地区单招职业适应性考试题库含答案详解
- 2026年塔城职业技术学院单招职业技能考试题库含答案详解(新)
- 2026年娄底职业技术学院单招职业适应性测试题库带答案详解(突破训练)
- 2026年大兴安岭职业学院单招职业技能考试题库及答案详解(必刷)
- 2026年四川职业技术学院单招职业技能考试题库含答案详解(满分必刷)
- 2026年宁德职业技术学院单招职业适应性测试题库附答案详解(b卷)
- 新能源汽车电机及控制系统检修高职全套教学课件
- GB/T 26203-2023纸和纸板内结合强度的测定(Scott型)
- 旅行社运营实务电子课件 2.1 走进旅行社门市
- 《健身气功八段锦》教案
- 乳腺良性肿瘤日间手术临床路径临床路径
- CBCC中国建筑色卡色
- (完整版)简单儿童对比涂色画画-可打印(干货)
- GB/T 16924-2008钢件的淬火与回火
- 中考语文专题复习专题一汉字读写课件
- 腹腔镜辅助下阴式子宫切除的课件
- 交管12123驾照学法减分题库200题(含答案完整版)
评论
0/150
提交评论