首页
留言板
友情链接
Search
1
【javascript】JS-向当前url追加参数
2,188 阅读
2
【PHP】生成随机昵称
2,053 阅读
3
【PHP】判断一个字符串是否属于序列化后的数据
1,953 阅读
4
【css】html+css给文章页,做阅读全文
1,838 阅读
5
【PHP】 设计模式(23种)
1,744 阅读
默认分类
typecho
代码改变世界
mysql
Winform
go
设计模式
PHP
python
nginx
网络安全
文艺范
Search
标签搜索
php
typecho
代码注释
mysql
redis
golang
docker
html
linux
nginx
go
mamp
laravel
跨域
http
rsa
curl
sql
酒
godoc
依然范儿特西
累计撰写
103
篇文章
累计收到
25
条评论
首页
栏目
默认分类
typecho
代码改变世界
mysql
Winform
go
设计模式
PHP
python
nginx
网络安全
文艺范
页面
留言板
友情链接
搜索到
9
篇与
PHP
的结果
2022-03-25
PHP使用socket检测ip端口是否开放
1 开启 socket 扩展, php.ini 里extension=sockets使用 php -m 查看是否成功2 代码<?php $ip = '127.0.0.1'; $prot = '8080'; checkIp($ip,$prot); //检测ip是否可用 function checkIp($ip,$port){ $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_nonblock($sock); socket_connect($sock,$ip, $port); socket_set_block($sock); $return = @socket_select($r=array($sock), $w = array($sock), $f = array($sock), 3); socket_close($sock); switch($return) { case 0: echo "$ip:$port 超时\n"; break; case 1: echo "$ip:$port 打开\n"; break; case 2: echo "$ip:$port 关闭\n"; break; } } ?>
2022年03月25日
31 阅读
0 评论
0 点赞
2021-11-12
php防sql注入过滤代码
php防sql注入过滤代码防止sql注入的函数,过滤掉那些非法的字符,提高sql安全性,同时也可以过滤XSS的攻击。function filter($str) { if (empty($str)) return false; $str = htmlspecialchars($str); $str = str_replace( '/', "", $str); $str = str_replace( '"', "", $str); $str = str_replace( '(', "", $str); $str = str_replace( ')', "", $str); $str = str_replace( 'CR', "", $str); $str = str_replace( 'ASCII', "", $str); $str = str_replace( 'ASCII 0x0d', "", $str); $str = str_replace( 'LF', "", $str); $str = str_replace( 'ASCII 0x0a', "", $str); $str = str_replace( ',', "", $str); $str = str_replace( '%', "", $str); $str = str_replace( ';', "", $str); $str = str_replace( 'eval', "", $str); $str = str_replace( 'open', "", $str); $str = str_replace( 'sysopen', "", $str); $str = str_replace( 'system', "", $str); $str = str_replace( '$', "", $str); $str = str_replace( "'", "", $str); $str = str_replace( "'", "", $str); $str = str_replace( 'ASCII 0x08', "", $str); $str = str_replace( '"', "", $str); $str = str_replace( '"', "", $str); $str = str_replace("", "", $str); $str = str_replace(">", "", $str); $str = str_replace("<", "", $str); $str = str_replace("<SCRIPT>", "", $str); $str = str_replace("</SCRIPT>", "", $str); $str = str_replace("<script>", "", $str); $str = str_replace("</script>", "", $str); $str = str_replace("select","",$str); $str = str_replace("join","",$str); $str = str_replace("union","",$str); $str = str_replace("where","",$str); $str = str_replace("insert","",$str); $str = str_replace("delete","",$str); $str = str_replace("update","",$str); $str = str_replace("like","",$str); $str = str_replace("drop","",$str); $str = str_replace("DROP","",$str); $str = str_replace("create","",$str); $str = str_replace("modify","",$str); $str = str_replace("rename","",$str); $str = str_replace("alter","",$str); $str = str_replace("cas","",$str); $str = str_replace("&","",$str); $str = str_replace(">","",$str); $str = str_replace("<","",$str); $str = str_replace(" ",chr(32),$str); $str = str_replace(" ",chr(9),$str); $str = str_replace(" ",chr(9),$str); $str = str_replace("&",chr(34),$str); $str = str_replace("'",chr(39),$str); $str = str_replace("<br />",chr(13),$str); $str = str_replace("''","'",$str); $str = str_replace("css","'",$str); $str = str_replace("CSS","'",$str); $str = str_replace("<!--","",$str); $str = str_replace("convert","",$str); $str = str_replace("md5","",$str); $str = str_replace("passwd","",$str); $str = str_replace("password","",$str); $str = str_replace("../","",$str); $str = str_replace("./","",$str); $str = str_replace("Array","",$str); $str = str_replace("or 1='1'","",$str); $str = str_replace(";set|set&set;","",$str); $str = str_replace("`set|set&set`","",$str); $str = str_replace("--","",$str); $str = str_replace("OR","",$str); $str = str_replace('"',"",$str); $str = str_replace("*","",$str); $str = str_replace("-","",$str); $str = str_replace("+","",$str); $str = str_replace("/","",$str); $str = str_replace("=","",$str); $str = str_replace("'/","",$str); $str = str_replace("-- ","",$str); $str = str_replace(" -- ","",$str); $str = str_replace(" --","",$str); $str = str_replace("(","",$str); $str = str_replace(")","",$str); $str = str_replace("{","",$str); $str = str_replace("}","",$str); $str = str_replace("-1","",$str); $str = str_replace("1","",$str); $str = str_replace(".","",$str); $str = str_replace("response","",$str); $str = str_replace("write","",$str); $str = str_replace("|","",$str); $str = str_replace("`","",$str); $str = str_replace(";","",$str); $str = str_replace("etc","",$str); $str = str_replace("root","",$str); $str = str_replace("//","",$str); $str = str_replace("!=","",$str); $str = str_replace("$","",$str); $str = str_replace("&","",$str); $str = str_replace("&&","",$str); $str = str_replace("==","",$str); $str = str_replace("#","",$str); $str = str_replace("@","",$str); $str = str_replace("mailto:","",$str); $str = str_replace("CHAR","",$str); $str = str_replace("char","",$str); return $str; } 更加简便的防止sql注入的方法(推荐使用这个): if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开 { $post = addslashes($name); // magic_quotes_gpc没有打开的时候把数据过滤 } $name = str_replace("_", "\_", $name); // 把 '_'过滤掉 $name = str_replace("%", "\%", $name); // 把' % '过滤掉 $name = nl2br($name); // 回车转换 $name= htmlspecialchars($name); // html标记转换 return $name; PHP防XSS 防SQL注入的代码/** * 过滤参数 * @param string $str 接受的参数 * @return string */ static public function filterWords($str) { $farr = array( "/<(\\/?)(script|i?frame|style|html|body|title|link|meta|object|\\?|\\%)([^>]*?)>/isU", "/(<[^>]*)on[a-zA-Z]+\s*=([^>]*>)/isU", "/select|insert|update|delete|\'|\/\*|\*|\.\.\/|\.\/|union|into|load_file|outfile|dump/is" ); $str = preg_replace($farr,'',$str); return $str; } /** * 过滤接受的参数或者数组,如$_GET,$_POST * @param array|string $arr 接受的参数或者数组 * @return array|string */ static public function filterArr($arr) { if(is_array($arr)){ foreach($arr as $k => $v){ $arr[$k] = self::filterWords($v); } }else{ $arr = self::filterWords($v); } return $arr; } 在防止被注入攻击时,常会用到两个函数:htmlspecialchars()和addslashes() 、trim()函数。这两个函数都是对特殊字符进行转义。1)addslashes()作用及使用addslashes() 通常用于防止sql注入,它可对通过get,post和cookie传递过来的参数的单引号和双引号已经null前加“”进行转义如:如变量 $str=$_POST["str"];的值为:bb' or 1='1。通过addslashes()函数过滤后会变为:bb' or 1='1;2)htmlspecialchars()作用及使用htmlspecialchars()也是对字符进行转义,与addslashes()不同的是htmlspecialchars()是将特殊字符用引用实体替换。如<script>alert('xss')</script>通过htmlspecialchars()过滤后为<script>alert('xss')</script>3)addslashes()与htmlspecialchars()的区别除了两个函数的转义方式不同外,它们的使用也不同。addslashes()通过用于防止sql语句注入,在执行sql语句前对通过get、post和cookie传递来的参数中的单引号,双引号, 和null进行转义。但sql执行成功后,插入到数据库中的数据是不带有转义字符的。这是如果插入到数据库中的是一些js脚本,当这些脚本被读取出来时还是会被执行。这是我们可对读取出来的数据使用htmlspecialchars()进行过滤,避免执行被注入的脚本。
2021年11月12日
154 阅读
0 评论
2 点赞
2021-11-12
php脚本内存溢出处理
有时候我们跑脚本时候。因为某些原因 内存溢出 导致 脚本停止,但是我们日志又捕捉不到信息,就很蛋疼完整测试代码 class Test { public $name = "sdf"; public function __construct() { } } //写法1,这里内存不会溢出 while(true) { $i++; var_dump($i); $i = new Test(); } //写法2,这里内存不会溢出 while(true) { new Test(); } //写法3,这里内存会溢出 while(true) { $i[] = new Test(); }我们按照这个示例代码来测试test.php 文件class Test{ public $name = "laofan"; public function __construct() { } } try { //这里内存会溢出 while(true) { $i[] = new Test(); } print_r($i); }catch(\Exception $e){ print_r($e->getMessage()); }此处执行 php test.php 控制台会报错,但是无法捕获异常,# 错误信息 Fatal error: Allowed memory size of 2684354560 bytes exhausted (tried to allocate 1073741832 bytes) in D:\phpstudy_pro\WWW_laofan\test.php on line 14改用 linux 日志方式 来解决php test.php > ./log.txtget !
2021年11月12日
80 阅读
0 评论
1 点赞
2021-11-05
日常项目中缓存穿透处理
说起缓存穿透,大家都知道, 真正在使用过程中,很少有人感觉会缓存穿透, 其实在我们日常开发过程中,不知不觉 你就写了个bug , 下边是我们开发中发现的一种缓存穿透写法, 仅供参考:缓存穿透写法 /* 错误写法示例 * * 解读: * * 当 $data_list 查询结果为空时候, 会导致 msgpack_pack 压缩后 存储缓存结果为空 * 从缓存取出数据时候, msgpack_unpack 解压后,数据也是空值,从而导致 一直无法命中缓存, */ public static function getList(){ $cache_key = 'richerdyoung.com:v1'; $redis = new Redis(); $data_list = msgpack_unpack($redis->get($cache_key)); if(empty($data_list)){ $data_list = getListByDb(); $redis->set($cache_key,msgpack_pack($data_list),86400); } return $data_list; } 正确写法 /* 正确写法 * 解读 * * 当取出 不存在的 $cache_key 结果会返回 false ,此时查询db , 如果db返回空,存入 redis * 第二次查询 $cache_key ,缓存key存在,但是结果为空,直接返回, 从而避免 重复查询DB * * 也可以使用 $redis->exists($cache_key) 去判定 */ public static function getAllAdOwnerignoreUserTypeList(){ $cache_key = 'richerdyoung.com:v1'; $redis = new Redis(); $cache_data_list = $redis->get($cache_key); if($cache_data_list === false){ $data_list = getListByDb(); $redis->set($cache_key,msgpack_pack($data_list),86400); }else{ $data_list = msgpack_unpack($cache_data_list); } return $data_list; }
2021年11月05日
109 阅读
3 评论
5 点赞
2021-10-22
Docker php安装扩展步骤详解
前言此篇,主要是演示docker-php-source , docker-php-ext-install ,docker-php-enable-docker-configure 这四个命令到底是用来干嘛的,它们在PHP容器中都做了哪些事情。 很多人很不理解在Dockerfile中安装PHP扩展的时候总是出现这几个命令,本篇就就是为你揭开这些命令的神秘面纱而准备的,所有案例都是本人自己运行过的。Docker 中的PHP容器安装扩展的方式有通过pecl方式安装通过php 容器中自带的几个特殊命令来安装,这些特殊命令可以在Dockerfile中的RUN命令中进行使用。这里,我们主要讨论的是第二种方案,如何通过PHP容器中的几个特殊命令来安装PHP扩展PHP中安装扩展有几个特殊的命令docker-php-sourcedocker-php-ext-installdocker-php-ext-enabledocker-php-ext-configure演示这三个命令的作用都是在PHP容器中进行演示的,PHP容器启动太简单,不作过多介绍docker-php-source此命令,实际上就是在PHP容器中创建一个/usr/src/php的目录,里面放了一些自带的文件而已。我们就把它当作一个从互联网中下载下来的PHP扩展源码的存放目录即可。事实上,所有PHP扩展源码扩展存放的路径: /usr/src/php/ext 里面。格式:docker-php-source extract | delete参数说明:extract : 创建并初始化 /usr/src/php目录delete : 删除 /usr/src/php目录案例:root@richerdyoung.com:/usr/src# ls -l total 11896 #此时,并没有php目录 -rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz -rw-r--r-- 1 root root 801 Jun 28 03:23 php.tar.xz.asc root@richerdyoung.com:/usr/src# docker-php-source extract root@richerdyoung.com:/usr/src# ls -l total 11900 #此时,生产了php目录,里面还有一些文件,由于篇幅问题,就不进去查看了 drwxr-xr-x 14 root root 4096 Aug 9 09:01 php -rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz -rw-r--r-- 1 root root 801 Jun 28 03:23 php.tar.xz.asc root@richerdyoung.com:/usr/src# docker-php-source delete root@richerdyoung.com:/usr/src# ls -l total 11896 #此时,将已创建 php 目录给删除了 -rw-r--r-- 1 root root 12176404 Jun 28 03:23 php.tar.xz -rw-r--r-- 1 root root 801 Jun 28 03:23 php.tar.xz.asc root@richerdyoung.com:/usr/src#docker-php-ext-enable这个命令,就是用来启动 PHP扩展 的。 我们使用pecl安装PHP扩展的时候,默认是没有启动这个扩展的,如果想要使用这个扩展必须要在php.ini这个配置文件中去配置一下才能使用这个PHP扩展。 而 docker-php-ext-enable 这个命令则是自动给我们来启动PHP扩展的,不需要你去php.ini这个配置文件中去配置。案例 # 查看现有可以启动的扩展 root@richerdyoung.com:/usr/local/etc/php# ls /usr/local/lib/php/extensions/no-debug-non-zts-20170718/ opcache.so redis.so sodium.so root@richerdyoung.com:/usr/local/etc/php# # 查看redis 扩展是否可以启动 root@richerdyoung.com:/usr/local/etc/php# php -m | grep redis root@richerdyoung.com:/usr/local/etc/php# # 启动 redis 扩展 root@richerdyoung.com:/usr/local/etc/php# docker-php-ext-enable redis # 启动 成功 root@richerdyoung.com:/usr/local/etc/php# php -m | grep redis redis root@richerdyoung.com:/usr/local/etc/php# #说明,php容器中默认是没有php.ini配置文件的,加载原理如下所示 root@richerdyoung.com:/usr/local/etc/php# php -i | grep -A 5 php.ini Configuration File (php.ini) Path => /usr/local/etc/php Loaded Configuration File => (none) # 核心是 /usr/local/etc/php/conf.d 目录下的扩展配置文件 Scan this dir for additional .ini files => /usr/local/etc/php/conf.d Additional .ini files parsed => /usr/local/etc/php/conf.d/docker-php-ext-redis.ini, /usr/local/etc/php/conf.d/docker-php-ext-sodium.ini root@richerdyoung.com:/usr/local/etc/php#docker-php-ext-install这个命令,是用来安装并启动PHP扩展的。 命令格式:docker-php-ext-install 源码包目录名注意点:源码包 需要放在 ` /usr/src/php/ext 下默认情况下,PHP容器没有 /usr/src/php这个目录,需要使用 docker-php-source extract来生成。docker-php-ext-install 安装的扩展在安装完成后,会自动调用docker-php-ext-enable来启动安装的扩展。卸载扩展,直接删除/usr/local/etc/php/conf.d 对应的配置文件即可。案例# 卸载redis 扩展 root@richerdyoung.com:/usr/local# rm -rf /usr/local/etc/php/conf.d/docker-php-ext-redis.ini root@richerdyoung.com:/usr/local# php -m [PHP Modules] Core ctype curl date dom fileinfo filter ftp hash iconv json libxml mbstring mysqlnd openssl pcre PDO pdo_sqlite Phar posix readline Reflection session SimpleXML sodium SPL sqlite3 standard tokenizer xml xmlreader xmlwriter zlib [Zend Modules] root@richerdyoung.com:/usr/local# #PHP容器默认是没有redis扩展的。所以我们通过docker-php-ext-install安装redis扩展 root@richerdyoung.com:/# curl -L -o /tmp/reids.tar.gz https://codeload.github.com/phpredis/phpredis/tar.gz/5.0.2 root@richerdyoung.com:/# cd /tmp root@richerdyoung.com:/tmp# tar -xzf reids.tar.gz root@richerdyoung.com:/tmp# ls phpredis-5.0.2 reids.tar.gz root@richerdyoung.com:/tmp# docker-php-source extract root@richerdyoung.com:/tmp# mv phpredis-5.0.2 /usr/src/php/ext/phpredis #检查移过去的插件源码包是否存在 root@richerdyoung.com:/tmp# ls -l /usr/src/php/ext | grep redis drwxrwxr-x 6 root root 4096 Jul 29 15:04 phpredis root@richerdyoung.com:/tmp# docker-php-ext-install phpredis # 检查redis 扩展是否已经安装上 root@richerdyoung.com:/tmp# php -m | grep redis redis root@richerdyoung.com:/tmp#docker-php-ext-configuredocker-php-ext-configure 一般都是需要跟 docker-php-ext-install搭配使用的。它的作用就是,当你安装扩展的时候,需要自定义配置时,就可以使用它来帮你做到。案例FROM php:7.1-fpm RUN apt-get update \ # 相关依赖必须手动安装 && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libmcrypt-dev \ libpng-dev \ # 安装扩展 && docker-php-ext-install -j$(nproc) iconv mcrypt \ # 如果安装的扩展需要自定义配置时 && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd
2021年10月22日
30 阅读
0 评论
0 点赞
2021-07-08
TP3.2框架中如何使用多个mysql函数 如FIND_IN_SET 和 !FIND_IN_SET
数据查询中可能会用到数据表中的多个字段去做匹配 可能会用到多个FIND_IN_SET 也可能需要拼接多个条件$user_ids = [1,2,3]; //获取需要匹配的值 if ($user_ids ){ foreach ($user_ids as $val){ $map[] = " FIND_IN_SET($val,show_user_id) "; } } $where['_string'] = implode(" OR ",$map); # 预览sql效果: WHERE FIND_IN_SET('1', show_user_id) OR FIND_IN_SET('2', show_user_id) OR FIND_IN_SET(3, show_user_id) 但是如果我们想除了这个函数还有其他函数要使用的时候并且$where['_string']已经被使用的时候怎么拼接? $where['_logic'] = 'or';//and 或者 OR 就是看你的需要 $map['_string'] = " !FIND_IN_SET(4,show_user_id) "; $where['_complex'] = $map; # 预览sql效果: WHERE FIND_IN_SET('1', show_user_id) OR FIND_IN_SET('2', show_user_id) OR FIND_IN_SET(3, show_user_id) AND ( ( !FIND_IN_SET(4, show_user_id) //就是与FIND_IN_SET相反的意思 ) )
2021年07月08日
91 阅读
0 评论
1 点赞
2021-07-05
【laravel】 操作文件上传
1、获取上传的文件$file=$request->file('file');2、获取上传文件的文件名(带后缀,如abc.png)$filename=$file->getClientOriginalName();3、获取上传文件的后缀(如abc.png,获取到的为png)$fileextension=$file->getClientOriginalExtension();4、获取上传文件的大小$filesize=$file->getClientSize();5、获取缓存在tmp目录下的文件名(带后缀,如php8933.tmp)$filaname=$file->getFilename();6、获取上传的文件缓存在tmp文件夹下的绝对路径$realpath=$file->getRealPath();7、将缓存在tmp目录下的文件移到某个位置,返回的是这个文件移动过后的路径$path=$file->move(path,newname);move()方法有两个参数,第一个参数是文件移到哪个文件夹下的路径,第二个参数是将上传的文件重新命名的文件名8、检测上传的文件是否合法,返回值为true或false$file->isValid()
2021年07月05日
74 阅读
0 评论
0 点赞
2019-09-10
PHP设置http头信息
function https($num) { $http = array ( 100 => "HTTP/1.1 100 Continue", 101 => "HTTP/1.1 101 Switching Protocols", 200 => "HTTP/1.1 200 OK", 201 => "HTTP/1.1 201 Created", 202 => "HTTP/1.1 202 Accepted", 203 => "HTTP/1.1 203 Non-Authoritative Information", 204 => "HTTP/1.1 204 No Content", 205 => "HTTP/1.1 205 Reset Content", 206 => "HTTP/1.1 206 Partial Content", 300 => "HTTP/1.1 300 Multiple Choices", 301 => "HTTP/1.1 301 Moved Permanently", 302 => "HTTP/1.1 302 Found", 303 => "HTTP/1.1 303 See Other", 304 => "HTTP/1.1 304 Not Modified", 305 => "HTTP/1.1 305 Use Proxy", 307 => "HTTP/1.1 307 Temporary Redirect", 400 => "HTTP/1.1 400 Bad Request", 401 => "HTTP/1.1 401 Unauthorized", 402 => "HTTP/1.1 402 Payment Required", 403 => "HTTP/1.1 403 Forbidden", 404 => "HTTP/1.1 404 Not Found", 405 => "HTTP/1.1 405 Method Not Allowed", 406 => "HTTP/1.1 406 Not Acceptable", 407 => "HTTP/1.1 407 Proxy Authentication Required", 408 => "HTTP/1.1 408 Request Time-out", 409 => "HTTP/1.1 409 Conflict", 410 => "HTTP/1.1 410 Gone", 411 => "HTTP/1.1 411 Length Required", 412 => "HTTP/1.1 412 Precondition Failed", 413 => "HTTP/1.1 413 Request Entity Too Large", 414 => "HTTP/1.1 414 Request-URI Too Large", 415 => "HTTP/1.1 415 Unsupported Media Type", 416 => "HTTP/1.1 416 Requested range not satisfiable", 417 => "HTTP/1.1 417 Expectation Failed", 500 => "HTTP/1.1 500 Internal Server Error", 501 => "HTTP/1.1 501 Not Implemented", 502 => "HTTP/1.1 502 Bad Gateway", 503 => "HTTP/1.1 503 Service Unavailable", 504 => "HTTP/1.1 504 Gateway Time-out" ); header($http[$num]); };
2019年09月10日
1,161 阅读
0 评论
0 点赞
2019-07-15
【PHP】构造函数
1、构造方法 __construct() 主要用来在创建对象时初始化对象,向对象成员变量赋予初始值,在创建对象的语句中与 new 运算符一起使用。2、析构方法 __destruct() 析构函数(destruct) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。3、PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct() 。
2019年07月15日
1,127 阅读
0 评论
0 点赞