如果URL中有任何html实体,是否会自动解码URL?

时间:2016-11-30 14:44:58

标签: php url uri

方案: - 我在成功登录后将用户重定向到上一页。 login.php 有一个表单,其中包含用户名和密码以及POST到 login_check.php login_check.php 检查用户的身份验证,如果通过,它会将用户重定向到默认页面,除非用户有选择(即:如果他访问了其他某个页面,请说 people.php 并且people.php发现他没有登录并将他重定向到登录页面,以便他可以在成功登录后返回)。我还将访问过的网址存储在 login.php 中表单中的隐藏字段中: -

echo '<input type="hidden" name="location" value="';
 if(isset($_GET['location']))
 {
  echo htmlspecialchars($_GET['location']);
 }
echo '"/>';

login_check.php 中,验证后检查我是否有用户选择,否则将其重定向到默认页面: -

//REDIRECT USER TO PREVIOUS PAGE IF ANY
if(isset($_POST['location']))
{
   header("location:".$_POST['location']);
   exit;
} 

我的问题: - 如果我在浏览器中编写URI oples.php ,它会提示我相应登录并在登录后重定向我。如果我尝试类似的话 people&amp; lsquo; s.php 我找不到页面消息。(使用htmlspecialchars()的编码URL存储在隐藏字段中,如上面的代码所示)。那么,URL的解码在哪里发生?为什么它不起作用(即:people&amp; lsquo; s.php)?

2 个答案:

答案 0 :(得分:0)

如果您在HTML文档中编写HTML实体(而不是在具有内部CDATA的元素内部,如<script>),那么实体将在解析HTML并生成DOM时进行解码。

这是<input value=...示例中发生的情况。

当提交表单时,当浏览器从表单中的输入构造URL时,实体已经被解码。

当您将HTML实体放入HTTP标头(例如location)时,浏览器不会对其进行解码.HTTP标头不是HTML文档,因此不会被解析为HTML。

在您的示例中,实体已经被浏览器解码,然后被发送到服务器以填充$_POST

当您在浏览器的地址栏中放置HTML实体时,浏览器不会对其进行解码。 URL不是HTML文档,因此不会被解析为HTML。

答案 1 :(得分:-1)

我的观点是,您不应该使用需要编码的字符来命名文件。

在文件login_check.php中,您可以使用:

header("location:".htmlspecialchars_decode($_POST['location']));

&lsquo;解码回'