【发布时间】:2013-04-14 14:19:40
【问题描述】:
我几乎已准备好将我的网站转移到我的虚拟主机上,但在此之前,我希望尽可能地对其进行保护。我听说过 MySQL 注入和您可能面临的其他问题,我将如何保护我的网站、MySQL 数据库和文件免受它们的侵害?
我打算从mysql扩展改成mysqli或者PDO,你推荐哪个?
【问题讨论】:
标签: php mysql file security web
我几乎已准备好将我的网站转移到我的虚拟主机上,但在此之前,我希望尽可能地对其进行保护。我听说过 MySQL 注入和您可能面临的其他问题,我将如何保护我的网站、MySQL 数据库和文件免受它们的侵害?
我打算从mysql扩展改成mysqli或者PDO,你推荐哪个?
【问题讨论】:
标签: php mysql file security web
我个人会使用 PDO,它比 mysqli 好。如果您不知道 mysql 注入是将原始数据插入到这样的查询中:
$query = "SELECT * FROM users WHERE username='" .$_GET['user']. "' AND password='" .$_GET['password']. "'";
如果不清理输入,如果有人输入 admin 作为用户名,' OR '1'='1 作为密码,则查询变为:
SELECT * FROM users WHERE username='admin' AND password='' OR '1'='1'
这会导致查询忽略密码并以管理员身份登录,只要 1=1,它总是这样做。只需使用 mysql,您就可以使用 mysql_real_escape_string($_GET['user']) 来转义任何可能影响查询的内容,例如数据库可以理解的 ' would become \' 。请注意,攻击者可以做比以管理员身份登录更糟糕的事情,例如,他们可以使用 drop 命令删除您的整个数据库结构并在其后注释掉代码,或者实际上使用非常奇怪的 shellcode 影响您的 Web 服务器。
使用 PDO 或 MySQLi 之类的东西,准备好的语句首先告诉数据库查询将是什么,然后发送信息,而不是像这样在查询中实际包含它:
$stm = $pdo->prepare("SELECT * FROM users WHERE username=? AND password=?");
$stm->execute(array($_GET['user'], $_GET['password']));
编辑:还有一件事,我认为仍然可以使用 pdo 进行 mysql 注入,但我不知道它是如何工作的,所以我建议做更多的研究,看看你是否能找到任何东西。
【讨论】: