Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP安全重定向到新URL_Php - Fatal编程技术网

使用PHP安全重定向到新URL

使用PHP安全重定向到新URL,php,Php,我有一个联系人表单,当前在发送电子邮件后重新加载根页面 标题('location:/?message=success') 虽然我现在希望它转到$\u POST['contact\u page']中存储的页面URL,但效果很好。但是,使用类似于以下代码的代码似乎不是一种好的做法: header('location:http://'.$\u POST['contact\u page'.'?message=success') 我主要担心的是,有人可能会将URL更改为邪恶的内容,然后这个命令就会执行它。

我有一个联系人表单,当前在发送电子邮件后重新加载根页面

标题('location:/?message=success')

虽然我现在希望它转到
$\u POST['contact\u page']
中存储的页面URL,但效果很好。但是,使用类似于以下代码的代码似乎不是一种好的做法:

header('location:http://'.$\u POST['contact\u page'.'?message=success')

我主要担心的是,有人可能会将URL更改为邪恶的内容,然后这个命令就会执行它。(另外,对于新URL中的
message
参数,重复运行此代码将导致在末尾添加越来越多的相同参数的实例。)

我的问题:使用
标题将用户重定向到
$\u POST['contact\u page']
(包括一两个参数,如上面的
消息
)的安全方法是什么

编辑: 页面变量最初是使用以下代码创建的:
$\u SERVER[“HTTP\u HOST”]。$\u SERVER[“REQUEST\u URI”]
,最后以www.mysite.com/which page&maybe\u some=遗留参数的形式结束

header('location: /'.$_POST['contact_page'].'?message=success');


您必须为$\u POST变量中允许的内容创建一个白名单


LuckyBurger之前的回答可能是错误的,如果您的PHP是的,那么您必须在$\u POST变量中创建一个白名单


如果你的PHP是的,那么LuckyBurger之前的回答可能是不正确的。更好的解决方案是,只需将你博客文章的ID以表单的形式发送,然后将其转换为URL。不要实际使用此代码,它更像是一个示例:

HTML

<form>
  <input type='hidden' name='blog_id' value='3'>
</form>

PHP

<?php

// do your form processing

$blogId = $_POST['blog_id'];

// query the database to get the blog post slug/URL
// (this is just an example, don't actually put POST vars directly into queries)
$query = "SELECT p.slug, p.url FROM my_blog_posts p WHERE p.id={$blogId}";
$result = executeMyQuery($query);

$postSlug = $result['slug'];
// OR
$postUrl = $result['url'];

header("location: http://www.yourdomain.com/{$postSlug}?message=success");
// OR
header("location: http://www.yourdomain.com/{$postUrl}");

更好的解决方案是,只需以表单形式发送您博客文章的ID,然后将其转换为URL。不要实际使用此代码,它更像是一个示例:

HTML

<form>
  <input type='hidden' name='blog_id' value='3'>
</form>

PHP

<?php

// do your form processing

$blogId = $_POST['blog_id'];

// query the database to get the blog post slug/URL
// (this is just an example, don't actually put POST vars directly into queries)
$query = "SELECT p.slug, p.url FROM my_blog_posts p WHERE p.id={$blogId}";
$result = executeMyQuery($query);

$postSlug = $result['slug'];
// OR
$postUrl = $result['url'];

header("location: http://www.yourdomain.com/{$postSlug}?message=success");
// OR
header("location: http://www.yourdomain.com/{$postUrl}");

由于这些链接可以指向帖子或网页网站域中的任何内容,并且允许的链接列表将不断增加,因此我采用以下方法。它确保重定向中只包含“page_id”形式的参数,并删除其他任何参数

$page_url=$_POST['contact_page'];     // The URL to redirect to
$url_root=strtok($page_url,"?");    // Everything before the PHP arguments
$url_arg1=strtok("&")."&";          // The first argument
$ok_arg="page_id=";                 
if (strncmp($ok_arg,$url_arg1,strlen($ok_arg))!=0){ // Ditch first argument if not a page/post ID
    $url_arg1="";
}
header('location: http://'.$url_root.'?'.$url_arg1.'message=success'); 

因为这些链接可以指向帖子或网页,网站域中的任何内容,并且允许的链接列表将不断增加,所以我采用了以下方法。它确保重定向中只包含“page_id”形式的参数,并删除其他任何参数

$page_url=$_POST['contact_page'];     // The URL to redirect to
$url_root=strtok($page_url,"?");    // Everything before the PHP arguments
$url_arg1=strtok("&")."&";          // The first argument
$ok_arg="page_id=";                 
if (strncmp($ok_arg,$url_arg1,strlen($ok_arg))!=0){ // Ditch first argument if not a page/post ID
    $url_arg1="";
}
header('location: http://'.$url_root.'?'.$url_arg1.'message=success'); 


您的应用程序可以重定向到多少个可能的端点?几千,还是只有几个?动态的还是固定的?你应该使用被认为可以接受的值的白名单来避免打开重定向漏洞。嗯,这是博客上的一个联系表单,因此访问者可能会从越来越多的文章中删除该表单……因此该联系表单会出现在许多不同的帖子上,并且预期会重定向回相同的原始帖子?是的,因此,如果访问者在www.mysite.com/a-blog-about-fireshore上,并从页脚的联系表单中发送消息,那么当它重新加载时,她将看到完全相同的页面(联系表单将显示“success”或“invalid email”,等等)。所有的帖子都具有
a-blog-about-fireshore
的效果?如果是这样,您可以使用
preg_match()
验证输入,以确保它至少不是外部URL,并重定向。即使它没有指向一个有效的post,那么最严重的损害将是404。您的应用程序可以重定向到多少个可能的端点?几千,还是只有几个?动态的还是固定的?你应该使用被认为可以接受的值的白名单来避免打开重定向漏洞。嗯,这是博客上的一个联系表单,因此访问者可能会从越来越多的文章中删除该表单……因此该联系表单会出现在许多不同的帖子上,并且预期会重定向回相同的原始帖子?是的,因此,如果访问者在www.mysite.com/a-blog-about-fireshore上,并从页脚的联系表单中发送消息,那么当它重新加载时,她将看到完全相同的页面(联系表单将显示“success”或“invalid email”,等等)。所有的帖子都具有
a-blog-about-fireshore
的效果?如果是这样,您可以使用
preg_match()
验证输入,以确保它至少不是外部URL,并重定向。即使它没有指向一个有效的帖子,那么最严重的损害将是404。无论哪种方式,链接都不可操作,因为他使用的是$\u post而不是$\u GET或$\u REQUEST…
HTTP\u REFERER
非常不可靠,并且完全不是由某些浏览器提供的。永远不要依赖于非空值。你是真的,Martin。更正。由于他使用的是$\u POST而不是$\u GET或$\u REQUEST…
HTTP\u REFERER
是非常不可靠的,并且完全不是由某些浏览器提供的。不要依赖它,永远都是非空值。你是对的,Martin。需要更多的解释需要更多的解释