【问题标题】:problems with htmlspecialcharshtmlspecialchars 的问题
【发布时间】:2009-05-05 12:20:41
【问题描述】:

我正在从以下 php 代码生成链接。链接出现在浏览器中,生成的 html 代码看起来不错,但是链接不可点击。我在 IE 和 FF 中对此进行了测试,并尝试使用 FireBug 进行查看,但无济于事。

生成表单的代码

$uploadhtml = htmlspecialchars(json_encode("<form action='up.php' method='post'
enctype='multipart/form-data'>
<label for='file'>Filename:</label>
<input type='file' name='file' id='file'/> 
<br />
<input type='hidden' name='pk' value='".$pk."'>
<input type='hidden' name='username' value='".$USERNAME."'>
<input type='submit' name='submit' value='Submit' onclick=\"setTimeout(function() { 
updateByPk('Layer2', '".$pk."', '".$brand."', '".$pg."'); } ),1250);\" />
</form>"), ENT_QUOTES);

生成的html代码:

    <a onclick="makewindows(&#39;&quot;<form action=&#39;up.php&#39; method=&#39;
post&#39;\r\nenctype=&#39;multipart\/form-data&#39;>\r\n<label for=&#39;
`file&#39;>Filename:<\/label>\r\n<input type=&#39;file&#39; name=&#39;file&#39; id=&#39;`file&#39;\/> \r\n<br \/>\r\n<input type=&#39;hidden&#39; name=&#39;pk&#39; value=&#39;
380118179930&#39;>\r\n<input type=&#39;hidden&#39; name=&#39;username&#39; value=&#39;
janmaybach&#39;>\r\n<input type=&#39;submit&#39; name=&#39;submit&#39; value=&#39;
Submit&#39; onclick=\&quot;setTimeout(function() { updateByPk(&#39;Layer2&#39;, 
&#39;380118179930&#39;, &#39;Ed Hardy&#39;, &#39;1&#39;); } ),1250);\&quot; 
\/>\r\n<\/form>&quot;&#39;); return false;" href="#">Upload files</a>

我猜是 JavaScript 错误,但我不知道如何定位?

编辑:没有 ENT_QUOTES 的 html 代码:

<a href="#" onclick="makewindows('&quot;<form action='up.php' method='post'\r
\nenctype='multipart\/form-data'>\r\n<label for='file'>Filename:<\/label>\r\n<input 
type='file' name='file' id='file'\/> \r\n<br \/>\r\n<input type='hidden' name='pk' 
value='380118185183'>\r\n<input type='hidden' name='username' value='janmaybach'>\r
\n<input type='submit' name='submit' value='Submit' onclick=\&quot;setTimeout(function() 
{ updateByPk('Layer2', '380118185183', 'Ed Hardy', '1'); } ),1250);\&quot; 
\/>\r\n<\/form>&quot;'); return false;">Upload files</a>

它仍然无法点击...,一切似乎都被正确引用了?

当我尝试不使用 htmlspecial 字符时,会产生以下 html 输出:

<input type='submit' name='submit' value='Submit' onclick=" settimeout(function()="" {="" updatebypk(="" layer2="" 380118179930="" ed="" hardy="" ,="" 1="" );="" }="" ),1250);="">
'); return false;"&gt;Upload files</a>

【问题讨论】:

  • Paolo:如果我是一个愿意使用 XSS 的破解者,我会​​爱上他 :)
  • @paulo:为什么我的代码这么难看,我能做些什么让它变得更好? @guerda:您如何认为我的代码不安全?一切都经过消毒......
  • @josh:为什么 HTML 或者至少生成它的脚本没有在页面的其他地方?那么你的锚唯一要做的就是调用一个函数,可能用几个字符串来指示要生成什么样的预设。
  • html 将在一个弹出窗口中启动,我将它放在一个变量中,这样我就可以将它传递给我的函数来创建一个弹出窗口。

标签: php javascript


【解决方案1】:

正如问题评论中所说,这绝对是可怕的代码,您正在承受后果。主要问题是代码级别的数量:呈现 Javascript 的服务器代码,呈现 HTML 的服务器代码 - 并且差异在每个级别都出现并相互干扰。

要改善这种情况,请使用带有表单的单独 PHP 页面,并让您的弹出链接打开该页面 - 无需 Javascript。如果您真的想不惜一切代价避免拥有该单独的页面,至少要有在页面标题(非动态)中生成表单的Javascript函数,并且链接仅包含对该函数的调用,其中您的变量为参数。

【讨论】:

  • 我不能轻易拥有一个单独的 php 页面,因为我的弹出函数使用 document.write 将 html 写入屏幕。我可以将 js 函数放在我的 javascript 文件中,但问题仍然在于引号,而不是那个函数。
  • 我正在使用 htmlspecialchars 以便显示表单,没有它我会根据我修改后的问题得到输出。
  • 是的,您可以轻松拥有一个单独的 PHP 页面,因为这样您就不必做所有这些脆弱的废话了。问题在于非常肤浅的引号,但真正的问题是“弹出功能”的存在,当您可以使用单独的 PHP 页面并且完全不使用 Javascript 来更轻松、更清洁地完成相同的事情时。跨度>
  • 不使用 JavaScript 怎么办?我将如何创建一个弹出窗口,在超时后通过 ajax 更新页面并在没有 JavaScript 的情况下传递变量?
  • 您可以使用链接中的 target="_blank" 属性在纯 HTML 中创建弹出窗口。您可以通过 GET 参数将变量传递给目标页面。超时当然需要 JavaScript(虽然不确定它的用途),更新原始页面也是如此。我并不是说你根本不能使用 JavaScript,只是你似乎过度使用它来解决可以通过不同方式更好地解决的问题。
【解决方案2】:

makewindows 函数中的参数没有被引用。您的报价已转义 (%#39)。将其替换为 ' 即可。

【讨论】:

  • 我的参数在 php 代码中被引用..我不确定我要替换什么。
  • @josh:你说的是服务器端代码,他说的是客户端代码。在第二个片段中查看您传递给 makewindows() 的参数。
  • 我的意思是参数是服务端引用的,所以应该是客户端引用?
  • 不,它可能根本不被引用。带有字符串参数的 JavaScript 函数必须获取以 " 或 ' 开头的字符串。
【解决方案3】:

您的 ENT_QUOTES 标志搞砸了输出。如果您仔细观察,您会发现 HTML 输出中没有实际的引号 - 只是转义的实体。做一个不使用 htmlspecialchars() 的测试。您应该使用反斜杠转义引号,或者最好还是不显眼地添加 javascript 功能。 jQuery 可能会帮助您实现这一目标http://jquery.com

【讨论】:

  • jquery 目前不是一个选项......,我在哪里引用问题,因为我正在使用引号,并且在我添加 setTimout 代码之前它工作正常。
  • 公平的呐喊 - 这只是一个建议,但您绝对应该阅读“不引人注目的 javascript”以供将来工作。有机会时谷歌一下。
猜你喜欢
  • 2014-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2013-10-29
  • 1970-01-01
  • 2012-11-11
相关资源
最近更新 更多