javascript - %0a(换行符)的执行解析过程
test.php
文件的代码如下:
<code> <!--情况1--> <script type="text/javascript"> //var a = "<?php echo $_GET['input'];?>"; </script> <!--情况2--> <script type="text/javascript"> //var a = "start_%0a_end"; </script> </code>
情况1:
变量a的值是可控的,由参数input决定,
所以,当从浏览器访问:http://127.0.0.1/test.php?input=start_%0a_end
的时候
查看网页源代码,结果如下:
<code>//省略…… <!--情况1--> <script type="text/javascript"> //var a = start_ _end; </script> <!--情况2--> <script type="text/javascript"> //var a = "start_%0a_end"; </script> //省略…… </code>
我们可以发现,情况1中,出现了换行,而情况2保持原样。
为什么会出现这种情况呢?
谁能帮忙详细讲解下其中的原理吗?
说下我对此问题的看法:
当客户端访问网址(http://127.0.0.1/test.php?input=start_%0a_end)的时候,由于是php文件,所以服务端会交个Apache服务器解析执行,并把结果返回给服务端,服务端再将结果通过http响应返回给客户端(浏览器),浏览器再将页面渲染出来,呈现给用户。
用户--->浏览器--->服务器--->apache
那么,
换行到底是:
1.出现在Apache的解析执行的阶段
2.还是浏览器将最终结果呈现给用户这一阶段
如果是出现在Apache的解析执行阶段,那么<?php echo "start_%0a_end";?>
应该也会出现换行,但实际上并没有
而如果换行是出现在:浏览器的渲染阶段,那么
<code><br><br><script type="text/javascript"> var a = "start_%0a_end";//注意:此行没有注释 </script> </code>
应该也会出现换行才是,但实际上也没有
回复内容:
test.php
文件的代码如下:
<code> <!--情况1--> <script type="text/javascript"> //var a = "<?php echo $_GET['input'];?>"; </script> <!--情况2--> <script type="text/javascript"> //var a = "start_%0a_end"; </script> </code>
情况1:
变量a的值是可控的,由参数input决定,
所以,当从浏览器访问:http://127.0.0.1/test.php?input=start_%0a_end
的时候
查看网页源代码,结果如下:
<code>//省略…… <!--情况1--> <script type="text/javascript"> //var a = start_ _end; </script> <!--情况2--> <script type="text/javascript"> //var a = "start_%0a_end"; </script> //省略…… </code>
我们可以发现,情况1中,出现了换行,而情况2保持原样。
为什么会出现这种情况呢?
谁能帮忙详细讲解下其中的原理吗?
说下我对此问题的看法:
当客户端访问网址(http://127.0.0.1/test.php?input=start_%0a_end)的时候,由于是php文件,所以服务端会交个Apache服务器解析执行,并把结果返回给服务端,服务端再将结果通过http响应返回给客户端(浏览器),浏览器再将页面渲染出来,呈现给用户。
用户--->浏览器--->服务器--->apache
那么,
换行到底是:
1.出现在Apache的解析执行的阶段
2.还是浏览器将最终结果呈现给用户这一阶段
如果是出现在Apache的解析执行阶段,那么<?php echo "start_%0a_end";?>
应该也会出现换行,但实际上并没有
而如果换行是出现在:浏览器的渲染阶段,那么
<code><br><br><script type="text/javascript"> var a = "start_%0a_end";//注意:此行没有注释 </script> </code>
应该也会出现换行才是,但实际上也没有
接 @安坚实
的答案,query string
由于地址栏显示、日志记录、或者转义等各方面的需要,必须将部分字符进行翻译(比如无法显示的字符、有特殊含义的控制字符等)
所以你在百度搜索一个
&
符号的时候 访问到的链接 实际是http://www.baidu.com/s?wd=%26
因为这个字符与query string中的参数连接符
冲突了,需要进行转义
这个过程就是一个编码的过程,这样的编码算法最常见的就是 URLEncode
和 Base64Encode
而此处使用的是 URLEncode
,这个是在 RFC 3986 中定义的
服务端收到了这个请求时,先原样记录在日志中,然后将参数变成应用程序里的字符串 交给web应用处理
这个时候就需要进行一个解码过程,否则得到的数据就与预期不一致了
接上面那个例子,我想搜索的是 字符串
&
而不是 字符串%26
,因此需要解码变回&
再解释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 并没有被转换成换行。
<code>var_dump($_SERVER['QUERY_STRING']); # string(19) "input=start_%0a_end" </code>
但是,当它被写入到 $_GET 全局数组里时,就变成换行了
<code>var_dump($_GET['input']); #string(11) "start_ #_end" </code>
因此,应该是PHP解释器在把 query string 的值写入 $_GET 里时,进行了某些处理
至于为什么进行这样的处理,以及如何解决... 这个超出我的知识范围了...
其实这里只涉及到一个知识点,URIEncode,
URI内的字符在传输时会进行转义,当处理程序收到数据时会进行反转义;%0a
的转义过程大致如下(JS,PHP的过程 @安坚实 已解释了部分):
<code>// encode encodeURIComponent('\n') // %0A encodeURIComponent('\n').toLowerCase() === '%0a' // true // decode decodeURIComponent('%0a').charCodeAt(0) // 10 '\n'.charCodeAt(0) // 10 </code>
关于 JS URI 编码部分可见:
http://www.ruanyifeng.com/blog/2010/02/url_encoding.html

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Dans PHP8, les expressions de correspondance sont une nouvelle structure de contrôle qui renvoie différents résultats en fonction de la valeur de l'expression. 1) Il est similaire à une instruction Switch, mais renvoie une valeur au lieu d'un bloc d'instruction d'exécution. 2) L'expression de correspondance est strictement comparée (===), ce qui améliore la sécurité. 3) Il évite les éventuelles omissions de rupture dans les instructions de commutation et améliore la simplicité et la lisibilité du code.

En PHP, vous pouvez prévenir efficacement les attaques du CSRF en utilisant des jetons imprévisibles. Les méthodes spécifiques comprennent: 1. Générer et intégrer les jetons CSRF dans la forme; 2. Vérifiez la validité du jeton lors du traitement de la demande.

Les types stricts en PHP sont activés en ajoutant Declare (strict_types = 1); en haut du fichier. 1) Il force la vérification du type des paramètres de fonction et des valeurs de retour pour éviter la conversion de type implicite. 2) L'utilisation de types stricts peut améliorer la fiabilité et la prévisibilité du code, réduire les bogues et améliorer la maintenabilité et la lisibilité.

Dans PHP, le mot-clé final est utilisé pour empêcher les classes d'être héritées et les méthodes écrasées. 1) Lors du marquage de la classe comme final, la classe ne peut pas être héritée. 2) Lors du marquage de la méthode comme final, la méthode ne peut pas être réécrite par la sous-classe. L'utilisation de mots clés finaux garantit la stabilité et la sécurité de votre code.

En utilisant récemment des fichiers de police installés localement dans les pages Web, j'ai téléchargé une police gratuite à partir d'Internet et je l'ai installée avec succès dans mon système. Maintenant...

Comment utiliser JavaScript ou CSS pour contrôler le haut et la fin de la page dans les paramètres d'impression du navigateur. Dans les paramètres d'impression du navigateur, il existe une option pour contrôler si l'écran est ...

Comment utiliser des fichiers de police installés localement sur les pages Web avez-vous rencontré cette situation dans le développement de pages Web: vous avez installé une police sur votre ordinateur ...

Composer est un outil de gestion des dépendances pour PHP. Les étapes principales de l'utilisation du compositeur comprennent: 1) DÉCLARIER DES DÉPÉLENCES DANS COMPOSER.JSON, tels que "Stripe / Stripe-Php": "^ 7.0"; 2) Exécutez ComposeRrinstall pour télécharger et configurer les dépendances; 3) Gérer les versions et les autoloads via Composer.lock et Autoload.php. Le compositeur simplifie la gestion des dépendances et améliore l'efficacité du projet et la maintenabilité.
