2015-07-03 121 views
-1

我学习PHP和我遇到的htmlspecialchars(),它是用来防止黑客攻击,怎么来的?我在谷歌上看过它,还不明白。请给我举个例子吗?使用用htmlspecialchars()的

<form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"> 
Website : <input type="text" name="website"><br> 
<input type="submit" value="Submit" name="button"> 

</form> 

<?php 
if($_SERVER["REQUEST_METHOD"] == "POST"){ 
    $website = $_POST['website']; 
    echo "true"; 
if(empty($website)){ 

    echo "empty"; 
    } 
else{ 
    echo $website; 
    } 
} 
?>  

当我输入一个网址,这样http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E输出 http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E


当我从 <form method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']);?>"> 删除htmlspecialchars() 输出是一样的。为什么?有什么用的htmlspecialchars()然后?

和 然而,考虑到用户输入以下网址到地址栏:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E


在这种情况下,上面的代码将被转换为:(?如何以及在哪里发生这种情况)

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

+0

请尽量回答我的问题,而不是授予它的-1。 A 8小时的搜索后,我来到这里是要问这个问题,所以请尽量澄清这对我:)。 –

+0

你只是逃避PHP_SELF的行动= URL。然后浏览器在发送POST请求时将HTML实体解释掉。 PHP接收原始值。然后你不会逃避'$ website'。 - 另外,是关于[上一个问题]的评论投诉(http://stackoverflow.com/questions/31207902/how-to-convert-to-lt-and-convert-to-gt-using-php)发布几分钟前由一个*不同的用户? – mario

+0

可能的重复[你只在输出上运行htmlspecialchars(),或者你还有其他功能吗?](http://stackoverflow.com/q/526438),[使用htmlspecialchars()进行输入/输出HTML清理,对于MySQL数据库糟糕的设计?(http://stackoverflow.com/q/14148937),[对所有输出需要用htmlspecialchars()?](http://stackoverflow.com/q/17812833),[PHP& MySQL的:什么时候究竟使用ヶ辆(http://stackoverflow.com/q/2077576) – mario

回答

2

如果你不使用htmlspecialchars()处理攻击者可能执行代码的JavaScript特别。

从您的代码尝试提交与<h1>Hello, World!</h1>的形式输入的结果将是

你好,世界

并防止这种类型的攻击,我们使用 htmlspecialchars()

没有用htmlspecialchars()的代码被执行

并提交<script>alert('alert');</script>结果将是警告框

在文本框中提供<script>alert('alert');</script>并提交。

enter image description here

结果 enter image description here

+0

我喜欢你的答案。但根据本[链接](http://prntscr.com/7oe6dh)这里,代码应该如果我不使用'用htmlspecialchars(弹出警报)'但没有任何反应。为什么? –

+0

代码''是不是在上面创建任何警报? 我的代码是
' <形式方法= “POST” 行动= “?”> 名称:
<?PHP的 如果($ _ SERVER [ “REQUEST_METHOD”] == “POST”){ \t $ website = $ _POST ['name']; if(empty($ website)){ \t echo“empty”; \t} else { \t echo $ website; \t}} ?> ' –

+0

的代码显示警报.... – Malik

2

用于防止XSS这个函数攻击它简单而功能强大但是如果你想防止SQL注入使用mysqli_escape_string而不是

你提供你应该在用户输入“回声,打印”使用它的代码

$website = hmtlspecialchars($_POST['website']); 

如果$网站应该是网址,你可以验证它:

$website = (filter_var($_POST['website'], FILTER_VALIDATE_URL) === false) ? '' : hmtlspecialchars($_POST['website']); 
+0

可以请你解释一下[link](http://prntscr.com/7oe6dh),当我试过这段代码时,没有任何提醒那里 。 –

+0

如果您显示的是用户给出的PHP_SELF,则您必须转义所有用户条目 – bader

+1

如果您的意思是您无法执行JavaScript“maybe”,因为您的浏览器保护 – bader