首页 >

javascript – %0a(换行符)的执行解析过程

后端开发|php教程javascript - %0a(换行符)的执行解析过程
php,浏览器,字符编码,javascript
后端开发-php教程
test.php文件的代码如下:
物品交换源码,vscode如何取消变量,ubuntu下pcl,tomcat日志时间不对,爬虫 ip切换,php 安卓市场,禅城seo排名优化报价,开发网站的代码,dedecms图片模板lzw
//var a = "";//var a = "start_%0a_end";

情况1:
变量a的值是可控的,由参数input决定,
所以,当从浏览器访问:http://127.0.0.1/test.php?input=start_%0a_end
的时候
查看网页源代码,结果如下:

十三水源码代理,amd平台ubuntu,tomcat直接对外访问,史前爬虫馆,php如何验证验证码,信息流和seo工作流程lzw
//省略……//var a = start__end;//var a = "start_%0a_end";//省略……

我们可以发现,情况1中,出现了换行,而情况2保持原样。
为什么会出现这种情况呢?

微信公众号电影源码,vscode命令行打不开,ubuntu进入redis,tomcat密码修改无效,爬虫url不变,popen函数 php,程序猿要不要学seolzw
谁能帮忙详细讲解下其中的原理吗?

说下我对此问题的看法:
当客户端访问网址(http://127.0.0.1/test.php?input=start_%0a_end)的时候,由于是php文件,所以服务端会交个Apache服务器解析执行,并把结果返回给服务端,服务端再将结果通过http响应返回给客户端(浏览器),浏览器再将页面渲染出来,呈现给用户。
用户—>浏览器—>服务器—>apache
那么,
换行到底是:
1.出现在Apache的解析执行的阶段
2.还是浏览器将最终结果呈现给用户这一阶段
如果是出现在Apache的解析执行阶段,那么应该也会出现换行,但实际上并没有
而如果换行是出现在:浏览器的渲染阶段,那么


var a = "start_%0a_end";//注意:此行没有注释

应该也会出现换行才是,但实际上也没有

回复内容:

test.php文件的代码如下:

//var a = "";//var a = "start_%0a_end";

情况1:
变量a的值是可控的,由参数input决定,
所以,当从浏览器访问:http://127.0.0.1/test.php?input=start_%0a_end
的时候
查看网页源代码,结果如下:

//省略……//var a = start__end;//var a = "start_%0a_end";//省略……

我们可以发现,情况1中,出现了换行,而情况2保持原样。
为什么会出现这种情况呢?

谁能帮忙详细讲解下其中的原理吗?

说下我对此问题的看法:
当客户端访问网址(http://127.0.0.1/test.php?input=start_%0a_end)的时候,由于是php文件,所以服务端会交个Apache服务器解析执行,并把结果返回给服务端,服务端再将结果通过http响应返回给客户端(浏览器),浏览器再将页面渲染出来,呈现给用户。
用户—>浏览器—>服务器—>apache
那么,
换行到底是:
1.出现在Apache的解析执行的阶段
2.还是浏览器将最终结果呈现给用户这一阶段
如果是出现在Apache的解析执行阶段,那么应该也会出现换行,但实际上并没有
而如果换行是出现在:浏览器的渲染阶段,那么


var a = "start_%0a_end";//注意:此行没有注释

应该也会出现换行才是,但实际上也没有

@安坚实 的答案,query string由于地址栏显示、日志记录、或者转义等各方面的需要,必须将部分字符进行翻译(比如无法显示的字符、有特殊含义的控制字符等)

这个过程就是一个编码的过程,这样的编码算法最常见的就是 URLEncodeBase64Encode
而此处使用的是 URLEncode,这个是在 RFC 3986 中定义的

服务端收到了这个请求时,先原样记录在日志中,然后将参数变成应用程序里的字符串 交给web应用处理
这个时候就需要进行一个解码过程,否则得到的数据就与预期不一致了

再解释LZ的例子,浏览器中访问http://127.0.0.1/test.php?input=start_%0a_end时,
其实input这个参数的实际值 并不是 start_%0a_end 这个字符串,只是因为地址栏无法显示换行符,将换行符进行了转义, 他的实际值就是start_[换行]_end,页面输出时,将他还原成了[换行]

如果你想要指定 input参数的实际值为 start_%0a_end, 需要将% 做一次转义,变为 %25

尝试访问一下 http://127.0.0.1/test.php?input=start_%250a_end

解析过程其实是这样的:
用户 –> 浏览器 –> 服务器 –> apache –> PHP解释器

首先,start_%0a_end 被传递给PHP解释器时,%0a 并没有被转换成换行。

var_dump($_SERVER['QUERY_STRING']);   # string(19) "input=start_%0a_end"

但是,当它被写入到 $_GET 全局数组里时,就变成换行了

var_dump($_GET['input']); #string(11) "start_#_end"

因此,应该是PHP解释器在把 query string 的值写入 $_GET 里时,进行了某些处理
至于为什么进行这样的处理,以及如何解决… 这个超出我的知识范围了…

其实这里只涉及到一个知识点,URIEncode,
URI内的字符在传输时会进行转义,当处理程序收到数据时会进行反转义;
%0a 的转义过程大致如下(JS,PHP的过程 @安坚实 已解释了部分):

// encodeencodeURIComponent('\n') // %0AencodeURIComponent('\n').toLowerCase() === '%0a' // true// decodedecodeURIComponent('%0a').charCodeAt(0)  // 10'\n'.charCodeAt(0) // 10

关于 JS URI 编码部分可见:
http://www.ruanyifeng.com/blog/2010/02/url_encoding.html


javascript - %0a(换行符)的执行解析过程
  • 为什么从url中直接传递"n"没办法换行?
  • 为什么从url中直接传递"n"没办法换行? | 为什么从url中直接传递"n"没办法换行? ...

    javascript - %0a(换行符)的执行解析过程
  • PHP字符编码问题-总结
  • PHP字符编码问题-总结 | PHP字符编码问题-总结 ...

    javascript - %0a(换行符)的执行解析过程
  • Python使用chardet判断字符编码
  • Python使用chardet判断字符编码 | Python使用chardet判断字符编码 ...