首页
📷在线壁纸
🎬娱乐天地
🔖友情链接
更多
📝留言板
Search
1
【javascript】JS-向当前url追加参数
2,345 阅读
2
【PHP】生成随机昵称
2,219 阅读
3
【PHP】判断一个字符串是否属于序列化后的数据
2,024 阅读
4
【css】html+css给文章页,做阅读全文
1,975 阅读
5
【PHP】 设计模式(23种)
1,910 阅读
📂默认分类
💓typecho
🏳️🌈代码改变世界
🍇 mysql
🍈 Winform
🍓 golang
🍉 设计模式
🥝 PHP
🍎 python
🍊 nginx
🍋 网络安全
🍍 javascript
🫑 database
🍭文艺范
🍏mac
AI
LLM
image
audio
yolo
3D
code
登录
Search
标签搜索
php
typecho
代码注释
redis
mysql
go
golang
nginx
thinkphp
docker
gin
linux
curl
html
mamp
算法
短网址
构造函数
webhook
代码片段
依然范儿特西
累计撰写
145
篇文章
累计收到
1
条评论
首页
栏目
📂默认分类
💓typecho
🏳️🌈代码改变世界
🍇 mysql
🍈 Winform
🍓 golang
🍉 设计模式
🥝 PHP
🍎 python
🍊 nginx
🍋 网络安全
🍍 javascript
🫑 database
🍭文艺范
🍏mac
AI
LLM
image
audio
yolo
3D
code
页面
📷在线壁纸
🎬娱乐天地
🔖友情链接
📝留言板
搜索到
145
篇与
的结果
2021-12-09
渗透测试
渗透测试原理由安全专家对网站应用系统,尤其是通过基于 web 的应用系统进行应用安全评估和渗透测试,发现和弥补应用系统存在的弱点。安全专家模拟黑客全面检测 web 应用存在的漏洞并使用攻击向量对漏洞进行控制操作,评估漏洞对企业平台功能或资产可以造成的损害,进面评估对企业业务的影响。原理如图所示:标准遵从国内标准:GB/T 17859-1999 计算机信息系统安全保护等级划分准则GB/T 20984-2007 信息安全技术 信息安全风险评估规范GB/T 19716-2005 信息技术 信息安全管理实用规则GB/Z 20986-2007 信息安全事件分类分级指南GB/T18336-2008 信息技术 安全性评估准则GB/T 20988-2007 信息系统灾难恢复规范GB/T 32213-2015 信息安全技术 公钥基础设施 远程口令鉴别与密钥建立规范GB/T 31722-2015 信息技术 安全技术 信息安全风险管理GB/T 35284-2017 信息安全技术 网站身份和系统安全要求与评估方法国际标准:ISO27000 系列ISO15408 信息技术安全评估准则Microsoft 和 IBM 软件开发生命周期OWASP TOP 10 Web 安全应用风险ISO13335 信息技术-IT 安全管理指南CC-ISO15408 信息技术安全性评估准则NIST SP 800-30 信息技术系统风险管理指南NIST SP 800-26 信息技术系统安全自我评估指南美国国家安全局 (NAS) 发布的 SSE-CMM V2.0 模型漏洞评级定义序号漏洞名称漏洞危害1核心功能认证缺失高2系统命令注入高3SQL 注入高4恶意文件/脚本上传高5访问控制失效(水平/垂直越权)高6敏感文件下载高7服务器端模板注入高8Python 代码注入高9相对路径遍历中10GET 方法提交敏感参数高11LDAP 注入高12XML 注入(XXE)高13XPath 注入高14存储型 XSS高15反射型 XSS中16DOM XSS中17敏感文件泄露高18访问控制失效(强制浏览)高19业务逻辑绕过高/中/低20不安全的密码重置功能(任意密码重置)高21短信轰炸、邮箱轰炸中22不可用的功能高23敏感信息被明文返回中24敏感信息未被加密存储在后端数据库中25敏感信息未加密中26CSRF中27暴力破解中28URL 重定向中29未加盐的密码哈希中30敏感错误信息泄露低31邮件地址泄露低32用户名枚举低33内部主机名泄露低34内部 IP 泄露低35通过 HTTP 请求的 SQL 语句枚举数据库信息高36超级管理员控制台可被 Internet 访问中37密码复杂度要求缺失中38登录后会话 ID 未更新中39允许未受信任的 SSL 证书中40可预测的会话 Cookie中41Cookie 存储敏感信息中42未强制加密中43未被设置为安全的会话 Cookie中44没有登出功能中45不过期的会话中46登出功能不终止会话中47应用允许同时登陆中48未启用端对端加密机制中49敏感信息缓存中50非必要的 HTTP 方法中51跨域资源共享(CORS)低52缺少更改密码功能中53表单开启自动填写功能低54服务器允许列出目录列表低55跨域脚本包含低56不完整的登出(子窗口不关闭)低57会话过期后无重定向低58Robots.txt 文件暴露网站结构低59敏感代码注释低60服务器信息泄露低61Cookie 未设置 HTTPOnly低62VIEWSTATE 参数泄露敏感信息低63过长的会话过期时间低64缺少 Strict Transport Security 头部低65HTTP.sys 远程代码执行中66OpenSSL 心跳信息泄露(心脏流血)中67软件版本过低低68操作系统版本过低低69脆弱的软件组件低70不受支持/易被攻击的版本低71Host 头部注入中72开放多余的服务中73脆弱的 SSL 版本(SSLv2,SSLv3)中74支持 SSL 脆弱加密套件中75跨框架脚本攻击(CFS)中76允许外域 Flash 访问中77服务器存在非必要文件低78Flash 参数“Allow Script Access”被设置为“Always”低79服务器隐藏目录被发现低80未设置 X-Frame-Options 头低81未设置 X-Content-Type-Options 头低82未设置 Cache-Control 头低83弱口令高84SNMP 弱口令中渗透测试工具集渗透测试团队用到的渗透测试工具集参考名称作用归属nmap端口扫描、主机发现信息收集subDomainsBrute子域名发现信息收集firebug数据分析信息收集wireshark数据分析信息获取Fiddler数据分析信息收集whois收集信息信息收集DirBrute目录扫描信息收集wpscan漏洞扫描漏洞发现Burpsuite综合利用工具信息收集AWVS漏洞扫描器漏洞发现Beef XSS综合利用漏洞利用hydra暴力破解漏洞利用metasploit渗透测试框架漏洞利用sqlmapSQL 注入利用漏洞利用HavijSQL 注入利用漏洞利用struts2利用工具 针对 struts2 漏洞漏洞利用中国菜刀管理 webshell漏洞利用nc端口转发内网渗透lcx端口转发内网渗透reGeorgproxy流量转发内网渗透proxychain代理工具内网渗透reDug流量转发内网渗透Tunna流量转发内网渗透mimikatzwindows 密码获取内网渗透AndroidKiller反编译 apk 文件源码获取ApkToolkit反编译 apk 文件源码获取APKIDE反编译 apk 文件源码获取jd-guijava 反编译源码分析Winhex编辑工具二进制分析常见漏洞测试方法SQL 注入测试将数据包中存在参数的值修改为测试语句,并观察返回包数据常见测试语句内容如下:AND 1=1/ AND 1=2 'AND '1'='1/'AND '1'='2 "AND "1"="1/"AND "1"="1━ XSS 漏洞测试将数据包中存在参数的值修改为测试语句,并观察返回包数据常见测试语句内容如下:“;prompt(document.cookie);// ‘“><script>alert(document.cookie)</script>━ 越权漏洞测试将数据包中参数进行修改,观察返回数据包中是否包含超出用户权限的数据。━ 逻辑漏洞测试将数据包中参数进行修改,观察返回数据包中违反正常业务逻辑是否可被系统执行。━ 暴力破解漏洞测试短时间内大量发送含有测试语句的数据包至特定身份认证接口,观察返回数据包状态, 判断是否已发送数据包均被系统处理。━ 短信轰炸漏洞测试使用测试工具短时间内频繁发送请求短信数据包,观察系统是否存在短信发送频率限制。━ 任意文件下载漏洞测试下载系统文件,观察是否对用户查看或下载的文件不做限制。━ 跨站请求伪造测试构造请求之后以其他账户身份登录之后点击,观察该请求操作是否被执行。━ URL 重定向测试在 URL 中构造一个恶意地址,查看用户是否跳转到恶意网站。━ 敏感信息泄露测试发送请求数据包,观察其中是否存在敏感信息.
2021年12月09日
270 阅读
2 评论
0 点赞
2021-12-01
好诗集锦
正在播放《open car》 ●━━━━━━━──5:01 ⇆ ◁ ❚❚ ▷ ↻ 1代码写得好,下班走得早, 领导瞧一瞧,绩效往下调; 代码写得烂,加班除炸弹, 领导看一看,提拔当骨干。2写字楼里写字间,写字间里程序员; 程序人员写程序,又拿程序换酒钱。 酒醒只在网上坐,酒醉还来网下眠; 酒醉酒醒日复日,网上网下年复年。 但愿老死电脑间,不愿鞠躬老板前; 奔驰宝马贵者趣,公交自行程序员。 别人笑我忒疯癫,我笑自己命太贱; 不见满街漂亮妹,哪个归得程序员?3天下英雄出我辈, 一入职场衰命催。 加班欠薪谈笑间, 不及富婆一场睡。
2021年12月01日
165 阅读
0 评论
1 点赞
2021-11-24
Golang 实现结构体数组按多字段排序
php 排序写法近期因项目重构(php->golang),涉及到一些将对象列表中的对象按不同的字段(属性)排序;在 php 中,可以使用 usort + 自定义的排序函数轻松实现;PHP usort 官方文档下面我们先看一个在 php 中的例子: 下面是一个待排序待数组<?php $result = array( array( "val" => "f", "mtime" => 1595144638, "orderval"=>4 ), array( "val" => "d", "mtime" => 1595144646, "orderval"=>2 ), array( "val" => "a", "mtime" => 1595144648, "orderval"=>8 ), array( "val" => "t", "mtime" => 1595144648, "orderval"=>5 ), array( "val" => "e", "mtime" => 1595144650, "orderval"=>3 ) );我们目前待目标是将该数组中待对象按 mtime 从大到小排序;如果 mtime 字段的值相等,则按 orderval 从大到小排,最终想要的结果为:e,a,t,d,f[ {"val"=>"e","mtime"=>1595144650,"orderval"=>3}, {"val"=>"a","mtime"=>1595144648,"orderval"=>8}, {"val"=>"t","mtime"=>1595144648,"orderval"=>5}, {"val"=>"d","mtime"=>1595144646,"orderval"=>2}, {"val"=>"f","mtime"=>1595144638,"orderval"=>4} ] 我们首先定义一个自定义函数,然后巧妙使用 usort 函数去调用的自定义函数,最终实现目标,直接上代码:php $result = array( array( "val" => "f", "mtime" => 1595144638, "orderval"=>4 ), array( "val" => "d", "mtime" => 1595144646, "orderval"=>2 ), array( "val" => "a", "mtime" => 1595144648, "orderval"=>8 ), array( "val" => "t", "mtime" => 1595144648, "orderval"=>5 ), array( "val" => "e", "mtime" => 1595144650, "orderval"=>3 ) ); //按mtime 从大到小;如果mtime 相等,则按orderval 从大到小; usort($result, function ($v1, $v2) { if ($v1['mtime'] < $v2['mtime'] || ($v1['mtime'] == $v2['mtime'] && $v1['orderval'] < $v2['orderval'])) { return 1; } else { return -1; } }); var_dump($result); 运行结果:array(5) { [0]=> array(3) { ["val"]=> string(1) "e" ["mtime"]=> int(1595144650) ["orderval"]=> int(3) } [1]=> array(3) { ["val"]=> string(1) "a" ["mtime"]=> int(1595144648) ["orderval"]=> int(8) } [2]=> array(3) { ["val"]=> string(1) "t" ["mtime"]=> int(1595144648) ["orderval"]=> int(5) } [3]=> array(3) { ["val"]=> string(1) "d" ["mtime"]=> int(1595144646) ["orderval"]=> int(2) } [4]=> array(3) { ["val"]=> string(1) "f" ["mtime"]=> int(1595144638) ["orderval"]=> int(4) } }那么同样的功能,如果要用 golang 来实现,应如何办呢?golang 排序下面我们首先讲讲 golang 官方对排序 对支持,然后给出具体对例子;package main import ( "fmt" "sort" ) type Obj struct { Var string `json:"var"` Mtime int `json:"mtime"` Orderval int `json:"orderval"` } type List []Obj func (p List) Len() int { return len(p) } // 此处排序是从大到小的, 如果想升序,可以把此方法里的 判定 改为 相反的判定即可 func (p List) Less(i, j int) bool { if p[i].Mtime > p[j].Mtime { return true } if p[i].Mtime < p[j].Mtime { return false } return p[i].Orderval > p[j].Orderval } func (p List) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p *List) Sort() { sort.Sort(p) } func main() { s := List{{"f", 1595144638, 4}, {"d", 1595144646, 2}, {"a", 1595144648, 8}, {"t", 1595144648, 5}, {"e", 1595144650, 3}} fmt.Println(s) s.Sort() fmt.Println(s) } // 如果想使用传入的方法来写,可以把main 方法 的写法改为下边这个 //func toSortAsc(UserList []Obj)[]Obj{ // s := List{} // for _,v := range UserList{ // s = append(s,v) // } // s.Sort() // return s //} 再举一个简单的例子package main import ( "fmt" "sort" ) type Instance struct { Domain string `json:"domain"` Ip string `json:"ip"` Containers []string `json:"containers,omitempty"` } func main() { instances := make([]*Instance, 0, 10) i1 := &Instance{} i1.Domain = "zhap" i1.Ip = "1" instances = append(instances, i1) i2 := &Instance{} i2.Domain = "abc" i2.Ip = "2" instances = append(instances, i2) i3 := &Instance{} i3.Domain = "mid" i3.Ip = "3" instances = append(instances, i3) fmt.Println("排序前 ") for _, v := range instances { fmt.Println(*v) } sort.Slice(instances, func(i, j int) bool { return instances[i].Domain < instances[j].Domain }) fmt.Println("排序后 ") for _, v := range instances { fmt.Println(*v) } }
2021年11月24日
740 阅读
0 评论
2 点赞
2021-11-19
golang 接收命令行参数
方式一package main import ( "fmt" "os" ) func main() { fmt.Println("命令行的参数有", len(os.Args)) // 遍历 os.Args 切片,就可以得到所有的命令行输入参数值 for i, v := range os.Args { fmt.Printf("args[%v]=%v\n", i, v) } }执行结果> go run ./main.go laofan 123 456 789 命令行的参数有 5 args[0]=Temp\go-build\b001\exe\main.exe args[1]=laofan args[2]=123 args[3]=456 args[4]=789 >方式二如像 mysql 那样:mysql -u root -p 123456,可以指定输入内容,输入顺序可变。flag包实现了命令行参数的解析:package main import ( "flag" "fmt" ) func main() { // 定义几个变量,用于接收命令行的参数值 var user string var password string var host string var port int // &user 就是接收命令行中输入 -u 后面的参数值,其他同理 flag.StringVar(&user, "u", "root", "账号,默认为root") flag.StringVar(&password, "p", "", "密码,默认为空") flag.StringVar(&host, "h", "localhost", "主机名,默认为localhost") flag.IntVar(&port, "P", 3306, "端口号,默认为3306") // 解析命令行参数写入注册的flag里 flag.Parse() // 输出结果 fmt.Printf("user:%v\npassword:%v\nhost:%v\nport:%v\n", user, password, host, port) } 执行结果> go run ./main.go -p 123 -u laofan -P 3306 -h 127.0.0.1 user:laofan password:123 host:127.0.0.1 port:3306 > 方式二的另一种写法 package main import ( "flag" "fmt" ) func main () { //获取命令参数 Act := flag.String("act", "", "is ok") date := flag.String("date", "", "id") // 解析命令行参数写入注册的flag里 flag.Parse() fmt.Println("act :", *Act) fmt.Println("date :", *date) }访问结果> go run ./main.go -act laofan -date today act : laofan date : today >
2021年11月19日
162 阅读
0 评论
2 点赞
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()是将特殊字符用引用实体替换。如alert('xss')通过htmlspecialchars()过滤后为alert('xss')</script>3)addslashes()与htmlspecialchars()的区别除了两个函数的转义方式不同外,它们的使用也不同。addslashes()通过用于防止sql语句注入,在执行sql语句前对通过get、post和cookie传递来的参数中的单引号,双引号,\ 和null进行转义。但sql执行成功后,插入到数据库中的数据是不带有转义字符\的。这是如果插入到数据库中的是一些js脚本,当这些脚本被读取出来时还是会被执行。这是我们可对读取出来的数据使用htmlspecialchars()进行过滤,避免执行被注入的脚本。
2021年11月12日
466 阅读
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日
135 阅读
0 评论
1 点赞
2021-11-08
高考满分作文《酒》
美酒同品鉴,奇文共赏之。王玲,女,2018届高考生,写出了全国唯一一篇满分作文,被保送清华大学。古有刘伶醉酒,今有王玲写酒。整篇文章没有一个酒字,却把酒描写得出神入化,倾倒了全部阅卷官,一致给了满分。下面为大家整理的作文正文,请酒友们一起赏鉴。{dotted startColor="#ff6c6c" endColor="#1989fa"/}《酒》液体之火,让你,若梦若醒,飘飘欲仙,让天地颠倒,让世界旋转。把人类历史,浇灌的跌宕起伏。将琴棋书画,熏染的色彩斑斓。醉了刘伶,狂了诗仙,张扬了曹孟德,书写了鸿门宴,湿了清明杏花雨,瘦了海棠李易安。景阳冈上,助武松三拳毙虎。浔阳楼头,纵宋江题诗造反。你啊你,成全了多少英雄豪杰,放倒了多少村夫莽汉。歌舞与你相佐,美色与你为伴。催诗情万丈,壮文人斗胆。有人借你发疯,有人借你夺权。有时你只是一个道具,烘托一下谈判桌上的氛围。有时你更像一种暗器,把贪杯的对手麻翻。你呀你,既入朱门豪宅,又进村舍陋院。既流溢皇室的金樽,又盛满农家的粗碗。愁也要你,喜也要你。洞房花烛夜,他乡遇故知。金榜题名时,迁徙流放的囚犯,落魄的文人骚客,得志的朝廷大员,都是你的知己。你的伙伴,甚至,即将上路的死囚,都要你为之饯别。因为你,耽误了多少大事。因为你,弄出了多少冤案。因为你,鲜活了多少逸事趣闻。因为你,催生了多少佳作名篇。更因为你,造就了多少人的肝癌,而魂归天堂。真的是,成也有你,败也有你,生也有你,死也有你,你这浇愁愁更愁的琼浆啊。穷也有你,富也有你,千家万户还都离不开你!
2021年11月08日
957 阅读
0 评论
10 点赞
2021-11-08
人类社交指南
人类社交指南原句=>潜台词我们还去吗=>试图取消来都来了=>必须吃不买也没关系=>必须买我说句公道话=>我站对面我们还能去吗=>试图得到确认洗澡去了=>在机场等艘船你们去吧=>我没钱我不喜欢麻烦别人=>别来麻烦我正在做=>还没开始让我考虑一下=>我不想我快到了=>还没出发你还有钱吗=>借我点你想吃吗=>我想吃我妆都画好了=>这次不出来,下辈子再见绝绝子
2021年11月08日
135 阅读
0 评论
3 点赞
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日
189 阅读
3 评论
5 点赞
2021-11-05
win10下 docker文件安装路径更改
win10下 docker文件安装路径更改
2021年11月05日
105 阅读
0 评论
0 点赞
1
...
5
6
7
...
15