我这几天读到关于php安全的内容而且我头晕,请解释清楚!
我知道我应该使用strip_tags()
或htmlentities()
进行XSS攻击。但如果我需要一些html标签,与博客文章相同,我该怎么做!?
但我应该在哪里使用mysql_real_escape_string()
和add_magic_quotes()
?
这些是一样的吗?
另一个问题是,我应该对每个SQL查询使用mysql_real_escape_string()吗? (INSERT
,UPDATE
,SELECT
,DELETE
等)?此功能是否会对我的数据产生不良影响(例如,在包含html标签或'
,""
的博客文章中)?
答案 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。在存储到数据库之前使用,因为它很重,但很安全。
不应该使用魔术引号。永远。 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.
使用“一刀切”的卫生功能就像在植物上使用五种高毒性杀虫剂一样,根据定义,它只含有一种虫子 - 只是为了发现你的植物被第六种侵染,没有任何杀虫剂起作用。
在将数据传递给函数之前,始终使用一种正确的方法,理想情况下是直接的。除非你需要,否则不要混用方法。