我遇到了Magento中的一个错误,但我希望比我聪明的人能解释一下。
在VoteController.php中,函数addAction
在其最后一行调用_redirectReferer
。这样做的目的是在Magento投票中投票后将用户重定向回原始页面。
_redirectReferer
调用_getRefererUrl
,它从几个地方获取引用网址。此函数执行的最后一项操作是在URL字符串上调用escapeUrl
。 escapeUrl
是htmlspecialchars
的包装器。
结果是example.com/?a=b&c=d
之类的网址变为example.com/?a=b&c=d
(注意破坏的&符号)。
在URL上调用htmlspecialchars的目的是什么?
资源
addAction
:/ app/code/core/Mage/Poll/controllers/VoteController.php
_redirectReferer
和_getRefererUrl
:/ app/code/core/Mage/Core/Controller/Varien/Action.php
escapeUrl
:/ app/code/core/Mage/Core/Helper/Abstract.php
答案 0 :(得分:4)
背景: &
是&符号所需的html实体表示;否则浏览器会假设源中的&
后面的任何内容都是实体表示。参考http://www.w3.org/QA/2005/04/php-session#background。
每当呈现URL时这都很好,但是当在服务器端计算重定向并将其应用于响应对象时,这是不理想的。因此这是一个错误,并且是一个很好的借口来重写core/data
助手,以便以正确的方式逃避。
POC对于任何懒得的人:-)来设置民意调查:
<?php
include 'app/Mage.php';
Mage::app();
$p = Mage::app()->getRequest()->getParams();
if (empty($p)) {
$refererUrl = Mage::app()->getRequest()->getServer('HTTP_REFERER').'?foo=bar&baz=bip';
$refererUrl = Mage::helper('core')->escapeUrl($refererUrl);
Mage::app()->getResponse()->setRedirect($refererUrl);
Mage::app()->getResponse()->sendResponse();
exit;
}
var_dump($p);