首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻止来自详细页的sql注入

阻止来自详细页的sql注入
EN

Stack Overflow用户
提问于 2011-11-14 01:20:57
回答 3查看 156关注 0票数 0

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

标题和详细信息是从mysql数据库中提取的。

详细页的url链接是../pr.php?ID=457

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-14 01:31:19

找到一行从url中获取ID的代码,如下所示:

代码语言:javascript
复制
$ID = $_GET["ID"];

将其更改为:

代码语言:javascript
复制
$ID = (int) $_GET["ID"];

或者更好、更安全,在脚本的顶部添加以下内容:

代码语言:javascript
复制
$_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

票数 -1
EN

Stack Overflow用户

发布于 2011-11-14 01:24:05

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

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

票数 4
EN

Stack Overflow用户

发布于 2011-11-14 01:53:10

在您的示例中,我假设您只需要ID参数为非零正整数,而不需要其他值。来自@Czarek的答案足以满足这一要求。

代码语言:javascript
复制
$id = (int) $_GET["ID"];

或者使用内置函数intval()

代码语言:javascript
复制
$id = intval($_GET["ID"]);

但是,如果输入没有整数值(例如"abc"),这两种方法都会返回0,因此您应该注意,id为0本身不会显示您不希望用户访问的内容。您的id值很可能从1开始,如果是这样,这是安全的。

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

代码语言:javascript
复制
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
}

您可能还会对以下内容感兴趣:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8113271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档