PHP防SQL注入详细设计说明书.docx
- 文档编号:8161242
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:14
- 大小:87.89KB
PHP防SQL注入详细设计说明书.docx
《PHP防SQL注入详细设计说明书.docx》由会员分享,可在线阅读,更多相关《PHP防SQL注入详细设计说明书.docx(14页珍藏版)》请在冰豆网上搜索。
PHP防SQL注入详细设计说明书
详细设计说明书
2014年5月
目录
1.防注入的指导思想2
2.功能设计2
2.1脚本解析安全设置2
2.2正式地址禁用错误报告2
2.3使用参数化查询3
2.4对请求提交的数据进行验证4
2.5转化敏感字符4
3.详细设计5
4.防注入功能测试7
4.1代码准备:
7
4.2注入测试9
4.3防止Sql注入10
1.防注入的指导思想
✧永远不要信任用户的输入。
对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和双"-"进行转换等。
✧永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
✧永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
✧不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
✧应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
✧sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。
MDCSOFTSCAN等。
采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
2.功能设计
2.1脚本解析安全设置
ini文件中可以配置一些涉及安全性的设置,通过这些设置可以增加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数据库连接类PDO(或其他数据库抽象类库)的prepare()方法构造参数化查询,可以有效的阻止Sql注入,这比自己编写Sql注入过滤函数库有效很多很多。
PDO使用举例:
php
$pdo = new PDO("mysql:
host=192.168.0.1;dbname=test;","root");
$pdo->setAttribute(PDO:
:
ATTR_EMULATE_PREPARES, false);//设置禁止php本地转义。
$sql="select * from info where id =?
and name = ?
";
if($age)
{
$sql.="andage=?
";//构建动态Sql
}
$st = $pdo->prepare();
$id = 21;
$name = 'zhangsan';
$st->bindParam(1,$id);
$st->bindParam(2,$name);
if($age)
{
$st->bindParam(3,$age);
}
$st->execute();
$st->fetchAll();
?
>
2.4对请求提交的数据进行验证
SQL注入攻击实质上是构造畸形的SQL语句,通过WEB应用程序送达数据库系统执行的。
如果WEB应用程序对用户输入的参数进行过滤,使得参数构造的SQL语句不能送达数据库系统执行。
✧验证输入的数据是否符合规定的数据类型,长度是否合法,。
如金额必须是数字、公司编码必须是6位、日期类型的格式是否正确等。
对请求的数据进行验证是很有必要的,既保证了数据的完整性,又可以防止SQL注入。
✧在前端浏览器,限制表单内容的输入长度,比如公司编码的文本框最大长度为6,发车凭证最大为11,运单号的最大长度为13等。
2.5转化敏感字符
2.5.1要转化的敏感字符
单引号(')、双引号(")、反斜线(\)等
2.5.2
用PDO的quote()方法进行转化
php
require'./config/config.php';
$injection="'";
if(!
get_magic_quotes_gpc())
{
$injection=$pdo->quote($injection);//只对未进行magic_quotes_gpc转义的变量转义。
避免进行双层转义
}
echo$injection;
?
>
输出:
'\''
2.5.3用php的mysql_real_escape_string()方法进行转化
mysql_real_escape_string()转义SQL语句中使用的字符串中的特殊字符,并考虑到连接的当前字符集。
并不转义%、_、\x00、\n、\r。
php
require'./config/config.php';
$injection="'";
if(!
get_magic_quotes_gpc())
{
$injection=mysql_real_escape_string($injection);//只对未进行magic_quotes_gpc转义的变量转义。
避免进行双层转义
}
echo$injection;
?
>
输出:
\'
3.详细设计
对POST、GET、REQUERE的请求数据进行过滤
php
/**
*功能:
对用户请求提交的数据进行校验转义
*日期:
2014年5月20日
*@authorlujiang
*
*/
classsafe
{
private$tpobj;
/**
*析构函数
*
*/
function__construct()
{
$this->tpobj='';
}
/**
*
*@param$obj要处理的对象
*@return转义后字符
*@name数据转义函数
*/
publicstaticfunctiontranParams($obj)
{
if(!
get_magic_quotes_gpc())
{
if(is_array($obj))
{
foreach($objas$key=>$val)
{
$obj[$key]=self:
:
tranparams($val);
}
}
else
{
$obj=mysql_real_escape_string($obj);
}
}
return$obj;
}
/**
*@name对post、get进行转义
*@
*/
publicstaticfunctiontranRequest()
{
global$_POST;
global$_GET;
global$_REQUEST;
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
前端登录页面
DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http:
//www.w3.org/TR/html4/loose.dtd">
30%">
账号:
密码:
4.1.2
采用PDO连接数据库
php
$host='127.0.0.1';
$user="person";
$password="person";
$dbname="test";
$port="3306";
try{
$DSN="mysql:
host=$host;dbname=$dbname";
$pdo=newPDO($DSN,$user,$password);
$pdo->query('setnamesUTF8');
$pdo->setAttribute(PDO:
:
ATTR_ERRMODE,PDO:
:
ERRMODE_EXCEPTION);
}catch(PDOException$e){
echo'error:
'.$e->getMessage();
}
?
>
4.1.3
登录功能处理页面
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*FROMusersWHEREu='".$user."'ANDp='".$pwd."'";
$userArr=$pdo->query($sql)->fetchAll();
if($userArr)
{
echo'登录成功!
';
}else
{
echo'登录失败!
';
}
?
>
4.2注入测试
4.2.1通过注入实现登录
在用户名处录入:
'or1=1--
点击提交,提示:
登录成功!
4.2.2通过注入判断订单表的名称
在用户名处录入:
'And(Selectcount(*)fromorder)<>0--
点击提交,程序报错,如下图
说明表名不是order。
在用户名处录入:
'And(Selectcount(*)fromorder)<>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*FROMusersWHEREu='".$user."'ANDp='".$pwd."'";
$userArr=$pdo->query($sql)->fetchAll();
if($userArr)
{
echo'登录成功!
';
}else
{
echo'登录失败!
';
}
?
>
4.3.2再次注入测试,检测对请求转义后的防Sql注入性能
在用户名处录入:
'or1=1--
点击提交,提示:
登录失败。
防Sql注入成功。
在用户名处录入:
'And(Selectcount(*)fromorder)<>0--
点击提交,提示:
登录失败。
防Sql注入成功。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP SQL 注入 详细 设计 说明书