2010-12-13 96 views
2

这是我真的没有得到的东西之一。我知道逃离任何用户发送的数据是非常重要的。有很多方法如何做到这一点:stripslashes()(删除反斜杠),strip_tags(删除HTML和PHP标记),htmlSpecialChars(例如,更改&为&),正则表达式(preg_match())不允许处理“坏”数据。转义用户发送数据?

何时使用,如何使用,为什么要使用?

+0

可能重复[在哪里清理PHP $ _POST \ [\]输入?](http ://stackoverflow.com/questions/2401706/where-to-sanitize-php-post-input) – ajreal 2010-12-13 15:36:57

+0

没有“坏数据”。 – 2010-12-13 16:19:54

+0

这就是它的“坏数据”,而不是坏数据。 = P – daGrevis 2010-12-13 16:36:38

回答

2

如果你把$_POST['album_name']的内容直接放在你的页面上,那么有人可能会提交HTML和JavaScript,然后它们会成为页面的一部分,现在你的网站被黑了。

或者,您可以将$_POST['album_name']的内容放入SQL查询中。但是用户已经编写了他们自己的SQL查询,现在你已经运行了,现在你的数据库被黑了。

http://xkcd.com/327/

1

这个问题是非常广阔的。这实际上取决于你在逃避数据。

每个示例使用stripslashesstrip_tags适用于转义要在Web浏览器中显示的数据。但对数据库查询来说并不好。另一方面,在将用户数据发送到数据库引擎时,数据库转义机制很好,但在防止XSS攻击时它们并不好。

每个转义函数都有一个必须使用的特定上下文。

1

顺便说一句:在PHP中过滤用户输入数据的最佳做法是使用filter_input

实例:

$userId = filter_input(INPUT_GET, 'user_id', FILTER_SANITIZE_NUMBER_INT); 
$username = filter_input(INPUT_GET, 'username', FILTER_SANITIZE_SPECIAL_CHARS); 
$email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL); 

更多过滤常数here

+0

我很同意你的想法,但我不同意使用的方法。 'filter_input'与'filter_var'的作用相同,但是直接作用于输入流。这使得事后进行单元测试很困难。就像[这家伙尝试]一样(http://stackoverflow.com/questions/4158307/how-to-make-a-phpunit-test-that-depends-on-real-post-get-data)。 – netcoder 2010-12-13 15:59:29

+0

问题:PHP 5> = 5.2.0。 – daGrevis 2010-12-13 16:38:04

+0

PHPUnit测试单元的情况下。为了测试Web案例,Selenium是一个不错的选择。 – joksnet 2010-12-13 17:25:42

0

如果您的数据正在进入数据库,您必须阻止用户发送数据,这些数据将从您的正常查询中跳出来破坏或修改该查询。使用带参数绑定的MySQLi是保护数据库的最佳方式。只要你还使用字符串或preg替换。所以确保整数ID只是一个整数。你想从你的数据中逻辑上删除尽可能多的字符。

如果您的数据将被放置在标签之间,strip_tags后跟htmlentities是一个好习惯。但是,如果您可以使用白名单,请执行。如果你知道输出只能是一个整数,确保它是。 echo htmlentities(strip_tags($value));

如果您要将该数据放置在标签<a href='<?php echo $value; ?>'>以上是不够的。您还必须替换单引号。在这里,更重要的是你可以防止有毒数据进入系统。如果$ value类似' onClick='alert("oops");',你可能会陷入严重的困境。在这里你绝对应该使用白名单,并且只允许用户输入的内容出现在这里,如果你绝对必须的话。

如果你想输出到JavaScript。别。即使您多年来一直在使用安全性,您也不应该这样做。然而。一个例外可以用于非常具体的值。整数。被锁定到A-ZA-Z0-9的字符串以及用preg替换的空间。然而。这是非常危险的,可以严重危害你的系统。

如果你想把变量放在一个eval或exec中。只是不。你不够聪明来阻止攻击。我也没有。没有人。有人找到方法只是时间问题。如果第一次编写的代码很好?在稍后的日期,代码将会改变,不会再好了。只是不要这样做。期。或者有一天,你会坐在监狱里想着自己,“但我没有入侵五角大楼......”