htmlentities()和mysql_real_escape_string()是否足以清除PHP中的用户输入?

时间:2011-01-08 06:13:41

标签: php

我是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和样式具有实际效果并且只显示为文本?

或者我是否需要在我的函数中添加更多内容才能使输入真正无害?

3 个答案:

答案 0 :(得分:12)

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或CodeIgniter,那就完成了。

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

  1. 下载并安装damn vulnerable web app。它的应用程序旨在教授网络黑客入侵(基于PHP)
  2. 总是尝试提交不同字符集的字符
  3. 总是尝试提交NULL字节
  4. 避免在查询字符串中传递太多参数(它可以泄露您的数据结构)
  5. 关注您的日志
  6. 下载burpsuite - 您再也不会以同样的方式查看网站
  7. 看着健谈。 mysql错误消息非常适合调试,但它们会泄露大量信息 - 通常会显示整个查询!
  8. 底线 - 如果来自用户,无法值得信赖!

答案 1 :(得分:3)

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

如果你是一名安全人员,那么你就会遇到重大问题,但是你可以通过检查Chris Shiftlett's website来做好准备,OWASP web是世界各地PHP安全的主要权威之一。

最后,您可以查看Top Ten Project及其{{3}},了解最常见的安全威胁,并保持hw更新以对抗它们,

希望我能提供帮助。

答案 2 :(得分:2)

如果您使用的是PHP 5.2或更高版本,则可以使用内置输入清理。

例如:

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

参考文献:

  1. filter_input
  2. Available filters