CSS中:root伪类和html选择器都可以用来定位 HTML 文档的根元素,虽然它们看起来非常相似,但它们还是有一些不同之处。
从优先级来说,:root伪类 比 html选择器的优先级高,通过如下代码:
:root {
background-color: red;
}
html {
background-color: blue;
}
最终你会看到页面的背景色是红色,而不是蓝色。
由于CSS也是为SVG和XML设计的,因此可以在其它类型的文档中使用:root定位根文档元素。对于html 选择器却只能在浏览器网页文档中使用,也就是说root不在乎宿主环境,在各种文档类型中都是指根元素。
与HTML相似,在SVG中 :root和svg都指相同的元素,但是:root选择器将具有更高的优先级。
如下实例:
:root {
fill: red;
}
svg {
fill: bule;
}
svg 显示红色,而不是蓝色。
.本文为公测版,一旦发现有任何错误内容,会立即进行修复,请持续关注本站。
2.本文在正式版之前会不断的邀请各路黑客大手进行评价测试,欢迎提出异议。
本文仅针对网站部分,本文会对typecho,wordpress进行测试
如果你root端口为22,并且密码是123456,就没必要往下看了。
网站环境为linux tengine/nginx mariaDB,同理,apache也有相关设置,百度实验下即可。
**本文会阐述以下部分
1.基础权限控制
2.执行目录限制
3.PHP的限制
4.webshell写入与执行
5.权限细分,必须写入的目录**
1.基础权限控制
什么叫基础权限?在LNMP架构下,nginx+php-fpm架构需要什么权限?
这里我们先来看一下默认权限
默认我们的nginx运行用户是nginx,而php-fpm的默认用户是apache,默认用户安全吗?
看一下webshell
uid=48(apache) gid=48(apache) groups=48(apache)
很明显,我们的默认用户是apache
我们使用shell新建一个目录,很明显,我们是无法建立文件夹的
mkdir: cannot create directory `1': Permission denied
在网上很多教程会告诉我们,吧nginx和phpfpm改成同样的用户,我们看看会发生什么。
[root@gov 1]# sudo -u nginx mkdir 1
[root@gov 1]# ll
total 4
drwxr-xr-x 2 nginx nginx 4096 Aug 19 18:08 1
没错,这是一项愚蠢的决定!
所以默认权限是安全的吗?并不是,你忘了上传目录,我们看下上传目录的权限
drwxrwx--- 3 nginx apache 4096 Aug 14 17:09 uploads
没错,上传目录的存在就是放大权限,如果php没有写入权限,那么他就无法上传图片。
假设,我们手里有一个0day,现在我要用它来getshell
我会选择uploads目录
-rw-r--r-- 1 apache apache 0 Aug 19 18:11 1.php
完美写入,接着你的站就会被玩坏了,写入shell后我们可以插件数据库链接密码,进网站后台,脱裤,挂黑链等等等等
网站里有几个目录是默认可以写入的?在你的网站目录下执行ls -l
通常plugins themes uploads
这三个目录都是可以写入的。
你还有其他目录可以写入?赶紧修改权限吧!
加入我们的网站在/var/www/html/root
那么下面的命令是极好的,对于必须要有上传权限的uploads目录,我们下面再说
chown -R nginx.apache html
find /var/www/html/root -type d -exec chmod 750 {} \;
find /var/www/html/root -not -type d -exec chmod 640 {} \;
chmod 770 /var/www/html/root/uploads -R
如果你有某些插件也需要写入权限,给他权限,并认真看下面的内容。
2.执行目录限制
我们的apache权限有多大呢?相同的网站拥有相同的权限。
默认情况下,我们的apache权限能浏览大部分目录。最要命的问题在于,他可以跨站执行,从你的网站一直接执行到网站二。
我们需要给他一个限制,每个虚拟主机一个单独的限制,没错就是open_basedir。
这里我们需要特别的技巧,每个虚拟机都要限制
这样虚拟主机将只允许在网站目录和tmp目录执行,而不能穿越到其他目录
在乌云有一篇讨论绕过open_basedir
的文章,所以open_basedir
只能让你更安全而不是彻底安全,所以你还需要往下看。
server {
location ~ .*\.php(\/.*)*$ {
#include pathinfo.conf;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp/";
3.PHP的限制
我们想一个另类解决办法,如何限制webshell的执行?
在php.ini里,我们可以选择关闭某些不安全的函数
但是由于php这玩意分之多又复杂,这里只能整理出一部分不安全的函数。
直接添加到php.ini最后面即可
disable_functions=exec,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,dl,popen,pcntl_exec,socket_accept,socket_bind,socket_clear_error,socket_close,socket_connect,socket_create_listen,socket_create_pair,socket_create,socket_get_option,socket_getpeername,socket_getsockname,socket_last_error,socket_listen,socket_read,socket_recv,socket_recvfrom,socket_select,socket_send,socket_sendto,socket_set_block,socket_set_nonblock,socket_set_option,socket_shutdown,socket_strerror,socket_write,stream_socket_server,disk_total_space,disk_free_space,diskfreespace,getrusage,get_current_user,getmyuid,getmypid,dl,leak,listen,chgrp,link,symlink,dlopen,proc_nice,proc_get_stats,proc_terminate,shell_exec,sh2_exec,posix_getpwuid,posix_getgrgid,posix_kill,ini_restore,mkfifo,dbmopen,dbase_open,filepro,filepro_rowcount,posix_mkfifo,putenv,sleep,chmod,chown,chroot,ini_set,phpinfo,proc_get_status,error_log,syslog,readlink,putenv
在看webshell,我们会发现里面空空如也了,并不能执行命令了。
4.webshell写入与执行
现在我们的网站已经很安全了,他能否更加安全?
现在,我们就要说说我们必须要有执行权限的upload目录了,nginx同样提供了解决方案
location ~ /(usr/uploads)/.*\.(php|php5)?$
{
deny all;
}
这个时候我们打开uploads中的php文件会提示403
403 Forbidden
You don't have permission to access the URL on this server. Sorry for the inconvenience.
我们的效果得到验证,即使写入也不能执行。
5.必须要写入权限但是又包含php文件的目录。
例如我的用的邮件通知插件目录内有cache和和log目录,是必须有写入权限的
这里千万不要犯懒,直接给CommentToMail
写入
location ~ /(usr/uploads|usr/plugins/CommentToMail/cache|usr/plugins/CommentToMail/log)/.*\.(php|php5)?$
{
deny all;
}
既可以实现写入文件,又可以让php无法执行。
总结,上面的所有配置:
用户与PHP运行权限分离
nginx:apache
执行目录限制
open_basedir
PHP函数限制
php.ini
特殊目录关闭PHP解析
deny all
权限细分
xx|xx|xx
欢迎拍砖,同时 起司靶场v2 上线,完全脱离安全锁之类的软件,欢迎测试。
起司靶场v2
如何学习
SEO搜索引擎优化
规范:在<style></style>中写CSS代码
CSS的注释是/**/
选择器 {
声明1;
声明2;
}
在CSS文件里不用写<style>标签
CSS的优势:
作用:选择页面上的某一个或者某一类元素
伪类:就是有一些条件
1.选择第一个子元素
ul li:first-child {
}
2.选择最后一个子元素
ul li:last-child {
}
3.选择当前元素的父级元素的子元素的第一个,且是p,在本例中。这个是按照类型进行选择
p:nth-child(1) {
}
4.选中父元素下的p元素的第二个,这个是按照顺序选择
p:nth-of-type(1) {
}
属性选择器的格式
1.属性名:存在id属性的元素 a[id]{
}
2.属性名=属性值:a[id=first]{
}
注意:=是绝对等于 *=是包含这个元素
3.a中href中以http开头的 a[href^=http]{
}
注意:可以使用正则表达式
span标签:重点要突出的字使用span标签括起来
1.字体 font-family:字体1, 字体2,...;
2.字体大小 font-size:20px;
3.字体粗细 font-wigth:bold或者使用数字最大是900;
4.字体的颜色 color:颜色;
5.字体风格 font-style:italic;
综合写法:
font:字体粗细, 字体大小/字体行高, 字体, 字体颜色, 字体的;
1. 颜色 color
2. 文本对齐方式 text-slign:center;
3. 首行缩进 text-indent:2em;//1em代表一个字符
4. 行高 line-height:200px;行高和块的高度一致,就可以上下居中
5. 下划线 text-decoration: underline;
6. 中划线 text-decoration: line-through;
7. 上划线 text-decoration: overline;
8. 超链接伪类
a{
默认颜色
}
a:hover {
鼠标触及的颜色
}
a:active {
鼠标点击未释放的颜色
}
9. 文本阴影 text-shadow:颜色 水平偏移 垂直偏移 模糊半径;
<style>
li {
list-style:nonoe; //列表去掉点
}
</style>
背景图片
background-image:url("path");
默认是平铺的
background-repeat: ;
background-position:x y;
综合写法:
background:背景颜色 url("") x方向位置 y方向位置 平铺
背景颜色渐变
<style>
form{
border: 1px red solid;
}
</style>
综合写法:
margin:上 下 左 右;
外边距的妙用:居中元素
margin:0 auto;居中 前提:外面的元素是个块元素,块元素有固定的宽度
内边距一样
盒子的计算方式,你这个元素到底多大?
元素的大小=margin +border + 内容的宽度
border-radius: 左上 右上 右下 左下;
box-shadow:阴影样子, x偏移量, y偏移量, 模糊半径, 阴影颜色;
自上而下的排布
行内元素可以被包含在块级元素中,反之不可以
1.浮动:会使元素向左或向右移动,其周围的元素也会重新排列。
元素的水平方向浮动,意味着元素只能左右移动而不能上下移动。
一个浮动元素会尽量向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。
浮动元素之后的元素将围绕它。
浮动元素之前的元素将不会受到影响。
如果图像是右浮动,下面的文本流将环绕在它左边:
2.相邻的浮动元素:如果你把几个浮动的元素放到一起,如果有空间的话,它们将彼此相邻。
3.清除浮动:元素浮动之后,周围的元素会重新排列,为了避免这种情况,使用 clear 属性。clear 属性指定元素两侧不能出现浮动元素。这样既有浮动的效果,也有块元素的效果
clear:right;右侧不允许有浮动
clear:left;左侧不允许有浮动
clear:both;两侧都不允许有浮动
float:right;右浮动
float:left;左浮动
浮动后,元素不在父级元素里
解决方案:
相对于自己原来的位置,进行偏移
position: relative;
top: -20px;
botom: 20px;
left: 20px;
right: 20px;
相对定位的话,他原来的位置会被保留,不会脱离标准文档流
position: absolute;
top: 20px;
bottom: 20px;
left: 20px;
right: 20px;
绝对定位后,他不在文档标准流,原来的位置不保留
position: fixed;
top: 10px;
bottom: 10px;
left: 20 px;
right: 20px;
相对于浏览器的位置,固定不动
就是把图层置顶、置地
opacity:0.5;设置透明度
filter:alpha(opacity=0.5);
@keyframes规则是创建动画,规则内指定一个CSS样式和动画将逐步从目前的样式更改为新的样式
示例:
@keyframes myfirst {
from {background: red;}
to {background: yellow;}
}
使用@keyframes创建动画,把他绑定到一个选择器上,否则动画不会有效果,指定至少把这两个CSS3的动画属性绑定向一个选择器:
1.规定动画名称
2.规定动画的时长 不指定时长,动画无效,因为默认的时长为0
示例:
把myfirst动画绑定到div元素上,动画时长5秒
div {
animation: myfirst 5s;
}
属性 | 描述 | CSS |
@keyframes | 规定动画。 | 3 |
animation | 所有动画属性的简写属性。 | 3 |
animation-name | 规定 @keyframes 动画的名称。 | 3 |
animation-duration | 规定动画完成一个周期所花费的秒或毫秒。默认是 0。 | 3 |
animation-timing-function | 规定动画的速度曲线。默认是 "ease"。 | 3 |
animation-fill-mode | 规定当动画不播放时(当动画完成时,或当动画有一个延迟未开始播放时),要应用到元素的样式。 | 3 |
animation-delay | 规定动画何时开始。默认是 0。 | 3 |
animation-iteration-count | 规定动画被播放的次数。默认是 1。 | 3 |
animation-direction | 规定动画是否在下一周期逆向地播放。默认是 "normal"。 | 3 |
animation-play-state | 规定动画是否正在运行或暂停。默认是 "running"。 | 3 |
CSS3中,我们为了添加某种效果可以从一种样式转变到另一个的时候
CSS3 过渡是元素从一种样式逐渐改变为另一种的效果。
要实现这一点,必须规定两项内容:
示例:
div {
transition: width 2s;
}
div {
transition: width 2s, height 2s transfrom 2s;
}
属性 | 描述 | CSS |
transition | 简写属性,用于在一个属性中设置四个过渡属性。 | 3 |
transition-property | 规定应用过渡的 CSS 属性的名称。 | 3 |
transition-duration | 定义过渡效果花费的时间。默认是 0。 | 3 |
transition-timing-function | 规定过渡效果的时间曲线。默认是 "ease"。 | 3 |
transition-delay | 规定过渡效果何时开始。默认是 0。 | 3 |
CSS3 转换可以对元素进行移动、缩放、转动、拉长或拉伸。
转换的效果是让某个元素改变形状,大小和位置。
1.translate(): translate()方法,根据左(X轴)和顶部(Y轴)位置给定的参数,从当前元素位置移动。
示例:
div
{
transform: translate(50px,100px);
-ms-transform: translate(50px,100px); /* IE 9 */
-webkit-transform: translate(50px,100px); /* Safari and Chrome */
}
2.rotate():在一个给定度数顺时针旋转的元素。负值是允许的,这样是元素逆时针旋转。
示例:
div
{
transform: rotate(30deg);
-ms-transform: rotate(30deg); /* IE 9 */
-webkit-transform: rotate(30deg); /* Safari and Chrome */
}
3.scale():该元素增加或减少的大小,取决于宽度(X轴)和高度(Y轴)的参数
示例:
-ms-transform:scale(2,3); /* IE 9 */
-webkit-transform: scale(2,3); /* Safari */
transform: scale(2,3); /* 标准语法 */
4.skew(): 包含两个参数值,分别表示X轴和Y轴倾斜的角度,如果第二个参数为空,则默认为0,参数为负表示向相反方向倾斜。
示例:
div
{
transform: skew(30deg,20deg);
-ms-transform: skew(30deg,20deg); /* IE 9 */
-webkit-transform: skew(30deg,20deg); /* Safari and Chrome */
}
1.rotateX():围绕其在一个给定度数X轴旋转的元素。
示例:
div
{
transform: rotateX(120deg);
-webkit-transform: rotateX(120deg); /* Safari 与 Chrome */
}
2.rotateY():围绕其在一个给定度数Y轴旋转的元素。
示例:
div
{
transform: rotateY(130deg);
-webkit-transform: rotateY(130deg); /* Safari 与 Chrome */
}
3.转换属性
属性 | 描述 | CSS |
transform | 向元素应用 2D 或 3D 转换。 | 3 |
transform-origin | 允许你改变被转换元素的位置。 | 3 |
transform-style | 规定被嵌套元素如何在 3D 空间中显示。 | 3 |
perspective | 规定 3D 元素的透视效果。 | 3 |
perspective-origin | 规定 3D 元素的底部位置。 | 3 |
backface-visibility | 定义元素在不面对屏幕时是否可见。 | 3 |
序列 | 术语 |
1 | 容器和项目是容器的子元素,容器为父元素(container / item) |
2 | 主轴与交叉轴(main-axis / cross-arxis) |
3 | 起始线与结束线(flex-start / flex-end) |
序号 | 属性 | 描述 |
1 | flex-direction | 设置容器中的主轴方向:行/水平方向,列/垂直方向 |
2 | flex-wrap | 是否允许创建多行容器,即flex项目一行排列不下时,是否允许换行 |
3 | flex-flow | 简化flex-direction和flex-wrap属性 |
4 | justify-content | 设置flex项目在主轴上的对齐方式 |
5 | align-items | 设置flex项目在交叉轴上的对齐方式 |
6 | align-content | 多行容器中,项目在交叉轴上的对齐方式 |
序号 | 属性 | 描述 |
1 | flex-basis | 项目宽度:项目分配主轴剩余空间之前,项目所占据的主轴空间高度 |
2 | flex-grow | 项目的宽度扩展:将主轴上的剩余空间按比例分配给指定项目 |
3 | flex-shrink | 项目的宽度收缩:将项目上多出空间按比例在项目间进行缩减 |
4 | flex | 上面三个属性的简化缩写flex: flex-grow flex-shrink flex-basis |
5 | align-self | 单独定义某个项目在交叉轴上的对齐方式 |
6 | order | 自定义项目在主轴上的排列顺序,默认为0书写顺序,值越小位置越靠前 |
序号 | 属性 | 描述 |
1 | flex-direction | 设置主轴方向 |
2 | flex-wrap | 设置多行容器 |
3 | flex-flow | flex-direction和flex-wrap缩写 |
1.flex-direction属性值
序号 | 属性 | 描述 |
1 | row | 默认:主轴为水平方向(从左到右) |
2 | row-reverse | 主轴为水平方向(从右到左反序) |
3 | column | 设置主轴为垂直方向(从上到下) |
4 | column-reverse | 设置主轴为垂直方向(从下到上) |
2.flex-wrap属性值
序号 | 属性 | 描述 |
1 | nowrap | 默认:不换行,此时忽略项目尺寸 |
2 | wrap | 允许换行此时项目尺寸有效,即允许创建多行容器 |
3.flex-flow属性值
flex-flow: 主轴方向 多行容器
主轴上要有剩余空间对齐才有效
序号 | 属性值 | 描述 |
1 | flex-start | 默认:所有项目与主轴起始线对齐 |
2 | flex-end | 所有项目与主轴终止线对齐 |
3 | center | 所有项目与主轴中间线对齐,居中对齐 |
4 | space-between | 两端对齐:剩余空间在头尾项目之外的项目平均分配 |
5 | spcae-around | 分散对齐:剩余空间在每个项目两侧平均分配,每个项目两边的空间一样 |
6 | space-evenly | 平均对齐:剩余空间在每个项目之间平均分配 |
序号 | 属性值 | 描述 |
1 | flex-start | 默认所有项目与交叉轴起始线对齐 |
2 | flex-end | 所有项目与交叉轴终止线对齐 |
3 | center | 所有项目与交叉轴中间线对齐,居中对齐 |
注意
属性:align-content
序号 | 属性值 | 描述 |
1 | stretch | 默认:项目拉伸占据整个交叉轴 |
2 | flex-start | 所有项目与交叉轴起始线(顶部)对齐 |
3 | flex-end | 所有项目与交叉轴终止线对齐 |
4 | center | 所有项目与交叉轴中间线对齐:居中对齐 |
5 | space-between | 两端对齐:剩余空间在头尾项目之外的项目间平均分配 |
6 | space-around | 分散对齐:剩余空间在每个项目两侧平均分配 |
7 | space-evenly | 平均分配:剩余空间在每个项目之间平均分配 |
注意:多行容器中,交叉轴上可能会有多个项目,剩余空间在项目之间分配才有意义
多行容器也只是只有一个主轴和一个交叉轴,只是在主轴上放不下了换行形成的
属性:align-self
序号 | 属性值 | 描述 |
1 | auto | 默认值:auto,继承align-items属性值 |
2 | flex-start | 与交叉轴起始线对齐 |
3 | flex-end | 与交叉轴终止线对齐 |
4 | center | 与交叉轴中间线对齐:居中对齐 |
5 | stretch | 在交叉轴方向上拉伸 |
6 | baseline | 与基线对齐 |
用来调整每个项目在主轴上排列顺序
属性值为0,默认值按书写顺序显式,属性值为值越大越靠后显示
flex-grow属性
flex-shrink属性
flex-basis属性
优先级:项目大小<flex-basis<min-width/height
*请认真填写需求信息,我们会在24小时内与您取得联系。