整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

php预防sql注入和xss攻击

php预防sql注入和xss攻击
function xss_clean($data)
{
 // Fix &entity\n;
 $data=str_replace(array('&','<','>'),array('&','<','>'),$data);
 $data=preg_replace('/(&#*\w+)[\x00-\x20]+;/u','$1;',$data);
 $data=preg_replace('/(&#x*[0-9A-F]+);*/iu','$1;',$data);
 $data=html_entity_decode($data,ENT_COMPAT,'UTF-8');
 // Remove any attribute starting with "on" or xmlns
 $data=preg_replace('#(<[^>]+?[\x00-\x20"\'])(?:on|xmlns)[^>]*+>#iu','$1>',$data);
 // Remove javascript: and vbscript: protocols
 $data=preg_replace('#([a-z]*)[\x00-\x20]*=[\x00-\x20]*([`\'"]*)[\x00-\x20]*j[\x00-\x20]*a[\x00-\x20]*v[\x00-\x20]*a[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu','$1=$2nojavascript...',$data);
 $data=preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*v[\x00-\x20]*b[\x00-\x20]*s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:#iu','$1=$2novbscript...',$data);
 $data=preg_replace('#([a-z]*)[\x00-\x20]*=([\'"]*)[\x00-\x20]*-moz-binding[\x00-\x20]*:#u','$1=$2nomozbinding...',$data);
 // Only works in IE: <span style="width: expression(alert('Ping!'));"></span>
 $data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?expression[\x00-\x20]*\([^>]*+>#i','$1>',$data);
 $data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?behaviour[\x00-\x20]*\([^>]*+>#i','$1>',$data);
 $data=preg_replace('#(<[^>]+?)style[\x00-\x20]*=[\x00-\x20]*[`\'"]*.*?s[\x00-\x20]*c[\x00-\x20]*r[\x00-\x20]*i[\x00-\x20]*p[\x00-\x20]*t[\x00-\x20]*:*[^>]*+>#iu','$1>',$data);
 // Remove namespaced elements (we do not need them)
 $data=preg_replace('#</*\w+:\w[^>]*+>#i','',$data);
 do
 {
 // Remove really unwanted tags
 	 $old_data=$data;
 $data=preg_replace('#</*(?:applet|b(?:ase|gsound|link)|embed|frame(?:set)?|i(?:frame|layer)|l(?:ayer|ink)|meta|object|s(?:cript|tyle)|title|xml)[^>]*+>#i','',$data);
 }while($old_data!==$data);
 // we are done...
 return $data;
}



//php防注入和XSS攻击通用过滤. 
 
function SafeFilter (&$arr) 
{
 
 $ra=Array('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/','/script/','/javascript/','/vbscript/','/expression/','/applet/','/meta/','/xml/','/blink/','/link/','/style/','/embed/','/object/','/frame/','/layer/','/title/','/bgsound/','/base/','/onload/','/onunload/','/onchange/','/onsubmit/','/onreset/','/onselect/','/onblur/','/onfocus/','/onabort/','/onkeydown/','/onkeypress/','/onkeyup/','/onclick/','/ondblclick/','/onmousedown/','/onmousemove/','/onmouseout/','/onmouseover/','/onmouseup/','/onunload/');
 
 if (is_array($arr))
 {
 foreach ($arr as $key=> $value) 
 {
 if (!is_array($value))
 {
 if (!get_magic_quotes_gpc()) //不对magic_quotes_gpc转义过的字符使用addslashes(),避免双重转义。
 {
 $value=addslashes($value); //给单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)加上反斜线转义
 }
 $value=preg_replace($ra,'',$value); //删除非打印字符,粗暴式过滤xss可疑字符串
 $arr[$key]=htmlentities(strip_tags($value)); //去除 HTML 和 PHP 标记并转换为 HTML 实体
 }
 else
 {
 SafeFilter($arr[$key]);
 }
 }
 }
}

符串与数组的相互转换

字符串转换为数组

在PHP中,explode() 函数用于将字符串拆分为数组,根据指定的分隔符将字符串分割成多个部分。

下面是 explode() 函数的语法:

array explode ( string $delimiter , string $string [, int $limit=PHP_INT_MAX ] )

参数说明:

$delimiter:指定的分隔符,用于将字符串拆分成多个部分。

$string:要进行拆分的字符串。

$limit(可选):指定返回的数组元素数量的限制。如果设置了该参数,将返回的数组元素数量不超过该限制。如果省略或设置为 PHP_INT_MAX,则不限制返回的数组元素数量。

下面是一个示例,演示了如何使用 explode() 函数将字符串拆分成数组:

$string="apple,banana,orange";
$fruits=explode(",", $string);

print_r($fruits);

输出:

Array
(
    [0]=> apple
    [1]=> banana
    [2]=> orange
)

在上面的示例中,我们使用 , 作为分隔符将字符串 $string 拆分成数组 $fruits。拆分后的数组包含了每个水果作为一个元素。

需要注意的是,explode() 函数是区分大小写的,因此分隔符和目标字符串中的字母大小写必须完全匹配才能正确拆分字符串。


数组转换为字符串

在 PHP 中,join() 和 implode() 函数用于将数组的元素连接成一个字符串。

这两个函数实际上是同一个函数的别名,它们的作用完全相同,只是函数名不同而已。

下面是 implode() / join() 函数的语法:

string implode ( string $glue , array $pieces )

string join ( string $glue , array $pieces )

参数说明:

$glue:指定连接数组元素的字符串。

$pieces:要连接的数组。

返回值:

implode() / join() 函数返回一个字符串,其中包含了连接后的数组元素。

下面是一个示例,演示了如何使用 implode() / join() 函数:

$fruits=array("apple", "banana", "orange");
$string=implode(", ", $fruits);

echo $string;

在上面的示例中,我们使用 , 作为连接字符串的分隔符,将数组 $fruits 的元素连接成一个字符串 $string。

需要注意的是,分隔符是可选的,您可以根据需要选择合适的分隔符。如果不指定分隔符,implode() / join() 函数将直接将数组元素连接在一起。

总结来说,implode() 和 join() 是用于将数组元素连接成字符串的函数,它们的作用完全相同,只是函数名不同。您可以根据个人偏好选择使用其中任何一个。

字符串的查询与替换

substr

在 PHP 中,substr() 函数用于从字符串中获取指定的子字符串。

下面是 substr() 函数的语法:

string substr ( string $string , int $start [, int $length ] )

参数说明:

$string:要截取的字符串。

$start:指定截取的起始位置。如果为正数,则表示从字符串的左侧开始计数,索引从 0 开始;如果为负数,则表示从字符串的右侧开始计数,索引从 -1 开始。

$length(可选):指定截取的长度。如果省略该参数,则截取从起始位置到字符串末尾的所有字符。

返回值:

substr() 函数返回一个字符串,包含了从原始字符串中截取的子字符串。

下面是一些示例,演示了如何使用 substr() 函数:

$string="Hello, World!";
$substring1=substr($string, 0, 5);  // 从索引位置 0 开始,截取 5 个字符
$substring2=substr($string, 7);     // 从索引位置 7 开始,截取到末尾的所有字符
$substring3=substr($string, -6);    // 从右侧第 6 个字符开始,截取到末尾的所有字符

echo $substring1 . "\n";  // 输出:Hello
echo $substring2 . "\n";  // 输出:World!
echo $substring3 . "\n";  // 输出:World!

在上面的示例中,我们使用 substr() 函数从字符串 $string 中截取了不同的子字符串。可以看到,通过指定起始位置和长度,我们可以灵活地截取字符串的不同部分。

需要注意的是,substr() 函数对于多字节字符(如 UTF-8 编码的字符)可能会出现问题,因为它是按字节长度进行截取的。如果需要处理多字节字符,可以使用 mb_substr() 函数来确保正确处理字符的长度。

strstr

在 PHP 中,strstr() 函数用于在字符串中查找指定的子字符串,并返回从该子字符串开始到字符串末尾的部分。

下面是 strstr() 函数的语法:

string strstr ( string $haystack , mixed $needle [, bool $before_needle=false ] )

参数说明:

$haystack:要搜索的字符串。

$needle:要查找的子字符串。

$before_needle(可选):一个布尔值,用于指定是否返回 $needle 之前的部分。如果设置为 true,则返回 $needle 之前的部分;如果设置为 false(默认值),则返回 $needle 开始到字符串末尾的部分。

返回值:

strstr() 函数返回一个字符串,包含了从 $needle 开始到字符串末尾的部分。如果找不到 $needle,则返回 false。

下面是一些示例,演示了如何使用 strstr() 函数:

$string="Hello, World!";
$substring1=strstr($string, "World");      // 查找 "World" 并返回从它开始到字符串末尾的部分
$substring2=strstr($string, "World", true); // 查找 "World" 并返回它之前的部分

echo $substring1 . "\n";  // 输出:World!
echo $substring2 . "\n";  // 输出:Hello,

在上面的示例中,我们使用 strstr() 函数在字符串 $string 中查找子字符串 "World"。可以看到,通过指定子字符串并选择是否返回之前的部分,我们可以从原始字符串中获取所需的部分。

需要注意的是,strstr() 函数对大小写敏感。如果需要进行大小写不敏感的搜索,可以使用 stristr() 函数。此外,如果需要处理多字节字符(如 UTF-8 编码的字符),可以使用 mb_strstr() 函数来确保正确处理字符的长度。

strops

strpos() 函数用于在字符串中查找指定子字符串的第一次出现,并返回它的位置(索引)。

下面是 strpos() 函数的语法:

int strpos ( string $haystack , mixed $needle [, int $offset=0 ] )

参数说明:

$haystack:要搜索的字符串。

$needle:要查找的子字符串。

$offset(可选):指定搜索的起始位置。如果设置了偏移量,则从该位置开始搜索子字符串。

返回值:

如果找到子字符串,则返回它在 $haystack 中的位置(索引),该位置从 0 开始计数。

如果未找到子字符串,则返回 false。

下面是一个示例,演示了如何使用 strpos() 函数:

$string="Hello, World!";
$position=strpos($string, "World");

echo $position;  // 输出:7

在上面的示例中,我们使用 strpos() 函数在字符串 $string 中查找子字符串 "World"。函数返回子字符串的起始位置,即索引值 7。

需要注意的是,strpos() 函数对大小写敏感。如果需要进行大小写不敏感的搜索,可以使用 stripos() 函数。此外,如果需要查找子字符串的最后一次出现位置,可以使用 strrpos() 函数。

str_replace

str_replace() 函数用于在字符串中替换指定的子字符串。

下面是 str_replace() 函数的语法:

mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ]

参数说明:

$search:要搜索并替换的子字符串或子字符串数组。可以是一个字符串或一个字符串数组。

$replace:用于替换匹配子字符串的新字符串或新字符串数组。可以是一个字符串或一个字符串数组。

$subject:要在其中进行替换的原始字符串或原始字符串数组。可以是一个字符串或一个字符串数组。

$count(可选):如果提供了此参数,并且是一个变量,它将接收被替换的次数。

返回值:

如果 $subject 是一个字符串,则返回一个字符串,其中所有匹配的子字符串都被替换为相应的新字符串。

如果 $subject 是一个数组,则返回一个数组,其中所有元素都被替换为相应的新字符串。

下面是一些示例,演示了如何使用 str_replace() 函数:

$string="Hello, World!";
$newString=str_replace("World", "PHP", $string);

echo $newString;  // 输出:Hello, PHP!

在上面的示例中,我们使用 str_replace() 函数将字符串 $string 中的子字符串 "World" 替换为 "PHP",并将替换后的结果存储在 $newString 变量中。

str_replace() 函数还可以处理数组。下面是一个数组示例:

$fruits=array("apple", "banana", "orange");
$newFruits=str_replace("banana", "kiwi", $fruits);

print_r($newFruits);

输出:

Array
(
    [0]=> apple
    [1]=> kiwi
    [2]=> orange
)

在上面的示例中,我们使用 str_replace() 函数将数组 $fruits 中的元素 "banana" 替换为 "kiwi",并将替换后的新数组存储在 $newFruits 变量中。

需要注意的是,str_replace() 函数对大小写敏感。如果需要进行大小写不敏感的替换,可以使用 str_ireplace() 函数。

删除指定的字符串

trim

在 PHP 中,trim() 函数用于去除字符串两端的空白字符或指定的字符。

下面是 trim() 函数的语法:

string trim ( string $string [, string $characters=" \t\n\r>string trim ( string $string [, string $characters=" \t\n\r\0\x0B" ] )<\x0B" ] )

参数说明:

$string:要进行修剪的字符串。

$characters(可选):指定要移除的字符。默认情况下,会移除字符串两端的空白字符(包括空格、制表符、换行符、回车符、空字符和垂直制表符)。

返回值:

trim() 函数返回一个修剪后的字符串。

下面是一些示例,演示了如何使用 trim() 函数:

$string="   Hello, World!   ";
$trimmedString=trim($string);

echo $trimmedString;  // 输出:Hello, World!

在上面的示例中,我们使用 trim() 函数去除字符串 $string 两端的空白字符,得到修剪后的字符串。

您还可以通过指定第二个参数来自定义要移除的字符。例如:

$string="-Hello, World!--";
$trimmedString=trim($string, '-');

echo $trimmedString;  // 输出:Hello, World!

在上面的示例中,我们使用 trim() 函数去除字符串 $string 两端的连字符(-),得到修剪后的字符串。

需要注意的是,trim() 函数只移除字符串两端的字符,不会修改字符串中间的字符。如果需要移除字符串中间的特定字符,可以使用其他字符串处理函数(如 str_replace())来实现。

strip_tags

strip_tags() 函数用于从字符串中去除 HTML 和 PHP 标签,只保留纯文本内容。

下面是 strip_tags() 函数的语法:

string strip_tags ( string $str [, string $allowable_tags ] )

参数说明:

$str:要去除标签的字符串。

$allowable_tags(可选):指定允许保留的标签。如果提供此参数,它将指定允许保留的标签列表,其他标签将被完全移除。

返回值:

strip_tags() 函数返回一个去除了标签的字符串。

下面是一个示例,演示了如何使用 strip_tags() 函数:

$string="<p>Hello, <b>World</b>!</p>";
$strippedString=strip_tags($string);

echo $strippedString;  // 输出:Hello, World!

在上面的示例中,我们使用 strip_tags() 函数从字符串 $string 中去除 HTML 标签,得到纯文本内容。

您还可以通过提供第二个参数来指定允许保留的标签。例如:

$string="<p>Hello, <b>World</b>! This is a <a href='example.com'>link</a>.</p>";
$allowedTags="<b><a>";
$strippedString=strip_tags($string, $allowedTags);

echo $strippedString;  // 输出:Hello, <b>World</b>! This is a <a href='example.com'>link</a>.

在上面的示例中,我们使用 strip_tags() 函数从字符串 $string 中去除除 <b> 和 <a> 标签以外的所有标签,并保留这两个标签。

需要注意的是,strip_tags() 函数只能去除 HTML 和 PHP 标签,不能过滤或处理其他类型的标记语言。如果需要更复杂的标记处理,可以考虑使用专门的 HTML 解析库或过滤器。

解析url

获取get请求的参数

$_SERVER 是一个 PHP 超全局变量,用于存储有关服务器和请求的信息。它是一个关联数组,包含了诸如请求头、路径、脚本位置、服务器信息等等的键值对。

$_SERVER['QUERY_STRING']:当前请求的查询字符串部分。

parse_str() 函数用于将查询字符串解析为变量并存储在数组中。

parse_str($_SERVER['QUERY_STRING'], $arr);

这行代码将会解析 $_SERVER['QUERY_STRING'] 中的查询字符串,并将解析后的变量存储在 $arr 数组中。

例如,假设当前请求的 URL 是 example.com/index.php?name=John&age=25,$_SERVER['QUERY_STRING'] 的值为 "name=John&age=25"。使用 parse_str() 函数后,$arr 数组将包含以下内容:

$arr=[
    'name'=> 'John',
    'age'=> '25'
];

http_build_query

http_build_query() 函数用于将数组转换为 URL 编码的查询字符串。

下面是 http_build_query() 函数的语法:

string http_build_query ( mixed $query_data [, string $numeric_prefix=null [, string $arg_separator='&' [, int $enc_type=PHP_QUERY_RFC1738 ]]] )

参数说明:

$query_data:要转换为查询字符串的数组或对象。

$numeric_prefix(可选):如果数组具有数字索引键,则此参数指定数字索引键的前缀。默认为 null。

$arg_separator(可选):用于分隔查询参数的字符串。默认为 &。

$enc_type(可选):指定编码类型。可选值为 PHP_QUERY_RFC1738(默认)和 PHP_QUERY_RFC3986。

返回值:

http_build_query() 函数返回一个 URL 编码的查询字符串。

下面是一个示例,演示了如何使用 http_build_query() 函数:

$data=array(
    'name'=> 'John',
    'age'=> 25,
    'city'=> 'New York'
);

$queryString=http_build_query($data);

echo $queryString;
// 输出:name=John&age=25&city=New+York

在上面的示例中,我们将数组 $data 转换为 URL 编码的查询字符串。每个数组元素都会转换为一个查询参数,并使用 & 分隔。

parse_url

parse_url() 函数用于解析 URL 并返回其各个组成部分的关联数组。

下面是 parse_url() 函数的语法:

mixed parse_url ( string $url [, int $component=-1 ] )

参数说明:

$url:要解析的 URL 字符串。

$component(可选):指定要返回的组件。默认值为 -1,返回包含所有组件的关联数组。可选值为 PHP_URL_SCHEME、PHP_URL_HOST、PHP_URL_PORT、PHP_URL_USER、PHP_URL_PASS、PHP_URL_PATH、PHP_URL_QUERY、PHP_URL_FRAGMENT,分别代表不同的组件。

返回值:

如果 $component 参数为 -1,则返回一个包含 URL 各个组件的关联数组。如果指定了 $component 参数,则返回对应的组件字符串。

下面是一个示例,演示了如何使用 parse_url() 函数:

$url="https://www.example.com:8080/path/to/page?query=string#fragment";

$urlComponents=parse_url($url);

echo $urlComponents['scheme'];   // 输出:https
echo $urlComponents['host'];     // 输出:www.example.com
echo $urlComponents['port'];     // 输出:8080
echo $urlComponents['path'];     // 输出:/path/to/page
echo $urlComponents['query'];    // 输出:query=string
echo $urlComponents['fragment']; // 输出:fragment

在上面的示例中,我们使用 parse_url() 函数解析了 URL 字符串 $url,并将各个组件存储在关联数组 $urlComponents 中。然后,我们可以通过访问数组元素来获取特定的组件值。

如果只想获取单个组件的值,可以在调用 parse_url() 函数时指定 $component 参数。例如,如果只想获取主机名,可以这样做:

$url="https://www.example.com/path/to/page";

$host=parse_url($url, PHP_URL_HOST);

echo $host;  // 输出:www.example.com

在上面的示例中,我们使用 parse_url($url, PHP_URL_HOST) 仅返回 URL 的主机名。

需要注意的是,parse_url() 函数只能解析标准格式的 URL,例如 http://example.com 或 https://www.example.com。对于非标准格式的 URL,解析结果可能会有所不同。

篇文章给大家带来的内容是关于php中常用的采集函数的总结(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

这几天关注了一下PHP的采集程序,才发现用PHP采集内容是这么方便,把经常用到的采集函数在这里总结一下,方便以后使用!

获取所有链接内容和地址

function getAllURL($code){

preg_match_all('/<a\s+href=["|\']?([^>"\' ]+)["|\']?\s*[^>]*>([^>]+)<\/a>/i',$code,$arr);

return array('name'=>$arr[2],'url'=>$arr[1]);

}