0

静态页面 A 有一个表单,其中包含提交到授权页面B 的操作,该授权页面 B 是一个动态页面。授权后,B 将重定向到 A 传递给 B 的回调 url C。

除了重定向到页面 C 之外,B 还发布了一些指示身份验证状态的参数。uin是一个最重要的参数,将在页面 C 的内容(即脚本)中使用。脚本需要uin稍后发送 Ajax 请求。问题是如何将uin传递给静态页面 C?

我得到的一个快速而肮脏的想法是用 PHP 文件包装静态页面 C,并以隐藏div的形式输出数据,例如:

<?php
$html = file_get_contents("callback.html")
$div = "<div stype='display:none' uin={$_POST['uin']}></div>"
//add this div to $html and print it, need a little more work to figure out how to do this
?>

有没有更好的方法来做到这一点,因为我认为这是一种“白痴”......

4

3 回答 3

1

您的代码:(stype已修复错字)

$div = "<div style=\"display:none\" uin={$_POST['uin']}></div>";

查看这段代码,我可以看到的最大问题是您输出一个$_POST值而没有对其进行任何转义。

这是一个潜在的安全威胁;考虑一下如果有人提供了一个发布到您网站的表单,其uin值设置为一串 HTML 代码,>以关闭div. 他们的代码将出现在您的站点中,就像您将其放在那里一样。通过精心设计,他们可以使用它使您的网站看起来和行为随他们的意愿而变化。不是很好。

您可以通过使用包装$_POST变量来解决此问题,html_entities()以便在将其输出到站点时正确转义。

或者,在这种情况下,由于它是(或看起来是)数字 ID 值,您可以简单地将其转换为 int 以确保它不包含不需要的数据,无论实际发布数据包含什么:

$uin = (int)$_POST['uin'];

...然后$uin在输出而不是原始帖子数据中使用。

我要说的第二点是有效性。uin不是有效的 HTML 属性。它可能有效,但无效。在 HTML 中执行自定义属性的正确符合标准的方法是使用数据属性,如下所示:

$div = "<div style=\"display:none\" data-uin={$uin}></div>";

...即所有自定义属性的名称应以data-

建议这样做,因为它允许您拥有与真实属性同名的自定义属性,而不会冒任何问题。例如,您可以拥有,而不会与真实属性data-style发生冲突。style

这也意味着 HTML 规范可以添加新的属性,而不会有与其他人的代码发生冲突的风险。例如,如果未来版本的 HTML 包含一个uin属性,未来的浏览器会使用该属性对元素进行巧妙处理,这将导致您的代码出现问题。如果您使用data-uin. (好吧,uin新标准 HTML 属性的名称不太可能,但重点是)

于 2013-07-17T10:52:19.393 回答
0

您的 php 代码中有语法错误,您需要屏蔽内联样式周围的引号,并且您错过了添加一些冒号:

<?php
$html = file_get_contents("callback.html");
$div = "<div style=\"display:none\" uin={$_POST['uin']}></div>";
//add this div to $html and print it, need a little more work to figure out how to do this
echo($html); // print variable $html
echo($div); // print variable $div
?>
于 2013-07-17T10:31:57.657 回答
0

也许您应该将页面 B 中的参数存储在用户会话中。在页面 C 上,您可以使用这些参数(在将session_start()任何内容输出到浏览器之前调用之后)。此外,如果您使用的是 javascript,请考虑将 uin 放在 javascript 变量中而不是 html div 中。类似的东西<script type="text/javascript">var uin = 123; </script>

于 2013-07-17T10:40:23.083 回答