PHP防SQL注入详细设计说明书Word格式文档下载.docx
- 文档编号:21297481
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:14
- 大小:87.89KB
PHP防SQL注入详细设计说明书Word格式文档下载.docx
《PHP防SQL注入详细设计说明书Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《PHP防SQL注入详细设计说明书Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
采用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--
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PHP SQL 注入 详细 设计 说明书