解析和使用$ _GET的安全性

时间:2012-03-11 18:41:55

标签: php mysql

我正在使用以下代码

$query = "SELECT * FROM raids WHERE RaidNum = '".$_GET["RaidNum"]."'";

来自/raiddisplay.php?RaidNum=r75

我的问题是完全安全吗?可以通过某种方式利用价值来做一些令人讨厌的事情,并且有办法清理它。我试图查找它的示例用法,但大多数都非常复杂,我真的不知道从哪里开始。基本上我想确保有人不会故意在浏览器地址栏中输入一个可能产生令人讨厌的负面影响的值

4 个答案:

答案 0 :(得分:4)

完全不安全。假设我访问了/raiddisplay.php?RaidNum=';drop%20table%20raids;--,那么我会有效地删除你的表而不是阅读记录。

最佳解决方案是使用prepared statements。有些人可能会建议使用mysql_real_escape_string,但即便这样做也很麻烦。虽然它本身是安全的,但您必须记住始终应用它。使用带参数的预准备语句或使用为您创建语句的库,您始终是安全的。

我认为使用此功能的最简单方法是使用PDO或PHP Data Objects

答案 1 :(得分:1)

最好的办法是使用mysql_real_escape_string函数包装$ _GET。如果您更高级,请转到PDO。

 $query = "SELECT * FROM raids WHERE RaidNum = '".mysql_real_escape_string($_GET["RaidNum"])."'";

答案 2 :(得分:1)

您应该使用PDO作为最佳做法,这样您就可以对查询进行参数化,确保其尽可能安全。

首先你可以做一个简单的检查,看看RaidNum是一个int(我假设这是这里的情况);

$raidNum = (int)$_GET['RaidNum']; //This is pretty good sanitisation in itself if
                                  //you are expecting integers

您可以在文档中看到如何instantiate a PDO object

然后您首先prepare查询: -

$stmnt = $dbh->prepare('SELECT * FROM raids WHERE RaidNum = :RaidNum');

然后你可以execute声明: -

$stmnt->execute(array(':RaidNum' => $raidNum));

最后一步是fetchAllfetch结果

$result = $stmnt->fetchAll();

这可能比你期望的要复杂得多,但是花了很多精力。您总是可以在抽象层或函数中隐藏它。

答案 3 :(得分:-2)

你的直觉是正确的。这不安全。每当您通过MySQL传递敏感信息(如表单数据或任何人都可以查看/更改的数据)时,您都希望将其转义。这样做:

$raidNum = mysql_real_escape_string($_GET["RaidNum"]);
$query = sprintf("SELECT * FROM raids WHERE RaidNum = '$raidNum'");

http://php.net/manual/en/function.mysql-real-escape-string.php