htmlentities() 和 mysql_real_escape_string() 是不是足以清理 PHP 中的用户输入? [复制]
Posted
技术标签:
【中文标题】htmlentities() 和 mysql_real_escape_string() 是不是足以清理 PHP 中的用户输入? [复制]【英文标题】:Is htmlentities() and mysql_real_escape_string() enough for cleaning user input in PHP? [duplicate]htmlentities() 和 mysql_real_escape_string() 是否足以清理 PHP 中的用户输入? [复制] 【发布时间】:2011-06-05 16:23:09 【问题描述】:我对 php 很陌生,基本上我正在尝试为我的网站创建一个评论系统。我有以下功能:
$input = $_POST['comment'];
函数 cleanUserInput($input) $input = mysql_real_escape_string($input); $input = htmlentities($input); 返回$输入;
所以问题是,单独使用 mysql_real_escape_string 是否足以防止 sql 注入? htmlentities() 是否足以防止用户输入的脚本、html 和样式产生实际效果而仅显示为文本?
或者我是否需要在我的函数中添加更多内容以使输入真正无害?
【问题讨论】:
要转义 html,请改用 htmlspecialchars()。 【参考方案1】: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,它已经为您完成了。
就这种类型的安全性而言,我建议使用以下方法:
-
下载并安装damn vulnerable web app。它是一个应用程序,旨在教授网络黑客的来龙去脉(基于 php)
总是尝试提交不同字符集的字符
总是尝试提交 NULL 字节
避免在查询字符串中传递太多参数(它会泄露您的数据结构)
查看您的日志
下载burpsuite - 你再也不会以同样的方式浏览网站了
注意聊天。 mysql 错误消息非常适合调试,但它们会泄露大量信息 - 通常它们会显示整个查询!
底线 - 如果它来自用户,它不能被信任!
【讨论】:
感谢您不加评论地投反对票! :)【参考方案2】:这两个功能确实解决了与任何类型的注入有关的大部分安全问题以及其他一些问题,但是,您的应用程序可能存在的安全漏洞数量是惊人的。
如果您是一个安全狂,那么您将面临重大问题,但您可以通过检查Chris Shiftlett's website 来解决问题,他是全球 PHP 安全的主要权威之一。
最后,您可以查看OWASP web 和他们的Top Ten Project,他们可以在其中跟踪最常见的安全威胁并随时更新硬件以应对它们,
希望我能提供帮助。
【讨论】:
【参考方案3】:如果您使用的是 PHP 5.2 或更新版本,则可以使用内置的输入清理。
例如:
$input = filter_input(INPUT_POST, 'comment', FILTER_SANITIZE_STRING);
参考资料:
-
filter_input
Available filters
【讨论】:
以上是关于htmlentities() 和 mysql_real_escape_string() 是不是足以清理 PHP 中的用户输入? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
PHP htmlentities 和 htmlspecialchars的区别
何时调用 mysql_free_result (Resuing mysql_store_result, MYSQL_RES)
htmlentities() 和 mysql_real_escape_string() 是不是足以清理 PHP 中的用户输入? [复制]