Table des matières
谁能帮忙详细讲解下其中的原理吗?
回复内容:
Maison développement back-end tutoriel php javascript - %0a(换行符)的执行解析过程

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

Jun 06, 2016 pm 08:40 PM
javascript php 字符编码 浏览器

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>
Copier après la connexion
Copier après la connexion

情况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>
Copier après la connexion
Copier après la connexion

我们可以发现,情况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>
Copier après la connexion
Copier après la connexion

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

回复内容:

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>
Copier après la connexion
Copier après la connexion

情况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>
Copier après la connexion
Copier après la connexion

我们可以发现,情况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>
Copier après la connexion
Copier après la connexion

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

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

所以你在百度搜索一个&符号的时候 访问到的链接 实际是 http://www.baidu.com/s?wd=%26
因为这个字符与query string中的参数连接符冲突了,需要进行转义

这个过程就是一个编码的过程,这样的编码算法最常见的就是 URLEncodeBase64Encode
而此处使用的是 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>
Copier après la connexion

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

<code>var_dump($_GET['input']); 
#string(11) "start_
#_end"
</code>
Copier après la connexion

因此,应该是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>
Copier après la connexion

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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Commandes de chat et comment les utiliser
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Expliquez l'expression de correspondance (PHP 8) et comment elle diffère du commutateur. Expliquez l'expression de correspondance (PHP 8) et comment elle diffère du commutateur. Apr 06, 2025 am 12:03 AM

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.

Qu'est-ce que la contrefaçon de demande inter-sites (CSRF) et comment implémentez-vous la protection CSRF dans PHP? Qu'est-ce que la contrefaçon de demande inter-sites (CSRF) et comment implémentez-vous la protection CSRF dans PHP? Apr 07, 2025 am 12:02 AM

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.

Expliquez des types stricts (Declare (strict_types = 1);) en php. Expliquez des types stricts (Declare (strict_types = 1);) en php. Apr 07, 2025 am 12:05 AM

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é.

Comment pouvez-vous empêcher une classe d'être prolongée ou une méthode d'être remplacée en PHP? (mot-clé final) Comment pouvez-vous empêcher une classe d'être prolongée ou une méthode d'être remplacée en PHP? (mot-clé final) Apr 08, 2025 am 12:03 AM

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.

Comment afficher correctement le 'Jingnan Mai Round Body' installé localement sur la page Web? Comment afficher correctement le 'Jingnan Mai Round Body' installé localement sur la page Web? Apr 05, 2025 pm 10:33 PM

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 contrôler le haut et la fin des pages dans les paramètres d'impression du navigateur via JavaScript ou CSS? Comment contrôler le haut et la fin des pages dans les paramètres d'impression du navigateur via JavaScript ou CSS? Apr 05, 2025 pm 10:39 PM

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? Comment utiliser des fichiers de police installés localement sur les pages Web? Apr 05, 2025 pm 10:57 PM

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 ...

À quoi sert un compositeur? À quoi sert un compositeur? Apr 06, 2025 am 12:02 AM

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é.

See all articles