防止MySQL注入或HTML表单滥用的PHP程序


Posted in PHP onJanuary 21, 2009

MySQL注入的意图是接管网站数据库并窃取信息。常见的开源数据库,如MySQL,已经被许多网站开发人员用来储存重要信息,如密码,个人信息和管理信息。
MySQL之所以流行,是因为它与最流行的服务器端脚本语言PHP一起使用。而且,PHP是主导互联网的Linux- Apache服务器的主要语言。因此,这意味着黑客可以很容易地利用PHP就像Windows的间谍软件一样。
黑客向一个无担保的网页表单输入大量恶意代码(通过下拉菜单,搜索框,联系表单,查询表单和复选框)。
恶意代码将被送到MySQL数据库,然后“注入”。要查看这个过程,首先考虑以下基本的MySQL SELECT查询语句:
SELECT * FROM xmen WHERE username = ‘wolverine'
此查询会向有“xmen”表的数据库要求返回某一段MySQL中用户名为“wolverine”的数据。
在Web表单中,用户将输入wolverine,然后这些数据将被传到MySQL查询。
如果输入无效,黑客还有其他方法控制数据库,如设置用户名:
‘ OR '‘='‘
你可能认为使用正常的PHP和MySQL句法执行输入是安全的,因为每当有人输入恶意代码,他们将会得到一个“无效的查询”的消息,但事实并非如此。黑客很聪明,且因为涉及数据库清理和重设管理权限,任何一个安全漏洞都不容易纠正。
两种对MySQL注入攻击的常见误解如下:
1.网管认为恶意注入可用防病毒软件或反间谍软件清理。事实是,这种类型的感染利用了MySQL数据库的弱点。它不能简单地被任何反间谍软件或防病毒程序删除。
2. MySQL注入是由于复制了从另一台服务器或外部来源被感染的文件。事实并非如此。这种类型的感染是由于有人将恶意代码输入到网站不受保护表单,然后访问数据库。MySQL注入可通过删除恶意脚本清除掉,而不是使用防病毒程序。
用户输入验证流程
备份一个清洁的数据库,并放置在服务器外。输出一套MySQL表并保存在桌面。
然后转到服务器,先暂时关闭表单输入。这意味着表单不能处理数据,网站被关闭了。
然后启动清理进程。首先,在您的服务器上,清理遗留的混乱的MySQL注入。更改所有的数据库,FTP和网站的密码。
在最坏的情况下,如果你清理迟了,你可以再次检查在您服务器上运行的隐藏程序。这些隐藏程序是黑客安装的木马。将其完全删除并更改所有FTP权限。扫描服务器上所有木马程序和恶意软件。
当您修改PHP脚本程序时,将处理表单数据。防止MySQL注入的一个好办法是:连用户数据也不信任。用户输入验证对于防止MySQL注入是相当重要的。
设计一个过滤器筛选出用户输入,以下是几点提示:
1.输入到表单的是数字。你可以通过测试它等于或大于0.001 (假设你不接受一个零)验证它是不是数字。
2.如果是Email地址。验证其是否由允许的字符组合构成,如“ @ ” ,A-Z,a-z或一些数字。
3.如果是人名或用户名。可以通过是否包含任何非法字符验证它,如and和*,是可用于SQL注入的恶意字符。
验证数字输入
下面的脚本验证了是否输入一个从0.001至无限大的有效数字。值得一提的是,在一个PHP程序中,甚至可以允许使用一定范围内的数字。使用此验证脚本可确保输入到表单的只是一个数字。
假设在程序中有三个数字变量;您需要将它们进行验证,我们将它们命名num1 , num2和num3:

//Validate numerical input 
if($_POST['num1'] >= 0.001 && $_POST['num2'] >= 0.001 && $_POST['num3'] >= 0.001) 

{ 

} 

else 

{ 

} 

?>

And条件可被延长到能容纳超过三个数字。所以,如果你有10个,您将只需要扩展AND语句。
这可以用来验证一个只接受数字的表单,如合同数量,许可证号码,电话号码等。
验证文字和邮件地址的输入
以下可以用于验证诸如用户名,名字以及电子邮件地址的表单输入:
//Validate text input 
if (! preg_match('/^[-a-z.-@,'s]*$/i',$_POST['name'])) 

{ 

} 

else 

if ($empty==0) 

{ 

} 

else 

{ 

} 

?>

该验证脚本的一个优点是,它不接受空白输入。一些恶意用户还通过空白投入操纵数据库。使用上面的脚本,只验证一个文字变量, “ $name”。这意味着,如果有三个文字变量,你可以分别对每个变量设置一个验证脚本,以确保每一个变量都在进入数据库前通过了审查。
PHP 相关文章推荐
分享下页面关键字抓取components.arrow.com站点代码
Jan 30 PHP
php生成rss类用法实例
Apr 14 PHP
PHP的Yii框架中View视图的使用进阶
Mar 29 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
May 26 PHP
PHP session会话操作技巧小结
Sep 27 PHP
php版微信js-sdk支付接口类用法示例
Oct 12 PHP
2017年最好用的9个php开发工具推荐(超好用)
Oct 23 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
PHP的PDO错误与错误处理
Jan 27 PHP
Swoole 5将移除自动添加Event::wait()特性详解
Jul 10 PHP
详解no input file specified 三种解决方法
Nov 29 PHP
yii2.0框架多模型操作示例【添加/修改/删除】
Apr 13 PHP
php 动态多文件上传
Jan 18 #PHP
PHP $_SERVER详解
Jan 16 #PHP
php 删除数组元素
Jan 16 #PHP
php完全过滤HTML,JS,CSS等标签
Jan 16 #PHP
php array_flip() 删除数组重复元素
Jan 14 #PHP
PHP mkdir()定义和用法
Jan 14 #PHP
php array_intersect()函数使用代码
Jan 14 #PHP
You might like
国内php原创论坛
2006/10/09 PHP
编写Smarty插件在模板中直接加载数据的详细介绍
2013/06/26 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
PHP 获取客户端 IP 地址的方法实例代码
2018/11/11 PHP
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
2014/07/23 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
jquery图片切换插件
2015/03/16 Javascript
详细分析JavaScript变量类型
2015/07/08 Javascript
html判断当前页面是否在iframe中的实例
2016/11/30 Javascript
Angular.Js中过滤器filter与自定义过滤器filter实例详解
2017/05/08 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
JQuery 又谈ajax局部刷新
2017/11/27 jQuery
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
小程序云开发初探(小结)
2018/10/24 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
vue项目中使用scss的方法步骤
2019/05/16 Javascript
使用python爬取B站千万级数据
2018/06/08 Python
Python读取英文文件并记录每个单词出现次数后降序输出示例
2018/06/28 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
详解python datetime模块
2020/08/17 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
Oroton中国官网:澳洲知名奢侈配饰品牌
2017/03/26 全球购物
BAILEY 44官网:美国制造的女性服装
2019/07/01 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
Linux的文件类型
2012/03/07 面试题
党的群众路线对照检查材料
2014/08/27 职场文书
安全承诺书
2015/01/19 职场文书
城管个人总结
2015/02/28 职场文书
工作失职检讨书范文
2015/05/05 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
如何使用PostgreSQL进行中文全文检索
2021/05/27 PostgreSQL