2011-01-08 112 views
9

我对PHP很陌生,基本上我正在为我的网站创建一个评论系统。我有以下功能:htmlentities()和mysql_real_escape_string()是否足以清除PHP中的用户输入?

$ input = $ _POST ['comment'];

function cleanUserInput($ input){ $ input = mysql_real_escape_string($ input); $ input = htmlentities($ input); return $ input; }

所以问题是,mysql_real_escape_string单独足以防止SQL注入?并且htmlentities()足以防止用户输入的脚本,html和样式具有实际效果并仅显示为文本?

还是我需要添加更多的功能,使输入真正无害?

+0

对于逸出HTML中,使用用htmlspecialchars()代替。 – 2011-01-08 06:22:20

回答

2

这两个功能解决了有关注入任何类型和一些更多问题的安全问题的主要部分,但是,应用程序可以有安全错误的数量是惊人的。

如果你是一个安全怪胎,那么你遇到的主要问题,但你会开始检查Chris Shiftlett's website,谁是全球PHP安全的主要权威之一。

最后,你可以检查OWASP web,他们Top Ten Project,在那里他们保持对最常见的安全威胁跟踪和不断更新的硬件与他们战斗,

希望我能有所帮助。

11

mysql_real_escape_string是不够的。您还必须考虑如何构建您的查询。考虑下面这个简单的登录脚本:

$username = mysql_real_escape_string($_GET['username']); 
$password = mysql_real_escape_string($_GET['password']); 
$sql = "SELECT * FROM users WHERE username = $username AND password = $password"; 

没有引号$username$password,注入仍然是可能的。 (考虑一个用户名=测试; DROP TABLE用户; - 再见数据:(

mysql_real_escape_string是从消毒点足够如果你正确地组织你的查询正确构造的查询,这工作正常

!。

一个更好的问题是“你想要防止什么?”你还应该知道存储和反映的XSS(跨站点脚本)。如果你将用户的输入存储在数据库中,并且数据在浏览器,您至少需要去掉<script>标签

根据您的语言,有很多过滤器和代码可供在线使用如果您使用Rails或Cod eIgniter,它是为你完成的。

至于这种类型的安全性而言,我建议使用下列内容:

  1. 下载和安装damn vulnerable web app。它的一个应用程序,旨在传授黑客攻击的插件和网页的情况(基于PHP)
  2. 总是试图提出不同的字符集的字符
  3. 总是尝试提交空字节
  4. 避免传入参数太多查询字符串(它可以放弃你的数据结构)
  5. 看你的日志
  6. 下载burpsuite - 你永远不会看到一个网站,以同样的方式再次
  7. 手表而健谈。 mysql错误信息非常适合调试,但是它们会泄露大量信息 - 通常会显示整个查询!

底线 - 如果来自用户,那么不能被信任!

+0

谢谢您的反对评论! :) – sethvargo 2014-12-03 20:14:52

1

如果您使用的是PHP 5.2或更新的版本,则可以使用内置的输入消毒功能。

例如:

$input = filter_input(INPUT_POST, 'comment', FILTER_SANITIZE_STRING);

参考文献:

  1. filter_input
  2. Available filters
相关问题