2011-04-21 92 views
1

如何从get/post获取信息并将信息保存到数据库中,今天的最佳实践是什么?数据是否仍然像过去一样逃脱或者还有其他做法?另外,HTMLPurifier在哪里可以适应?我目前正在使用它来过滤富文本。

+0

这一切都取决于你将要对数据做什么。这取决于用什么样的逃避需求来完成它。你能添加一些上下文吗? – 2011-04-21 18:12:32

+0

嗨Pekka。大部分数据将被保存并随后显示。这是一个社交网站。 – 2011-04-21 18:14:28

回答

5

从不将数据从GET保存到数据库。

即使您正在进行足够的验证和转义,也永远不要从GET保存数据。 GET不应该改变服务器上的信息。

改变在服务器中的任何(DB或服务器中的文件)检查是否请求是POST或PUT或DELETE适用

POST之前应该更改服务器的状态。因此,在更新表格或更改服务器上的任何文件之前,请检查请求方法是否过帐。

处理

如果你期待一个整数验证输入之前验证输入确实是一个整数。使用的数据库查询或添加到输出

对于查询目的之前

逃逸逃逸输入输入和的情况下,使用的是输入到直接打印到输出然后剥离斜线和消毒它。对于POST

使用易腐令牌时,你有用户会话

使用访问令牌的权限如果你有用户登录和更新令牌每次访问或5分钟左右。

使用访问令牌,当你没有用户会话

由于ANKUR建议使用访问令牌,当你没有登录会话。但这不可靠。

+3

使用$ _SERVER属性(如http_referrer)来检查是否仅从所需页面生成了帖子。 – 2011-04-21 18:26:12

+3

但引用者可以伪造 – 2011-04-21 18:31:40

+1

除此之外,您可以使用access_tokens作为另一种选择,无论用户何时打开表单页面,生成access_token并使用该标记创建数据库条目,使用访问标记创建隐藏字段。更新该行以防止用户提交表单,否则在一段时间后删除该行条目。 – 2011-04-21 18:32:49

1

那么这取决于你的价值观和他们来自哪里。在简短而亲切的回答是:

ESCAPE和消毒

这意味着确保你把所有的字符串中的报价,并确保你逃避用户提交的字符串的所有特殊字符。类型匹配和长度检查。

+0

“将所有字符串放在引号中”是什么意思?你指的是什么特殊字符? – 2011-04-21 18:15:42

+0

那么如果你有一个输入$ 1和sql语句'INSERT'。$ 1'。 INTO ... SQL注入可以通过$ 1 =')来实现; PHP最好的方法是使用准备好的语句,就像PDO – austinbv 2011-04-21 18:18:34

+0

@austin那样,你需要*使用库的卫生功能(如'mysql_real_escape_string')。只需添加斜杠或引号即可产生安全漏洞。或者使用准备好的语句,正如你所说的 – 2011-04-21 18:22:32

3

在将数据放入数据库之前,切勿将数据转换为表示格式;在适当的时候对其进行清理,但始终让数据库包含“最快”的数据形式。

在显示之前,请务必将数据转换为演示文稿格式,除非确定不应该转义数据并且不可以转义数据。

+0

嗨伊格纳西奥。当你说数据库应该包含最丰富的信息时,你如何保存富文本?我会补充说我使用过滤的html,因为一个共识是bbcode比它的价值更麻烦。 – 2011-04-21 18:26:15

+2

如果过滤的HTML是你最喜欢的格式,那就这样吧。 – 2011-04-21 18:28:37

+0

为什么不逃生? – austinbv 2011-04-21 18:33:23

4

即使您在您的网站上进行了验证,您也绝不应该假设来自GET或POST的信息能够正确转义,javascript可以被禁用,并且可以手动编写请求以执行SQL注入攻击。生成查询字符串时使用mysql_real_escape_string()

http://php.net/manual/en/function.mysql-real-escape-string.php

据我可以从它迅速地读了出来,HTML过滤是从所见即所得的编辑器或任何地方你从用户期待适当的HTML解析输出。它允许您控制禁止和过滤某些事物(如脚本),并确保所有标记都正确嵌套和关闭。从数据库中读取数据后,将HTML转储到页面中尤其重要。

+0

那么,那就是他正在使用'mysql _()'函数族。 – 2011-04-21 18:21:14

+0

@Pekka - 嗯......真......这篇文章是用mysql标记的,所以我可能会说得对。 – DarthJDG 2011-04-21 18:25:24

+0

@Pekka @DarthJDG:我不确定,但我是这么认为的。正在使用某种数据库类。另外,HTMLPurifier本身还不够。这只是一个额外的层,以避免跨站点攻击等事情。 – 2011-04-21 19:03:41

相关问题