2014-10-27 35 views
6

我一直在使用PHP一段时间,我开始问自己,如果我养成良好的习惯。消毒PHP变量,我过度使用它吗?

其中之一是我相信了由过度使用PHP的消毒方法,例如,一个用户通过表单注册时,我得到了下面的帖子变量:

$_POST['name']$_POST['email']$_POST['captcha']。现在,我通常所做的显然是清理我将要放入MySQL的数据,但是在比较验证码时,我也会对其进行清理。因为我相信我误解了PHP消毒,我很好奇,有什么其他的情况,当你需要清理数据,除了使用它来放置在MySQL中的东西(注意我知道消毒也是需要防止XSS攻击) 。而且,我的习惯是消除几乎每个来自用户输入的变量,一个糟糕的变量?

+8

永远不要相信用户输入是最好的习惯之一。数据库注入是显而易见的原因,但还有其他一些。 eval()语句,动态类创建$ x = new $ classnamehere()等 – STLMikey 2014-10-27 21:25:20

+3

所有用户输入/外部输入都有潜在危险,所以如果 - 例如 - 你将captcha值与内部字符串进行比较,一些(尽管很小)的风险是,传入的价值可能会“欺骗”并以某种方式通过比较逻辑。有了这个说法,是的,一些输入需要比其他输入消毒更多,因为一些数据用于高风险场景。如果可能的话,我建议通过一些通用函数清理所有用户输入,并使用MySQLi或PDO自动转义任何数据来抵御注入风险。 – Anthony 2014-10-27 21:29:36

+2

我相信这是一个好习惯,事实上 - 我相信你的应用程序不应该触及任何用户输入的数据,而不会首先进行消毒处理 - 我有一个类通过post/get请求循环并生成消毒版本,然后我可以访问它们 – 2014-10-27 21:30:18

回答

3

每当您将数据存储到某个位置,并且该数据将被读取/提供给(毫无戒心的)用户时,则必须对其进行清理。因此,应该照顾可能会改变用户体验的东西(不一定只是数据库)。一般来说,所有的用户输入都被认为是不安全的,但是在下一段你会看到有些东西可能仍然被忽略,尽管我不推荐它。

只发生在客户端上的东西只是为了更好的用户体验(用户体验,考虑表单的JS验证 - 从安全角度考虑它是无用的,因为它很容易避免,但它可以帮助非恶意用户拥有与网站有更好的互动),但基本上它不会造成任何伤害,因为会议结束后数据(好或坏)都会丢失。您可以随时销毁自己的网页(在您的机器上),但问题是有人可以为其他人做。

要更直接回答您的问题 - 永远不要过度担心。安全总比对不起更好,成本通常不会超过几毫秒。

3

您需要搜索的术语是FIEO。过滤器输入,逃逸输出。

如果你不了解这个基本原理,你很容易混淆自己。

想象一下,PHP是中间的男人,它用左手接受并且与右边接触。

用户使用您的表单并填写日期表单,所以它应该只接受数字,也许,破折号。例如NNNNN-NN-NN。如果你得到的东西不符合,就拒绝它。

这是一个过滤的例子。

接下来的PHP,做一些事情,可以说它存储在一个Mysql数据库。

Mysql需要的是防止SQL注入,因此您使用PDO或Mysqli的准备语句来确保即使您的筛选失败,您也无法对数据库进行攻击。这是Escaping的一个例子,在这种情况下,转义为SQL存储。

后来,PHP从您的数据库中获取数据并将其显示到HTML页面上。因此,您需要转义下一个媒介HTML的数据(这是您可以允许XSS攻击的地方)。

在您的脑海中,您必须将每个PHP的“保护性”功能划分为这两个系列中的一个,即过滤或转义。

自由文本字段当然比过滤日期更复杂,但没关系,坚持原则,你会没事的。

希望这有助于http://phpsec.org/projects/guide/

+0

其实你只是回答所有问题我有一段时间在脑海中。现在我明白了准备好的陈述来得方便,而且在哪里逃避是必要的。谢谢 :) – 2014-10-27 22:39:50