0

0

php表单提交程序的安全使用方法_php技巧

PHP中文网

PHP中文网

发布时间:2016-05-17 09:36:19

|

1242人浏览过

|

来源于php中文网

原创

是对一个接收自由提交表单数据的文件进行安全性分析,希望对各位有帮助。首先说明一下,代码中的error()和succeed()是我自定义的函数

用于显示错误信息和成功信息,其实也可以直接echo出错误信息,这里我只是想我的出错信息页面漂亮点,定义了一个页面输出的函数罢了。 

php
// savecomment.php// 大家先不要看注释,看完本文后,再回过头来看
require ("config.php");
mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");
$name=$_POST['name'];
$content=$_POST['content'];
$blogid=$_POST['blogid'];
$datearray=getdate(time());
$date=date("Y-m-d h:i:s",$datearray[0]);
if (!empty($name) && !empty($content)){               
//用empty函数判断表单非空的话则往下。        
if(strlen($name) > 20){         
//通过非空判断则开始判断$name的长度。        
error(“名字超过20个字节(20个英文或10个汉字)
”);      
}        
f(!is_numeric($_POST['blogid'])){               
error(“隐藏数据被非法修改过,请返回
”);
        }        
//由于$blogid待会是要放进select的,此变量是用来标示评论是属于哪篇文章,它是int类型,虽说是隐藏变量,但攻击者也是可以在本地修改远程提交的,所以我们在放进select之前需要检查类型。        
$blogsql = "Select * FROM $comment_table Where blogid=$blogid"        
$blogresult = mysql_db_query($dbname, $blogsql);        
$blog = mysql_fetch_array($blogresult);        
if(strlen($name) == strlen($blog[name]) && strlen($content) == strlen($blog[content])){         
//查询数据库的两个字段的长度,因为名字长度可能相同,但两个都相同正常情况下出现的几率就相当小了,所以用&&同时判断。      
error(“你欲提交的内容评论里已存在,请返回
”);      
}        
//下面就开始判断时间间隔。更详细的说明请看文章后面内容。        
session_start();         
if(session_is_registered("time") && time()-$_SESSION['time']”);        
} else {        
$sql="Insert INTO $comment_table(date,name,content,blogid)        VALUES('$date','$name','$content','$blogid')"      
mysql_db_query($dbname,$sql);      
mysql_close();      
$time=time();        
session_register("time");        
succeed(“评论提交成功
”);   
     }}      
//结束非空的判断
error(“你没有填写完所有表单
”);
?>


上面是一个记录评论数据的文件。表单如下:

红技shop网上购物系统
红技shop网上购物系统

红技SHOP是一款智能化的通用型网络商城系统,取市面上众多的同类商城系统之精华,去除其它同类商品的不足之处和复杂烦琐的无用功能,用红技独有研发技术不断地加以提炼,使系统体积小而功能全面所有功能都能发辉作用。红技SHOP无论在系统稳定性、代码优化、运行效率、负荷能力、安全性能、功能可操控性和程序可维护性等方面都居国内外同类网上购系统商品的领先者。红技SHOP是专业的网络商城的WEB软件开发单位,因为

下载

复制代码 代码如下:



">
您的名字:
评论内容:



一个学习过PHP的人很容易就能看懂上面的代码,但为什么我要拿来分析,因为在我学习PHP期间,看了不少程序的代码,发现有个很普遍的问题,那就是大多数程序对于接受来自于表单的数据做的检查还是不够严谨,这恐怕是程序员思维问题,因为这些安全措施都是很容易实现的。
对于一个简单的评论功能,我们假设它有两个地方是需要用户填写的:评论人的姓名和评论内容。那么,我们需要判断的地方如下:
l        表单是否为空
l        表单长度(该项和上面的项判断称为逻辑性判断,凡事都要符合逻辑)
l        表单内容(判断记录是否存在于数据库内,防止重复提交)
l        隐藏变量的过滤(如果有的话,注意上面表单有一个隐藏变量type="hidden",这往往容易让人忽略)
l        提交时间间隔(这个是最最容易被忽略的)
逻辑判断很多人都做了,但这仅仅只是解决了程序的逻辑问题,作为安全的程序,我们还要从安全的角度进行判断,一个没有做过安全检查的此类程序,最容易受到以下攻击:
l        修改隐藏变量进行非法提交(比如注入)
l        重复提交(对Web程序进行DoS攻击)
编者注:重复提交所形成的攻击的确是个非常烦人的问题,虽然这种方法没有什么技术性可言,但却会让管理员伤透脑筋,因此很有必要在写代码时就加以防范。
修改隐藏变量通常是在本地构造一个表单,然后指定隐藏变量,如果过滤不到位,直接构造:
1' or 1=1 UNION Select * FROM any_table INTO OUTFILE 'c:/www/info.txt
然后提交,会有什么结果不用说了吧?
如果采用POST提交表单后刷新会出现提示,然后确定就可以反复提交,这样可以浪费服务器的资源,如果量大的话站点速度可能会受少许影响,特别是数据量大的搜索引擎。这就是小小表单未做安全过滤的结果,相信任何站点管理员也不想看到吧?所以我们就要进行防御。防御思路如下:
针对隐藏变量我们可以采用过滤,针对重复提交我们可以:
l        采用cookie/session进行提交时间间隔的判断;
l        提交前用strlen()函数判断欲提交的标题和内容是否和数据库里已有的一致;
l        完成提交后用Header("Location: url");跳转到其他页面
下面我们就对上面的savecomment.php的if代码段进行分析,关于针对修改变量攻击的防御代码大家可以看我在代码上的注释。对于采用cookie/session进行提交时间间隔的判断这两种方法,我有以下看法:
Cookie:信息存在客户端,利用工具可以修改、删除使Cookie失效,因为他是连续发送,中间的间隔时间很短,来不急去删除该Cookie的。但也不排除自己编段小程序来删除Cookie。如果对Cookie不放心可以采用Session。
Session:信息存放在服务器,攻击者不可能修改,但会占用服务器一丁点资源。我的服务器好,我就用Session,放心:)。
下面来看看分别用这两种方式验证的代码:
Cookie:

 程序代码
if (isset($_COOKIE['beforeid'])) {
error(“对不起,你两次提交的时间间隔还不到2分钟
”);
} else {
//先检查相关Cookie是否存在,已存在则给出错误提示,不存在则正确执行的代码段,比如插入Insert语句。执行完毕以后设置一个Cookie,表示已经提交过,60*2表示2分钟。
setcookie("beforeid",$blogid,time()+60*2,"/","",0);
succeed(“评论提交成功
”); }
?>

Session:

 程序代码
session_start();
if (session_is_registered("time") && time()-$_SESSION['time']error(“对不起,你两次提交的时间间隔还不到2分钟
”);
//$time 前一次提交的时间
} else {
//先检查相关Session是否存在,已存在则给出错误提示,不存在则正确执行的代码段,比如插入Insert语句。执行完毕以后设置一个Session,表示已经提交过,60*2表示2分钟。
$time=time();
session_register("time");
succeed(“评论提交成功
”);
}
?>
这种时间间隔的方法可以用于各种表单,比如搜索、留言等,它可以有效地控制程序的有序运行。
至于第三个思路是用Header("Location: url");跳转页面,我想既然加入了cookie/session验证就不必贸然跳转了,毕竟大家还是想看看提交的相关信息的。
怎么样?想不到小小的表单验证有这么大的学问吧?简单几行代码就切断让攻击者的路子,其实这些都很容易的,重要的是开发人员验证的思路,我一个人只会加 cookie/session验证这个思路,结合Envymask的判断长度这条思路,我又掌握一点。其实开发安全的程序,安全措施的思路很重要,即使掌握各种防御代码,但如果考虑不严谨,照样有空子可钻。
鄙人刚学PHP不到半个月。写的代码不够规范、严谨,在各位高手面前班门弄斧了。
后记:一个小小的程序,已经折射出了一些普遍存在的安全问题。在安全代码的编写过程中,仅仅注意以上问题还是远远不够的,不过很多重大脚本漏洞的出现却都是因为这种小问题引起的。平时可以看到,在一个脚本程序出现漏洞之后,往往一两句代码就可以将相关漏洞补得很严实了。脚本攻防是智者之间的较量,但是智者千虑,必有一失,所以相对于攻击来说,防范要做到滴水不漏就显得尤为困难。 

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

0

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

408

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

136

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

241

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

8

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

13

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

10

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

124

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 10万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.2万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号