因此,我的网站成员可以发布主题,回复,评论,编辑等等。我总是使用htmlspecialchars
和addslashes
来获取html输入,以保护我的网站免受XSS和SQL注入攻击。是否足够或者是否有更多我想念的东西?
感谢。
答案 0 :(得分:8)
Web应用程序可能出现很多问题。除了XSS和SQLi之外,还有:
include()
,require()
... mail()
register_globals
,extract()
,import_request_variables()
fopen()
,file_get_contents()
,file_put_conents()
eval()
或preg_replace()
/e
passthru()
,exec()
,system()
和``Broken Authentication and Session Management存在一整套漏洞,它是每个网络应用程序程序员必须读取的OWASP Top 10的一部分。
A Study In Scarlet是一篇很好的黑皮书,它涵盖了我列出的许多漏洞。
但是,Wordpress中也存在类似这样的奇怪漏洞。什么是漏洞的最终权威是CWE system,它对 HUNDREDS 漏洞进行了分类,其中许多漏洞可能会影响Web应用程序。
答案 1 :(得分:6)
您应该使用预准备语句(请参阅PDO)来阻止SQL注入。输出内容时,htmlspecialchars()似乎足以阻止XSS。
另请查看这些链接,了解更多保护网站的方法:
http://phpsec.org/projects/guide/
答案 2 :(得分:2)
防止SQL注入的更好方法是使用专门为每个数据库编写的escape
函数 - 例如,PostGreSQL使用pg_escape_string在将字符串字段插入数据库之前转义字符串字段。或者在您的情况下,使用mysql_real_escape_string
。
答案 3 :(得分:2)
您应该将mysql_real_escape_string()用于SQL,而不是使用addslashes。 (假设您使用的是MySQL)
答案 4 :(得分:0)
将数据插入数据库时,请使用预准备语句。 PDO优于mysql_real_espace_string。
显示评论,帖子等数据时,请使用htmlentities。
答案 5 :(得分:0)
没有addslashes或mysql_real_escape_string可以单独帮助。但只有在按照某些规则使用时。即便如此,这还不够。所以,这就是为新手准备好的陈述更好的原因 - 它不需要思考。
转义和准备好的语句都可以帮助仅提供数据。对于运营商/标识符,存在不同的规则。 (虽然不是什么大问题 - 每个可能的组合必须在脚本中硬编码)
不允许用户使用HTML
为防止这种情况,可以使用strip_tags()
(没有允许的标签)或htmlspecialchars()
如果您想允许某些标记,请考虑使用BB代码。
任何重要表单都必须包含唯一标记,该标记应与保存在会话中的标记进行比较。