- 浏览: 417251 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
lanlansnss:
说真的。 木有看懂哇。
【辞职】你谂清楚未? -
fei441544558:
isset($_SESSION['submit_tim ...
PHP防止用户刷新页面,重复提交表单内容 -
ngn9999:
天下文章一大抄
flash遮盖div层在IE和FF下解决办法 -
阳光空气水:
嗯,原来是道友。
FireBug - Javascript 的調試工具 [轉載] -
osacar:
楼主的头像里人物是不是史艳文里的?
PHP程序如何防止站外提交数据
http://book.csdn.net/bookfiles/386/10038614376.shtml
对于用户输入的任何数据,如从表单提交中获取的数据,即使不考虑恶意企图,程序员也必须做最坏的打算。因此,程序员总是要面对检查数据是否正确及可用的问题。本章会展示一些在日常工作中能够发挥作用的算法与函数。
在检查数据正确性时,分解为两个步骤将会带来很大便利:一是将输入数据标准化,二是检查标准化之后的数据。输入数据的“标准化”就是将得到的数据调整为统一或是标准格式。各种信息本来都会有一些不同的表达方式,但对于特定的应用程序来说,它们都需要被转化为某种标准格式。之后,我们就可以对标准格式的数据应用有效性规则,从而确定输入的数据是可用的。
将数据检验分为两个步骤可以使过程更加简单和灵活。标准化过程只关心格式问题,程序可以让用户以更自由的方式提供信息,从而具有更高的用户友好度。当输入信息被标准化之后,检查过程就简单多了,因为信息格式是已知的。
当然,凡事皆有例外,有些场合就不适合这种标准化之后进行检验的方法。例如,有时表单输入是数据检验的组成部分,这样就打破了两个步骤的次序;如果输入信息不具有期望的格式,它就会立即变得无效。
下面这些范例都假设用户被要求以某种格式提供信息,而且没有其他程序对用户输入进行处理,范例中得到的数据是“原始的”。
快速提示
Ø 检查变量是否是数字或数字式字符串:
$success = is_numeric($variable);
如果变量是数字,或者是包含数字及符号、小数点、指数的字符串,这个函数就会返回True。
完整文档:http://php.net/is_numeric。
Ø 检查字符串是否只包含字母数字:
$success = ctype_alnum($string);
如果字符串里只包含字母或数字,这个函数就会返回True。
完整文档:http://php.net/ctype_alnum。
Ø 检查字符串是否只包含字母:
$success = ctype_alpha($string);
如果字符串里只包含字母“a”到“z”(不分大小写),函数就会返回True。
完整文档:http://php.net/ctype_alpha。
Ø 检查字符串里是否只包含数字:
$success = ctype_digit($string);
如果字符串里只包含字符“0”到“9”,函数就会返回True。注意,不允许有小数点。
完整文档:http://php.net/ctype_digit。
Ø 检查字符串里是否只包含十六进制数字:
$success = ctype_xdigit($string);
允许的字符是“0”到“9”和“a”到“f”(无论大小写)。
完整文档:http://php.net/ctype_xdigit。
Ø 检查字符串是否全是大写的或全是小写的:
$success = ctype_upper($string);
$success = ctype_lower($string);
如果字符串包含不同的大小写,函数就会返回False。
完整文档:http://php.net/ctype_upper和http://php.net/ctype_lower。
Ø 强制变量为指定类型:
$success = settype($variable, $type);
PHP利用其内部类型转化将变量强制为指定类型。如果转化不能实现,函数会返回False。
完整文档:http://php.net/settype。
Ø 使用类型转化将变量解释为特定类型:
$result = (typekeyword) $variable;
PHP将变量值从原始类型转化为typekeyword指定的类型。
完整文档:http://php.net/manual/language.types.type-juggling.php。
11.1 电话号码
本例中处理的电话号码是美国使用的标准格式,它包含三位区号,随后是三位局号,最后是四位数字。不幸的是,显示(及输入)这些数字的格式有很多种,如(999)555-0100、(999) 555-0100、9995550100、999.555.0100和999-555-0100。程序清单11.1.1可以接收上述(及其他)格式的数字,并且把它们标准化为最后一种形式,因为这便于计算机进行后续处理。
在检验电话号码时,除了确定它包含适当数量的数字之外,还有其他一些规则。例如,如果局号是555,那么后四位数字就不能在0100~0199之间,因为它们是被保留的。另外,区号不能以0或1开头,并且第二个数字不能为9。根据这些规则,我们就得到了如程序清单11.1.1所示的函数。
程序清单11.1.1 电话号码函数库
上述这些函数不允许电话号码以1开头,而有时人们确实会这样输入电话号码(因为美国的国家区号就是1)。如果想允许用户这样输入,只需要很简单的修改。最简单的方式是在标准化程序中删除号码前面的1就可以了,因为国内区号是不能以1开始的。
对于用户输入的任何数据,如从表单提交中获取的数据,即使不考虑恶意企图,程序员也必须做最坏的打算。因此,程序员总是要面对检查数据是否正确及可用的问题。本章会展示一些在日常工作中能够发挥作用的算法与函数。
在检查数据正确性时,分解为两个步骤将会带来很大便利:一是将输入数据标准化,二是检查标准化之后的数据。输入数据的“标准化”就是将得到的数据调整为统一或是标准格式。各种信息本来都会有一些不同的表达方式,但对于特定的应用程序来说,它们都需要被转化为某种标准格式。之后,我们就可以对标准格式的数据应用有效性规则,从而确定输入的数据是可用的。
将数据检验分为两个步骤可以使过程更加简单和灵活。标准化过程只关心格式问题,程序可以让用户以更自由的方式提供信息,从而具有更高的用户友好度。当输入信息被标准化之后,检查过程就简单多了,因为信息格式是已知的。
当然,凡事皆有例外,有些场合就不适合这种标准化之后进行检验的方法。例如,有时表单输入是数据检验的组成部分,这样就打破了两个步骤的次序;如果输入信息不具有期望的格式,它就会立即变得无效。
下面这些范例都假设用户被要求以某种格式提供信息,而且没有其他程序对用户输入进行处理,范例中得到的数据是“原始的”。
快速提示
Ø 检查变量是否是数字或数字式字符串:
$success = is_numeric($variable);
如果变量是数字,或者是包含数字及符号、小数点、指数的字符串,这个函数就会返回True。
完整文档:http://php.net/is_numeric。
Ø 检查字符串是否只包含字母数字:
$success = ctype_alnum($string);
如果字符串里只包含字母或数字,这个函数就会返回True。
完整文档:http://php.net/ctype_alnum。
Ø 检查字符串是否只包含字母:
$success = ctype_alpha($string);
如果字符串里只包含字母“a”到“z”(不分大小写),函数就会返回True。
完整文档:http://php.net/ctype_alpha。
Ø 检查字符串里是否只包含数字:
$success = ctype_digit($string);
如果字符串里只包含字符“0”到“9”,函数就会返回True。注意,不允许有小数点。
完整文档:http://php.net/ctype_digit。
Ø 检查字符串里是否只包含十六进制数字:
$success = ctype_xdigit($string);
允许的字符是“0”到“9”和“a”到“f”(无论大小写)。
完整文档:http://php.net/ctype_xdigit。
Ø 检查字符串是否全是大写的或全是小写的:
$success = ctype_upper($string);
$success = ctype_lower($string);
如果字符串包含不同的大小写,函数就会返回False。
完整文档:http://php.net/ctype_upper和http://php.net/ctype_lower。
Ø 强制变量为指定类型:
$success = settype($variable, $type);
PHP利用其内部类型转化将变量强制为指定类型。如果转化不能实现,函数会返回False。
完整文档:http://php.net/settype。
Ø 使用类型转化将变量解释为特定类型:
$result = (typekeyword) $variable;
PHP将变量值从原始类型转化为typekeyword指定的类型。
完整文档:http://php.net/manual/language.types.type-juggling.php。
11.1 电话号码
本例中处理的电话号码是美国使用的标准格式,它包含三位区号,随后是三位局号,最后是四位数字。不幸的是,显示(及输入)这些数字的格式有很多种,如(999)555-0100、(999) 555-0100、9995550100、999.555.0100和999-555-0100。程序清单11.1.1可以接收上述(及其他)格式的数字,并且把它们标准化为最后一种形式,因为这便于计算机进行后续处理。
在检验电话号码时,除了确定它包含适当数量的数字之外,还有其他一些规则。例如,如果局号是555,那么后四位数字就不能在0100~0199之间,因为它们是被保留的。另外,区号不能以0或1开头,并且第二个数字不能为9。根据这些规则,我们就得到了如程序清单11.1.1所示的函数。
程序清单11.1.1 电话号码函数库
// A function that will accept US phone numbers, in most every format // and standardize them to xxx-xxx-xxxx format. function standardize_phone($phone) { // First, remove all non-digits from the string $p = preg_replace('/[^0-9]/', '', $phone); // Now, break it into its appropriate parts and insert dashes. return substr($p, 0, 3) . '-' . substr($p, 3, 3) . '-' . substr($p, 6); } // A function to check for phone number validity // It requires a standardized number function validate_phone($phone) { // First split the number into 3 parts: $parts = explode('-', $phone); // If the middle is '555' if ($parts[1] == '555') { // Invalid if the final part is between 0100 and 0199 if (($parts[2] >= 100) && ($parts[2] < 200)) { return false; } } // Invalid if the first digit of the area code is 0 or 1 if ($parts[0] < 200) { return false; } // Invalid if the second digit of the area code, is 9 if ($parts[0]{1} == '9') { return false; } // Check that the last number has 4 characters: if (strlen($parts[2]) != 4) { return false; } // Otherwise, we made it, it's valid. return true; } // Standardize & validate some phone numbers: $phones = array('(108)355-4688', '354-555-0103', '294.423.8437', '301 867-5309', '424-726 739', '829-56628426'); foreach ($phones as $num) { $st = standardize_phone($num); $valid = validate_phone($st); $output = $valid ? 'Valid' : 'Invalid'; echo "<p>{$st} - {$output}</p>\n"; }
上述这些函数不允许电话号码以1开头,而有时人们确实会这样输入电话号码(因为美国的国家区号就是1)。如果想允许用户这样输入,只需要很简单的修改。最简单的方式是在标准化程序中删除号码前面的1就可以了,因为国内区号是不能以1开始的。
发表评论
-
高级PHP应用程序漏洞审核技术
2014-07-16 23:14 1257高级PHP应用程序漏洞审核技术 高级PHP应用程序 ... -
Apache服务器使用.htaccess实现图片防盗链教程
2011-10-24 16:45 1180所谓盗链,是指其他网 ... -
使用PHP 開源類來分析HTML
2011-07-20 17:43 1077Sourceforge上有一个PHP的分析类,可以从这里下载 ... -
启用Xdebug 和使用WinCacheGrind分析PHP腳本执行情況
2011-03-02 11:51 1418一、安装xdebug模块 1、去www.xdebug.org ... -
使用 mb_detect_encoding() 函数来判断字符串是什么编码的。
2011-02-19 21:06 1554原理: 使用 mb_detect_encoding() 函数 ... -
Cache_Lite 使用说明
2011-01-12 11:48 1442Cache_Lite (作者FabienMARTY . 译 ... -
PHP之中使用共享内存进行高速数据更新的一种方案 [转]
2010-12-29 22:14 1473作者:HonestQiao 如果在你 ... -
PHP 函数和过滤器(Filter)[转]
2010-12-28 15:55 1053http://www.w3school.com.cn/ph ... -
PHP大型Web应用入门(一) [转]
2010-12-26 23:42 953这里所说的“大型”应 ... -
高级PHP应用程序漏洞审核技术 [转]
2010-12-26 23:22 1423[目录] 1. 前言 2. 传 ... -
10位顶级PHP大师的开发原则 【轉】
2010-12-22 14:47 8451. 在合适的时候使用PHP – Rasmus Lerdo ... -
windows下php curl 的支持
2010-08-24 09:23 1827上次帮一个朋友安装Zen Cart, 发现需要curl的支持, ... -
PHP自动检测客戶端是否Mobile [轉載]
2010-04-21 11:56 1197<?php $mobile_browser ... -
pear安装及除错 [转]
2010-03-30 22:35 1670安装过程: 方法一: windows xp下安装pear ... -
支持中文的截取字符函数,不同编码下中文字符的范围一目了然
2009-08-18 09:19 1046这是一个简单的函数,或许对你我都有用吧。 以前也有类似的文章, ... -
APC(Alternative PHP Cache)學習文章收集
2009-04-16 11:24 1619I. 概述: Alternative Php Cache(AP ... -
php字符串处理函数讲解
2009-03-16 16:55 1409addcslashes —— 为字符串 ... -
php函数call_user_func和call_user_func_array函數使用
2009-03-10 17:35 3232call_user_func函数类似于一种特别的调用函数的 ... -
在PHP中處理xml文件
2009-03-09 15:40 1311<?php $xml = simplexml_lo ... -
PHP中的ob_start()_输出缓冲函數
2009-02-02 10:39 1500在PHP编程中, 我们经常会遇到一些直接产生输出的函数, 如p ...
相关推荐
数据结构_程序员考试,word方式分章节的数据结构,是程序员必读书,也是程序员考试用书
普通程序员如何转向AI方向普通程序员如何转向AI方向普通程序员如何转向AI方向普通程序员如何转向AI方向
数数据结构基础,专业程序员基础,介绍基本的数据结构常识课程。
程序员数据结构笔记!!!!!
程序员 数据结构 笔记 程序员 数据结构 笔记 程序员 数据结构 笔记
面向程序员的数据挖掘指南.pdf
数据结构 程序员考试 数据结构 程序员考试
如何做一个有素养的程序员如何做一个有素养的程序员如何做一个有素养的程序员如何做一个有素养的程序员如何做一个有素养的程序员如何做一个有素养的程序员如何做一个有素养的程序员如何做一个有素养的程序员如何做一...
程序员浏览器程序员浏览器程序员浏览器程序员浏览器程序员浏览器程序员浏览器程序员浏览器程序员浏览器
程序员代码面试指南 IT名企算法与数据结构题目最优解,算法全部代码,非常优秀,算法精妙,题目经典,欢迎下载。
程序员必须掌握的600个单词程序员必须掌握的600个单词程序员必须掌握的600个单词程序员必须掌握的600个单词程序员必须掌握的600个单词程序员必须掌握的600个单词
数据挖掘 程序员面试题 数据挖掘 程序员面试题 数据挖掘 程序员面试题 数据挖掘 程序员面试题
程序员工资程序员工资程序员工资程序员工资程序员工资程序员工资
数据挖掘一般是指从大量的数据中通过算法搜索隐藏于其中信息的过程。大多数数据挖掘的教材都专注于介绍理论基础,因而往往难以理解和学习。, 本书是写给程序员的一本数据挖掘指南,可以帮助读者动手实践数据挖掘、...
程序员必做的50题
看看你适合做程序员不? 看看里面的题目,就可以知道你有做程序员的天赋
VB转 VB。net 不错的文章 面向一些比较老的 VB程序员
程序员的数学,是针对程序员制定的数学教材,是程序的基础.其中第一部分是逻辑基础,属于初级程序员必读书籍
程序员代码面试指南 IT名企算法与数据结构题目最优解(书中代码)