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

Sam*_*mmy 11 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和样式具有实际效果并且只显示为文本?

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

set*_*rgo 13

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";
Run Code Online (Sandbox Code Playgroud)

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

如果正确构造查询,则从清理点开始,mysql_real_escape_string就足够了.对于正确构造的查询,这很好.

一个更好的问题是"你想阻止什么?" 您还应该了解存储和反映的XSS(跨站点脚本).如果要存储数据库中用户的输入,并且数据是在浏览器中呈现的,那么您<script>至少要删除标记.

根据您的语言,有许多过滤器和代码可供使用.如果您使用Rails或CodeIgniter,它就是为您完成的.

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

  1. 下载并安装该死的漏洞的Web应用程序.它的应用程序旨在教授网络黑客的来龙去脉(基于PHP)
  2. 总是尝试提交不同字符集的字符
  3. 总是尝试提交NULL字节
  4. 避免在查询字符串中传递太多参数(它可以泄露您的数据结构)
  5. 看你的日志
  6. 下载burpsuite - 你再也不会以同样的方式看待网站了
  7. 看着健谈.mysql错误消息非常适合调试,但它们会泄露大量信息 - 通常它们会显示整个查询!

底线 - 如果它来自用户,则无法信任!


Dav*_*nde 4

这两个函数确实解决了有关任何类型的注入的大部分安全问题以及更多问题,但是,您的应用程序可能存在的安全错误数量是惊人的。

如果您是一个安全狂,那么您就会遇到重大问题,但是只要开始检查Chris Shiftlett 的网站就可以了,他是全球 PHP 安全方面的主要权威之一。

最后,您可以查看OWASP 网站及其十大项目,他们在其中跟踪最常见的安全威胁并不断更新硬件以应对这些威胁,

希望我能提供帮助。