您的位置:百味书屋 > 范文大全 > 经典范文 > PHP数据过滤函数 正文

PHP数据过滤函数

2017-01-16 06:43:45 来源网站: 百味书屋

篇一:php过滤提交数据 防止sql注入攻击

php过滤提交数据 防止sql注入攻击 在SQL注入攻击 中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中。例如,假设有一个简单的登录数据库。这个数据库中的每个记录都有一个用户名字段和一个密码字段。构建一个登录表单,让用户能够登录。

规则 1:绝不要信任外部数据或输入

关于 Web 应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在 PHP 代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 cookie)的任何数据都是不可信任的。 例如,下面的数据元素可以被认为是安全的,因为它们是在 PHP 中设置的。 清单 1. 安全无暇的代码

$myUsername = ‘tmyer’;

$arrayUsers = array(’tmyer’, ‘tom’, ‘tommy’);

define(”GREETING”, ‘hello there’ . $myUsername);

?>

但是,下面的数据元素都是有瑕疵的。

清单 2. 不安全、有瑕疵的代码

$myUsername = $_POST[’username’]; //tainted!

$arrayUsers = array($myUsername, ‘tom’, ‘tommy’); //tainted!

define(”GREETING”, ‘hello there’ . $myUsername); //tainted!

?>

为 什么第一个变量 $myUsername 是有瑕疵的?因为它直接来自表单 POST。用户可以在这个输入域中输入任何字符串,包括用来清除文件或运行以前上传的文件的恶意命令。您可能会问,“难道不能使用只接受字母 A-Z 的客户端(Javascrīpt)表单检验脚本来避免这种危险吗?”是的,这总是一个有好处的步骤,但是正如在后面会看到的,任何人都可以将任何表单下载 到自己的机器上,修改它,然后重新提交他们需要的任何内容。

解决方案很简单:必须对 $_POST[’username’] 运行清理代码。如果不这么做,那么在使用 $myUsername 的任何其他时候(比如在数组或常量中),就可能污染这些对象。

对用户输入进行清理的一个简单方法是,使用正则表达式来处理它。在这个示例中,只希望接受字母。将字符串限制为特定数量的字符,或者要求所有字母都是小写的,这可能也是个好主意。

清单 3. 使用户输入变得安全

$myUsername = cleanInput($_POST[’username’]); //clean!

$arrayUsers = array($myUsername, ‘tom’, ‘tommy’); //clean!

define(”GREETING”, ‘hello there’ . $myUsername); //clean!

function cleanInput($input){

$clean = strtolower($input);

$clean = preg_replace(”/[^a-z]/”, “”, $clean);

$clean = substr($clean,0,12);

return $clean;

}

?>

规则 2:禁用那些使安全性难以实施的 PHP 设置

已经知道了不能信任用户输入,还应该知道不应该信任机器上配置 PHP 的方式。例如,要确保禁用

register_globals。如果启用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替

换同名的 GET 或 POST 字符串。通过禁用这个设置,PHP 强迫您在正确的名称空间中引用正确的变量。要使用来自表单 POST 的变量,应该引用 $_POST[’variable’]。这样就不会将这个特定变量误会成 cookie、会话或 GET 变量。

规则 3:如果不能理解它,就不能保护它

一些开发人员使用奇怪的语法,或者将语句组织得很紧凑,形成简短但是含义模糊的代码。这种方式可能效率高,但是如果您不理解代码正在做什么,那么就无法决定如何保护它。

例如,您喜欢下面两段代码中的哪一段?

清单 4. 使代码容易得到保护

//obfuscated code

$input = (isset($_POST[’username’]) ? $_POST[’username’]:”);

//unobfuscated code

$input = ”;

if (isset($_POST[’username’])){

$input = $_POST[’username’];

}else{

$input = ”;

}

?>

在第二个比较清晰的代码段中,很容易看出 $input 是有瑕疵的,需要进行清理,然后才能安全地处理。 规则 4:“纵深防御” 是新的法宝

本教程将用示例来说明如何保护在线表单,同时在处理表单的 PHP 代码中采用必要的措施。同样,即使使用 PHP regex 来确保 GET 变量完全是数字的,仍然可以采取措施确保 SQL 查询使用转义的用户输入。 纵深防御不只是一种好思想,它可以确保您不会陷入严重的麻烦。

既然已经讨论了基本规则,现在就来研究第一种威胁:SQL 注入攻击。

防止SQL注入攻击

在SQL注入攻击 中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中。例如,假设有一个简单的登录数据库。这个数据库中的每个记录都有一个用户名字段和一个密码字段。构建一个登录表单,让用户能够登录。

清单 5. 简单的登录表单

Username

Password

这个表单接受用户输入的用户名和密码,并将用户输入提交给名为 verify.php 的文件。在这个文件中,PHP 处理来自登录表单的数据,如下所示:

清单 6. 不安全的 PHP 表单处理代码

$okay = 0;

$username = $_POST[’user’];

$pw = $_POST[’pw’];

$sql = “select count(*) as ctr from users where username=’”.$username.”‘ and password=’”. $pw.”‘ limit 1″;

$result = mysql_query($sql);

while ($data = mysql_fetch_object($result)){

if ($data->ctr == 1){

//they’re okay to enter the application!

$okay = 1;

}

}

if ($okay){

$_SESSION[’loginokay’] = true;

header(”index.php”);

}else{

header(”login.php”);

}

?>

这段代码看起来没问题,对吗?世界各地成百(甚至成千)的 PHP/MySQL 站点都在使用这样的代码。它错在哪里?好,记住 “不能信任用户输入”。这里没有对来自用户的任何信息进行转义,因此使应用程序容易受到攻击。具体来说,可能会出现任何类型的 SQL 注入攻击。

例如,如果用户输入 foo 作为用户名,输入 ‘ or ‘1′=’1 作为密码,那么实际上会将以下字符串传递给 PHP,然后将查询传递给 MySQL:

$sql = “select count(*) as ctr from users where username=’foo’ and password=” or ‘1′=’1′ limit 1″;

?>

这个查询总是返回计数值 1,因此 PHP 会允许进行访问。通过在密码字符串的末尾注入某些恶意 SQL,黑客就能装扮成合法的用户。

篇二:PHP Filter 函数

PHP Filter 函数

PHP Filter 简介

PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤。

安装

filter 函数是 PHP 核心的组成部分。无需安装即可使用这些函数。

PHP Filter 函数

PHP:指示支持该函数的最早的 PHP 版本。

篇三:PHP函数大全

PHP常用函数大全

字符串函数(important) addcslashes – 像C语言一样使用反斜线转义字符串中的字符 addslashes -- 使用反斜线引用字符串

★bin2hex -- 将二进制数据转换成十六进制表示 chop -- rtrim() 的别名函数

★★chr -- 返回相对应于 ascii 码值所指定的单个字符。 chunk_split -- 将字符串分割成小块 convert_cyr_string -- 将字符由一种 Cyrillic 字符转换成另一种 convert_uudecode -- Decode a uuencoded string convert_uuencode -- Uuencode a string count_chars -- 返回字符串所用字符的信息 crc32 -- 计算一个字符串的 crc32 多项式 crypt – 将字符串用DES编码加密

★★★★★echo – 输出一个或者是多个字符串

★★★★★explode -- 使用一个字符串分割另一个字符串 fprintf – 格式化一个字符串并输出 get_html_translation_table -- Returns the translation table used by htmlspecialchars() and htmlentities() hebrev -- Convert logical Hebrew text to visual text hebrevc -- Convert logical Hebrew text to visual text with newline conversion

★★★html_entity_decode – 将所有的HTML实体转换成对应的字符 ★★★htmlentities – 将所有的字符转换成HTML实体

★★★htmlspecialchars_decode -- 将特定的HTML实体转换为相应的字符 ★★★htmlspecialchars -- 将特定的字符转换成HTML实体 ★★★★★implode – 将一个数组的所有元素连接成一个字符串 join -- implode()函数的别名 levenshtein -- Calculate Levenshtein distance between two strings localeconv -- Get numeric formatting information

★★★★★ltrim -- 去除一个字符串左边的空白(或者是其他的字符) md5_file – 将一个给定的文件用MD5编码

★★★★★md5 -- 将一个给定的字符串用MD5编码 metaphone -- Calculate the metaphone key of a string money_format – 将一个数字按照货币的格式进行格式化nl_langinfo -- Query language and locale information nl2br -- 在字符串中插入HTML换行标签。 number_format -- Format a number with grouped thousands ★★ord – 返回一个字符的ASCII值

parse_str -- 解析字符串变量

★★★★print – 输出一个字符串

★★★★printf – 格式化并输出该字符串 quoted_printable_decode -- Convert a quoted-printable string to an 8 bit string quotemeta -- Quote meta characters

★★★★★rtrim -- 去除一个字符串右边的空白(或者是其他的字符) setlocale -- Set locale information sha1_file – 将一个文件用SHA1进行编码(加密) sha1 -- 将一个字符串用SHA1进行编码(加密) similar_text -- 计算两个字符串之间的相似性 soundex --计算一个字符串的soundex key sprintf – 返回一个格式化后的字符串 sscanf -- Parses input from a string according to a format str_ireplace -- Case-insensitive version of str_replace().

str_rot13 -- Perform the rot13 transform on a string str_shuffle -- Randomly shuffles a string

★★★★★str_split -- 将一个字符串转换成一个数组

★★★str_word_count -- 返回一个字符串中单词的个数

strcasecmp -- Binary safe case-insensitive string comparison strchr -- strstr() 的别名

strcmp – 字符串比较(二进制字符串比较)

strcoll -- Locale based string comparison strcspn -- Find length of initial segment not matching mask ★★★★★strip_tags – 将一个字符串中的HTML和PHP标记去除 stripcslashes -- 去除使用像C语言方式添加的反斜杠。

★★★★★stripos -- Find position of first occurrence of a

case-insensitive string在字符串中不区分大小写的查找字符(或者字符串)第一次出现的位置 stripslashes -- 去除使用函数addslashes()添加的反斜杠。

stristr -- Case-insensitive strstr()

★★★★★strlen –取得字符串的长度 strnatcasecmp -- Case insensitive string comparisons using a "natural order" algorithm strnatcmp -- String comparisons using a "natural order" algorithm ★★★★strncasecmp -- 区分大小写比较两个字符串。

strncmp -- Binary safe string comparison of the first n characters strpbrk -- Search a string for any of a set of characters

★★★★strpos -- 查找一个字符在一个字符串中第一次出现的位置。

★★★★★strrchr – 返回从某字符最后一次出现的位置开始一直到字符串结束的子串。

★★★strrev – 将字符串颠倒输出

★★★★★strripos -- 返回某字符在字符串中最后一次出现的位置(不区分大小写)。

★★★★★strrpos -- 返回某字符在字符串中最后一次出现的位置(区分大小写)。 strspn -- Find length of initial segment matching mask

★★★★★strstr – 返回从某字符第一次出现的位置开始一直到字符串结束的子串(包含该字符)。 strtok -- Tokenize string

★★★strtolower –将字符串所有字符转换为小写

★★★strtoupper – 将字符串所有字符转换为大写 strtr -- Translate certain characters substr_compare -- Binary safe optionally case insensitive comparison of 2 strings from an offset, up to length characters

★★★substr_count –计算子串出现的次数(区分大小写) substr_replace – 字串替换

★★★★★substr – 返回指定位置的字串

★★★★★trim – 去掉字符串左右两边的空白(或者其他字符)

★★★ucfirst – 使一个字符串的第一个字符大写

★★★ucwords -- 将一个字符串的每个单词的第一个字母大写 vfprintf -- Write a formatted string to a stream vprintf – 输出一个格式化后的字符串 vsprintf – 返回一个格式化后的字符串

★★★wordwrap -- 使字符串在指定位置换行

例子:

数组函数(important) array_change_key_case -- 返回字符串键名全为小写或大写的数组 array_chunk -- 将一个数组分割成多个 array_combine -- 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 array_count_values -- 统计数组中所有的值出现的次数 array_diff_assoc -- 带索引检查计算数组的差集 array_diff_key -- 使用键名比较计算数组的差集 array_diff_uassoc -- 用用户提供的回调函数做索引检查来计算数组的差集 array_diff_ukey -- 用回调函数对键名比较计算数组的差集 array_diff -- 计算数组的差集 array_fill -- 用给定的值填充数组 array_filter -- 用回调函数过滤数组中的单元 array_flip -- 交换数组中的键和值

array_intersect_assoc -- 带索引检查计算数组的交集 array_intersect_key -- 使用键名比较计算数组的交集 array_intersect_uassoc -- 带索引检查计算数组的交集,用回调函数比较索引 array_intersect_ukey -- 用回调函数比较键名来计算数组的交集 array_intersect -- 计算数组的交集 array_key_exists -- 检查给定的键名或索引是否存在于数组中 array_keys -- 返回数组中所有的键名 array_map -- 将回调函数作用到给定数组的单元上 array_merge_recursive -- 递归地合并一个或多个数组

★★★★★array_merge -- 合并一个或多个数组 array_multisort -- 对多个数组或多维数组进行排序 array_pad -- 用值将数组填补到指定长度

★★★★★array_pop -- 将数组最后一个单元弹出(出栈) array_product -- 计算数组中所有值的乘积

★★★★★array_push -- 将一个或多个单元压入数组的末尾(入栈) ★★★array_rand -- 从数组中随机取出一个或多个单元 array_reduce -- 用回调函数迭代地将数组简化为单一的值

★★★array_reverse -- 返回一个单元顺序相反的数组

★★★★★array_search -- 在数组中搜索给定的值,如果成功则返回相应的键名 array_shift -- 将数组开头的单元移出数组 array_slice -- 从数组中取出一段 array_splice -- 把数组中的一部分去掉并用其它值取代

★★★array_sum -- 计算数组中所有值的和 array_udiff_assoc -- 带索引检查计算数组的差集,用回调函数比较数据 array_udiff_uassoc -- 带索引检查计算数组的差集,用回调函数比较数据和索引 array_udiff -- 用回调函数比较数据来计算数组的差集 array_uintersect_assoc -- 带索引检查计算数组的交集,用回调函数比较数据 array_uintersect_uassoc -- 带索引检查计算数组的交集,用回调函数比较数据和索引 array_uintersect -- 计算数组的交集,用回调函数比较数据

★★★★★array_unique -- 移除数组中重复的值 array_unshift -- 在数组开头插入一个或多个单元 array_values -- 返回数组中所有的值 array_walk_recursive -- 对数组中的每个成员递归地应用用户函数 array_walk -- 对数组中的每个成员应用用户函数

★★★★★array -- 新建一个数组

★★★★★★★★★★arsort -- 对数组进行逆向排序并保持索引关系 ★★★★★★★★★★asort -- 对数组进行排序并保持索引关系 compact -- 建立一个数组,包括变量名和它们的值 count -- 计算数组中的单元数目或对象中的属性个数

★★★★current -- 返回数组中的当前单元

★★★★★each -- 返回数组中当前的键/值对并将数组指针向前移动一步

★★★★end -- 将数组的内部指针指向最后一个单元 extract -- 从数组中将变量导入到当前的符号表

★★★★★★★★★★in_array -- 检查数组中是否存在某个值

★★★★★key -- 从关联数组中取得键名

★★★★★★★★★★krsort -- 对数组按照键名逆向排序

★★★★★★★★★★ksort -- 对数组按照键名排序

★★★★list -- 把数组中的值赋给一些变量 natcasesort -- 用“自然排序”算法对数组进行不区分大小写字母的排序 natsort -- 用“自然排序”算法对数组排序

★★★★next -- 将数组中的内部指针向前移动一位 pos -- current() 的别名

★★★★prev -- 将数组的内部指针倒回一位 range -- 建立一个包含指定范围单元的数组

★★★★★reset -- 将数组的内部指针指向第一个单元

★★★★★rsort -- 对数组逆向排序 shuffle -- 将数组打乱

★★★★★★★★★★sizeof -- count() 的别名

★★★★★sort -- 对数组排序 uasort -- 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 uksort -- 使用用户自定义的比较函数对数组中的键名进行排序 usort -- 使用用户自定义的比较函数对数组中的值进行排序

日历函数 cal_days_in_month -- Return the number of days in a month for a given year and calendar cal_from_jd -- Converts from Julian Day Count to a supported calendar cal_info -- Returns information about a particular calendar cal_to_jd -- Converts from a supported calendar to Julian Day Count easter_date -- Get Unix timestamp for midnight on Easter of a given year easter_days -- Get number of days after March 21 on which Easter falls for a given year FrenchToJD -- Converts a date from the French Republican Calendar to a Julian Day Count GregorianToJD -- Converts a Gregorian date to Julian Day Count JDDayOfWeek -- Returns the day of the week JDMonthName -- Returns a month name JDToFrench -- Converts a Julian Day Count to the French Republican Calendar JDToGregorian -- Converts Julian Day Count to Gregorian date jdtojewish -- Converts a Julian day count to a Jewish calendar date JDToJulian -- Converts a Julian Day Count to a Julian Calendar Date jdtounix -- Convert Julian Day to Unix timestamp


PHP数据过滤函数》出自:百味书屋
链接地址:http://www.850500.com/news/70963.html
转载请保留,谢谢!
查看更多相关内容>>PHP数据过滤函数
相关文章
  • PHP数据过滤函数

    php过滤提交数据防止sql注入攻击php过滤提交数据防止sql注入攻击在SQL注入攻击中,用户通过操纵表单或GET查询字符串,将信息添加到数据库查询中。例如,假设有一个简单的登录数据...