mongodb用子文档做为查询条件方法
{
"_id": ObjectId("52fc6617e97feebe05000000"),
"age": 28,
"level": NumberInt(500),
"name": "name5",
"person": [
{
"level": 5,
"score": 100,
"ccc":{"ccc3":56,"fff3":78}
},
{
"level": 7,
"score": 90,
"like": "music"
}
],
"score": NumberInt(500),
"sex": "男"
}
方法一:
db.testColl.find({"person.level":7});
db.testColl.find({"person.ccc.ccc3":56});
均可查出结果,就是说这种方法可以嵌套使用!
方法二、使用$elemMatch操作符
db.testColl.find({"person":{"$elemMatch":{"level":5}}});
可以查出结果
db.testColl.find({"person":{"$elemMatch":{"ccc":{"$elemMatch":{"ccc3":56}}}}});
无法查出结果
db.testColl.find({"person":{"$elemMatch":{"ccc":{"ccc3":56,"fff3":78}}}});
db.testColl.find({"person":{"$elemMatch":{"ccc.ccc3":56}}});
可以查出结果
也就是说第二种方法不能嵌套使用。
Shell 监控文件新增数据并将数据发送钉钉机器人
#!/bin/sh
# 监控日志新增内容数据
# 告警通用API
NOTICE_URL='https://oapi.dingtalk.com/robot/send?access_token=670316378281374a7150b6303cbc722f5cb9438ede6c251624c4d6057eaeafa68'
# 获取当前所在机器IP
LOCAL_IP=`/sbin/ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"`
# 日志文件
LOG_FILE=$1
# 判断文件是否存在
if [ ! -f $LOG_FILE ]; then
echo '文件未找到'
exit 1
fi
# 最后行数临时存储
LAST_LINE_TMP=${LOG_FILE}".line_tmp"
# 判断临时文件是否存在 不存在则初始化文件数据
if [ ! -f $LAST_LINE_TMP ]; then
echo 0 > $LAST_LINE_TMP
fi
# 获取临时行数
LAST_LINE=`cat $LAST_LINE_TMP`
# 获取当前文件行数
CUR_LINE=`cat $LOG_FILE |wc -l`
echo "Last行数 : $LAST_LINE"
echo "Current行数 : $CUR_LINE"
# MarkDown 标记
HEAD_TAG='###'
CONTENT_TAG='#####'
if [ $CUR_LINE == $LAST_LINE ]; then
echo '无异常'
else
// 计算提取行数
tail_line=$[CUR_LINE-LAST_LINE]
# 日志数据处理
content=`tail -n $tail_line $LOG_FILE |head -n 100 |xargs echo `
CONTENT_STRING=`echo $content`
# 机器报警标题描述
TITLE="机器IP : "$LOCAL_IP" ; 监控文件:"$LOG_FILE
# 测试输出
echo "------------ REQUERT START -----------------------------------------------------------------------------"
echo "curl "${NOTICE_URL}" -H 'Content-Type: application/json' -d '{\"msgtype\": \"markdown\",\"markdown\":{\"title\":\""$TITLE"\",\"text\":\""$CONTENT_STRING"\"},\"at\":{\"isAtAll\":true}}"
echo "------------ REQUERT END -----------------------------------------------------------------------------"
RESULT=`curl $NOTICE_URL -H 'Content-Type: application/json' -d "{\"msgtype\":\"markdown\",\"markdown\":{\"title\":\"$TITLE\",\"text\":\"$HEAD_TAG $TITLE \r\n$CONTENT_TAG $CONTENT_STRING\"},\"at\":{\"isAtAll\":true}}"`
# 输出响应效果
echo "Result: $RESULT"
# 更新临时行数存储
echo $CUR_LINE > $LAST_LINE_TMP
fi
计划设置定时任务
## crontab -e
#监控php慢日志
*/1 * * * * /bin/Notice.sh /var/php/log/php-fpm/www-slow.log >/dev/null
#监控php错误日志
*/1 * * * * /bin/Notice.sh /var/php-fpm/www-error.log >/dev/null
使用 HttpOnly 提升 Cookie 安全性
在现代 web 应用中,Cookie 是实现用户身份验证和会话管理的重要机制。然而,Cookie 也可能成为攻击者的目标,尤其是通过 XSS(跨站脚本)攻击。因此,确保 Cookie 的安全性至关重要。本文将重点介绍 HttpOnly 属性及其在 PHP 中的使用方法,以提升 Cookie 的安全性。
什么是 HttpOnly Cookie?
HttpOnly 是一种 Cookie 属性,旨在防止客户端脚本(如 JavaScript)访问 Cookie。这意味着,即使攻击者通过 XSS 攻击成功注入了恶意脚本,他们也无法读取带有 HttpOnly 属性的 Cookie。这显著降低了会话劫持的风险。
HttpOnly 属性的工作原理
- 防止 JavaScript 访问: 如果 Cookie 设置了 HttpOnly 属性,浏览器将会阻止 JavaScript 访问这些 Cookie。这意味着通过
document.cookie 无法读取这些 Cookie。 - 仅通过 HTTP 请求发送: 只有在发送 HTTP 请求时,带有 HttpOnly 属性的 Cookie 才会被发送到服务器。
如何在 PHP 中使用 HttpOnly Cookie
在 PHP 中,可以通过 setcookie() 函数来设置 Cookie。要启用 HttpOnly,只需在该函数中设置相应的参数。
示例代码
<?php
// 设置 Cookie
setcookie("user", "JohnDoe", [
'expires' => time() + 3600, // 过期时间为 1 小时
'path' => '/', // Cookie 在整个网站有效
'domain' => 'example.com', // 适用的域名
'secure' => true, // 仅通过 HTTPS 发送
'httponly' => true, // 启用 HttpOnly
'samesite' => 'Strict' // 防止 CSRF 攻击
]);
echo "Cookie 设置成功!";
?>
参数说明
- expires: Cookie 的过期时间,单位为秒。
- path: Cookie 的有效路径,设置为
'/' 表示在整个网站有效。 - domain: Cookie 适用的域名,确保它与当前域名匹配。
- secure: 设置为
true,表示该 Cookie 仅通过 HTTPS 发送。 - httponly: 设置为
true,启用 HttpOnly 属性。 - samesite: 防止 CSRF 攻击,可以设置为
'Strict' 或 'Lax'。
HttpOnly 的优势
使用 HttpOnly 属性可以带来以下优势:
- 提高安全性: 防止恶意脚本访问 Cookie,降低会话劫持的风险。
- 用户信任: 增强用户对网站安全的信任感,提升用户体验。
- 简单易用: 在 PHP 中设置 HttpOnly Cookie 非常简单,只需调整
setcookie() 函数的参数。
结论
在 web 应用中,保护用户数据和会话信息至关重要。通过设置 Cookie 的 HttpOnly 属性,可以有效防止 XSS 攻击带来的安全隐患。作为开发者,务必在 Cookie 中启用 HttpOnly 属性,并结合其他安全措施,以构建更加安全的 web 应用。
参考资料
希望这篇文章能帮助你更好地理解 HttpOnly 属性及其在 PHP 中的应用,从而提升你 web 应用的安全性!
TiDB: 一个分布式关系型数据库的新选择
TiDB 是一个开源的分布式关系型数据库,设计用于处理大规模数据和高并发访问的场景。它具有许多令人印象深刻的特性和功能,使其成为现代应用程序中的理想选择。
分布式架构和弹性扩展
TiDB 的分布式架构使其能够轻松处理大量数据和高并发访问。它将数据分散存储在多个节点上,实现数据的水平分片和负载均衡。这种架构使得 TiDB 具有出色的可扩展性,您可以根据需要增加或减少节点的数量,以适应不断增长的数据和负载。
兼容性和无缝迁移
一个重要的优势是 TiDB 的兼容性。它兼容 MySQL 协议,这意味着您可以使用现有的 MySQL 客户端和工具与 TiDB 进行交互。这简化了将现有的 MySQL 应用程序迁移到 TiDB 的过程,减少了迁移的复杂性和风险。
ACID 事务和数据一致性
TiDB 支持 ACID(原子性、一致性、隔离性和持久性)事务,确保数据的一致性和可靠性。您可以在 TiDB 中执行复杂的事务操作,保证数据的完整性。这使得 TiDB 成为处理关键业务数据和要求数据一致性的应用程序的理想选择。
实时分析和强大的查询能力
TiDB 提供了强大的实时分析能力,支持在线分析处理(OLAP)工作负载。您可以使用 TiDB 进行复杂的数据分析和查询,以获取有关数据的深入洞察。它的查询优化器和并行执行引擎能够高效地处理复杂的查询,提供快速的查询响应时间。
自动故障转移和恢复
TiDB 具有自动故障转移和恢复的功能。当节点出现故障时,TiDB 会自动将数据迁移到其他可用节点,以确保数据的可用性和可靠性。这减少了对人工干预的需求,提高了系统的容错性和可靠性。
多数据中心复制和高可用性
TiDB 支持多数据中心的复制和同步,这使得在不同地理位置的多个数据中心之间实现高可用性和容灾成为可能。您可以设置数据中心之间的同步机制,确保数据在不同地理位置的复制和一致性。
结论
TiDB 是一个令人印象深刻的分布式关系型数据库,具有强大的功能和特性。它的分布式架构、兼容性、ACID 事务支持、实时分析能力以及自动故障转移和恢复等功能,使其成为处理大规模数据和高并发访问的理想选择。
如果您想了解更多关于 TiDB 的详细信息,可以访问官方网站:https://pingcap.com/products/tidb/。
参考文献:
- TiDB Documentation
- TiDB GitHub Repository