阻止从详细信息页面注入SQL

时间:2011-11-13 17:20:57

标签: php mysql

我管理的其中一个网站包括新闻稿列表,每个新闻稿标题都是一个指向详细信息页面的链接。

标题和详细信息是从mysql db中提取的。

指向详细信息页面的网址链接为../pr.php?ID=457

如何防止有人在参数中添加sql注入代码?

公共网站没有用户输入表单。

3 个答案:

答案 0 :(得分:4)

你做不到。可以与服务器建立网络连接的人可以发送他们想要的任何数据。

您必须改为render the injection attempts harmless(并确保处理以合理方式从数据中返回0行的情况,例如通过发送404 Not Found响应)。

答案 1 :(得分:1)

在您的示例中,我假设您需要ID参数为非零正整数,而不是其他任何内容。 @Czarek的答案就足够了。

$id = (int) $_GET["ID"];

或内置函数intval()

$id = intval($_GET["ID"]);

但是如果输入没有整数值(例如“abc”),这两个方法都返回0,所以你应该注意id为0本身不会显示你不打算用户拥有的东西进入。你的id值很可能从1开始,如果是这样,那就安全了。

您还可以使用PHP的内置filter扩展名以获得更大的灵活性。

if (filter_has_var(INPUT_GET, "ID") && 
    filter_input(INPUT_GET, "ID", FILTER_VALIDATE_INT, array("min_range"=>1))
{
    $id = filter_input(INPUT_GET, "ID", FILTER_SANITIZE_NUMBER_INT);
    // then show data for $id
} else {
    // show default page
}

您可能也有兴趣:

答案 2 :(得分:-1)

找到一个从网址获取ID的代码行,它将是这样的:

$ID = $_GET["ID"];

将其更改为:

$ID = (int) $_GET["ID"];

甚至更好更安全,在脚本的顶部添加:

$_GET["ID"] = (int) $_GET["ID"];

当你转换为INT时,任何人都无法将任何sql注入该变量。您还应该检查来自url的变量是通过$ _GET变量使用,而不是通过$ _REQUEST使用,或者更糟糕的是手动解析$ _SERVER [“QUERY_STRING”]。

确保ID是该脚本的url中传递的唯一变量,如果有更多,则需要保护所有这些变量。

保护仅接受整数值的变量非常简单,只需进行此转换即可。当变量可以是任何字符串时会更难,那么你需要在该字符串或类似字符串上使用mysql_real_escape_string(),具体取决于您使用的数据库和驱动程序类型。

如果你需要一个完整的通用解决方案来进行sql注射,请查看我最近的另一个答案,它解释了如何使用PDO扩展以及自动数据绑定来防止注射,链接如下:

stackoverflow.com/questions/8105508/does-this-work-to-stop-sql-injections/8105598#8105598