php中的Strip_tags或mysql_real_escape_string或add_magic_quotes

时间:2012-02-02 16:57:22

标签: php security

我这几天读到关于php安全的内容而且我头晕,请解释清楚!

我知道我应该使用strip_tags()htmlentities()进行XSS攻击。但如果我需要一些html标签,与博客文章相同,我该怎么做!?

但我应该在哪里使用mysql_real_escape_string()add_magic_quotes()? 这些是一样的吗?

另一个问题是,我应该对每个SQL查询使用mysql_real_escape_string()吗? (INSERTUPDATESELECTDELETE等)?此功能是否会对我的数据产生不良影响(例如,在包含html标签或'""的博客文章中)?

4 个答案:

答案 0 :(得分:1)

  

我知道我应该使用strip_tags()htmlentities()进行XSS攻击。但如果我需要一些html标签,与博客文章相同,我该怎么做!?

如果您不信任用户,则解析HTML run all the elements and attributes through a whitelister,然后将文档序列化为HTML。

  

但我应该在哪里使用mysql_real_escape_string()和add_magic_quotes()?这些是一样的吗?

它们不一样,一般来说,你应该避免它们。 Use bound parameters instead

  

另一个问题是,我应该对每个SQL查询使用mysql_real_escape_string()吗?

在将所有用户输入传递给dabtas之前,您应该将其转义。

答案 1 :(得分:1)

忘掉magic_quotes。这是一种懒惰的方式自动转义在用户输入中找到的某些控制字符。 Continue learning关于newer and more efficient methods来过滤/清理用户输入,您会发现原因magic_quotes has been deprecated

  

此功能对我的数据有不良影响(例如,在博客上   有html标签或','“)的帖子?

您不应该遇到任何问题,因为数据没有使用额外的斜杠存储在数据库中。如果是的话,启用magic_quotes很有可能需要关闭。

  

我应该对每个SQL查询使用mysql_real_escape_string()吗?

在使用用户输入进行查询之前,需要对其进行过滤/清理。使用该功能或​​准备好的陈述。

答案 2 :(得分:1)

如果您需要在博文中允许HTML,则应将标签和属性列入白名单,但不应自行尝试。相反,请使用HTMLPurifier。在存储到数据库之前使用,因为它很重,但很安全。

http://htmlpurifier.org/

不应该使用魔术引号。永远。 mysql_real_escape_string()应该用在查询中提供的每个参数上。只需要防止SQL注入。当然,确保连接需要您实际发送的字符编码是先决条件。

答案 3 :(得分:0)

通用卫生功能的概念是一个破碎的概念。

每种用途都有一种正确的卫生方法。在字符串上运行通用的卫生方法通常会破坏它 - 为SQL查询转义一段HTML代码会破坏它以便在网页中使用,反之亦然。应在使用数据之前应用卫生设施:

mysql_real_escape_string() for functional mysql_* calls (or parametrized queries)

htmlspecialchars() for safe HTML output

preg_quote() for use in a regular expression

escapeshellarg() / escapeshellcmd() for use in an external command

etc. etc.

使用“一刀切”的卫生功能就像在植物上使用五种高毒性杀虫剂一样,根据定义,它只含有一种虫子 - 只是为了发现你的植物被第六种侵染,没有任何杀虫剂起作用。

在将数据传递给函数之前,始终使用一种正确的方法,理想情况下是直接的。除非你需要,否则不要混用方法。