作者:nzwznet_355 | 来源:互联网 | 2023-09-14 21:56
base64编码什么是编码什么是base64编码作用明文传输base64编码的特点是参考listLess-21中含limit的注入语句与含orderby的注入语句的细微差别1.ba
- base64编码
- Less-21中含limit的注入语句与含order by的注入语句的细微差别
1.base64编码
什么是编码?
- 它的本质是什么?
编码是信息从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。
表示形式不一样,表示的内容是一样的
- 它的第一原则是什么?
方便在不同终端、机器、地区上去表示字符,按着需求(1.没办法表示汉字了2.怎么样更好在网络上去传输 3.怎么统一各种各样的字符集)不断去拓展新的编码方法。
- 它的知识结构是怎样的?
编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)
中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示6000多个常用汉字。
● 汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。
● 中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。
● 每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。
● 终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。
● UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8个位和 16个位。
于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。但是目前的电脑来看,硬盘都是白菜价,电脑性能也已经足够无视这点性能的消耗了。所以推荐所有的网页使用统一编码:UTF-8。
什么是base64编码?
为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送。
这样用途就受到了很大的限制,比如图片二进制流的每个字节不可能全部是可见字符,所以就传送不了。最好的方法就是在不改变传统协议的情 况下,做一种扩展方案来支持二进制文件的传送。
把不可打印的字符也能用可打印字符来表示,问题就解决了。Base64编码应运而生,Base64就是一种 基于64个可打印字符来表示二进制数据的表示方法。
作用?明文传输?
Base64编码可用于在HTTP环境下传递较长的标识信息。
例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。
在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式。
此时,采用Base64编码具有不可读性,即所编码的数据不会被人用肉眼所直接看到。
然而,标准的Base64并不适合直接放在URL里传输,因为URL编码器会把标准Base64中的“/”和“+”字符变为形如“%XX”的形式,而这些“%”号在存入数据库时还需要再进行转换,因为ANSI SQL中已将“%”号用作通配符。
为解决此问题,可采用一种用于URL的改进Base64编码,它不仅在末尾去掉填充的’=’号,并将标准Base64中的“+”和“/”分别改成了“-”和“_”,这样就免去了在URL编解码和数据库存储时所要作的转换,避免了编码信息长度在此过程中的增加,并统一了数据库、表单等处对象标识符的格式。
base64编码的特点是?
有些末尾有=号
参考list:
从原理上搞定编码(一)– 初识编码
从原理上搞定编码(二)– Web编码
从原理上搞定编码(四)– Base64编码
2.Less-21中,含limit的注入语句与含order by的注入语句的细微差别?
要不要or 1=1 ?还有username 什么时候填写 1 ?什么时候填写admin?
如果有or 1=1,写啥都一样
如果没有or 1=1且使用order by 的时候,填写admin,有时候可以使得返回的查询条数>0,使得web前端页面可以正常返回
源码中 $sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";
1.1') order by 3 #
语句没错,但数据库中并没有username =1 的记录,所以查询的条数为0
如果查询条数<1&#xff0c;web前端页面则返回
2.1&#39;) or 1&#61;1 order by 2 #
$sql&#61;"SELECT * FROM users WHERE username&#61;(&#39;1&#39;) or 1&#61;1 order by 2 #&#39;) LIMIT 0,1";
因为or 1&#61;1&#xff0c;所以where后面的恒为真&#xff0c;实际上变成了
$sql&#61;"SELECT * FROM users order by 2 #&#39;) LIMIT 0,1";
查询条数>1,所以web前端页面返回正常