$ _POST中的htmlspecialchars输出

时间:2012-10-26 23:14:32

标签: php htmlspecialchars

通过$ _POST从第1页到第2页发送登录(电子邮件地址),以便处理jim_o'brien@thing.com等地址。

echo "<input type='hidden' name='login' value='".htmlspecialchars($_GET['login'], ENT_QUOTES)."'>"

查看第2页的源代码,我很高兴看到它按照我的预期输出jim_o'brien@thing.com而不是jim_o&#039;brien@thing.com

当我再次将数据发送到新页面时(第3页),我再次将登录信息包装到htmlspecialchars($_GET['login'], ENT_QUOTES)中......它完成了我期望它做的事情。

但有人可以解释为什么它会在POST发送中丢失它的#039;编码吗?我能理解它与浏览器中的单引号相呼应,但为什么它也在源代码中呢?

谢谢

3 个答案:

答案 0 :(得分:0)

查看页面的来源,看看它实际上运行正常 - 在浏览器中你会看到“'”,因为你的浏览器让它变得“人性化”,但是在源代码之后你会看到,一切都很好。

以其他方式尝试:

echo htmlentities("jim_o'brien@thing.com", ENT_QUOTES);

答案 1 :(得分:0)

实际上,原始问题是有效的。这是我在大约五分钟内一起攻击的一些代码。它不漂亮,并且不复杂,但它说明了这一点。

 <?php
 $posted=$_POST[posted];
 if (isset($posted)) {
 echo "POSTED: $posted<br>"; //output: You'll see a quote
 $specposted=preg_replace('/&#039/','****',$posted);
 echo "after entity replace: $specposted<br>"; //output: You'll see a quote
 }
 else{
 $phraseone="You'll see a quote";
 $phrasetest=htmlentities($phraseone, ENT_QUOTES);
 echo "phrasetest: $phrasetest<br>"; //output: You'll see a quote
 $specialphrase=preg_replace('/&#039/','****',$phrasetest); 
 echo "after entity replace: $specialphrase<br>"; //output: You****;ll see a quote
 print<<<HERE
 <form method='post'>
 <input type='hidden' name='posted' value='$phrasetest'>
 <input type='submit' value='GO!'>
 </form>
 HERE;
 }
 ?>

...有趣

答案 2 :(得分:-1)

jim_o'brien@thing.com不是有效的电子邮件地址,不能被允许。

使用filter_input进行验证。

$login = filter_input(INPUT_GET, 'login', FILTER_VALIDATE_EMAIL); //or INPUT_POST, if method is POST
if(!$login){
   //invalid e-mail 
}

参考:http://www.w3schools.com/php/func_filter_input.asp