|
篇一: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
转载请保留,谢谢! |
|