PHP防SQL注入详细设计说明书Word格式.docx

上传人:b****5 文档编号:21099559 上传时间:2023-01-27 格式:DOCX 页数:14 大小:87.80KB
下载 相关 举报
PHP防SQL注入详细设计说明书Word格式.docx_第1页
第1页 / 共14页
PHP防SQL注入详细设计说明书Word格式.docx_第2页
第2页 / 共14页
PHP防SQL注入详细设计说明书Word格式.docx_第3页
第3页 / 共14页
PHP防SQL注入详细设计说明书Word格式.docx_第4页
第4页 / 共14页
PHP防SQL注入详细设计说明书Word格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

PHP防SQL注入详细设计说明书Word格式.docx

《PHP防SQL注入详细设计说明书Word格式.docx》由会员分享,可在线阅读,更多相关《PHP防SQL注入详细设计说明书Word格式.docx(14页珍藏版)》请在冰豆网上搜索。

PHP防SQL注入详细设计说明书Word格式.docx

采用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 

prepare();

$id 

21;

$name 

'

zhangsan'

$st->

bindParam(1,$id);

bindParam(2,$name);

$st->

bindParam(3,$age);

execute();

fetchAll();

>

2.4对请求提交的数据进行验证

SQL注入攻击实质上是构造畸形的SQL语句,通过WEB应用程序送达数据库系统执行的。

如果WEB应用程序对用户输入的参数进行过滤,使得参数构造的SQL语句不能送达数据库系统执行。

✧验证输入的数据是否符合规定的数据类型,长度是否合法,。

如金额必须是数字、公司编码必须是6位、日期类型的格式是否正确等。

对请求的数据进行验证是很有必要的,既保证了数据的完整性,又可以防止SQL注入。

✧在前端浏览器,限制表单内容的输入长度,比如公司编码的文本框最大长度为6,发车凭证最大为11,运单号的最大长度为13等。

2.5转化敏感字符

2.5.1要转化的敏感字符

单引号('

)、双引号("

)、反斜线(\)等

2.5.2

用PDO的quote()方法进行转化

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。

$injection=mysql_real_escape_string($injection);

3.详细设计

对POST、GET、REQUERE的请求数据进行过滤

/**

*功能:

对用户请求提交的数据进行校验转义

*日期:

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;

$_POST=self:

tranParams($_POST);

$_GET=self:

tranParams($_GET);

$_REQUEST=self:

tranParams($_REQUEST);

$_SESSION=self:

tranParams($_SESSION);

4.防注入功能测试

4.1.1

前端登录页面

!

DOCTYPEhtmlPUBLIC"

-//W3C//DTDHTML4.01Transitional//EN"

"

http:

//www.w3.org/TR/html4/loose.dtd"

html>

head>

metahttp-equiv="

Content-Type"

content="

text/html;

charset=UTF-8"

title>

Inserttitlehere<

/title>

/head>

body>

divstyle="

width:

30%"

<

formaction="

test.php"

method="

post"

<

fieldset>

<

legend>

SQL注入演示<

/legend>

账号:

inputtype="

text"

id="

u"

name="

value="

1"

/>

br/>

密码:

p"

submit"

s"

提交"

/fieldset>

/form>

/div>

/body>

/html>

4.1.2

采用PDO连接数据库

$host='

127.0.0.1'

$user="

person"

$password="

$dbname="

test"

$port="

3306"

try{

$DSN="

host=$host;

dbname=$dbname"

$pdo=newPDO($DSN,$user,$password);

$pdo->

query('

setnamesUTF8'

ATTR_ERRMODE,PDO:

ERRMODE_EXCEPTION);

}catch(PDOException$e){

echo'

error:

'

.$e->

getMessage();

4.1.3

登录功能处理页面

php

include'

safe_class.php'

db.config.php'

header("

Content-Type:

text/html;

error_reporting

(1);

$user=$_POST['

u'

];

$pwd=$_POST['

p'

$sql="

SELECT*FROMusersWHEREu='

.$user."

ANDp='

.$pwd."

$userArr=$pdo->

query($sql)->

if($userArr)

登录成功!

}else

登录失败!

4.2注入测试

4.2.1通过注入实现登录

在用户名处录入:

or1=1--

点击提交,提示:

登录成功!

4.2.2通过注入判断订单表的名称

And(Selectcount(*)fromorder)<

0--

点击提交,程序报错,如下图

说明表名不是order。

点击提交,程序未报错,提示:

说明订单表的名称是:

orders。

4.3防止Sql注入

4.3.1在登录功能页面中加入请求转义功能

代码:

safe:

tranRequest();

4.3.2再次注入测试,检测对请求转义后的防Sql注入性能

登录失败。

防Sql注入成功。

0--

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 调查报告

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1