使用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。需要更多的解释需要更多的解释