我管理的一个网站包括一个新闻稿列表,每个新闻稿标题都有一个指向详细页面的链接。
标题和详细信息是从mysql数据库中提取的。
详细页的url链接是../pr.php?ID=457
如何防止有人将sql注入代码添加到参数中?
公共站点没有用户输入表单。
发布于 2011-11-14 01:31:19
找到一行从url中获取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
发布于 2011-11-14 01:24:05
您不能。可以与服务器建立网络连接的人可以发送他们想要的任何数据。
相反,您必须使用render the injection attempts harmless (并确保以合理的方式处理从数据中返回0行的情况,例如,通过发送404 Not Found响应)。
发布于 2011-11-14 01:53:10
在您的示例中,我假设您只需要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
}您可能还会对以下内容感兴趣:
https://stackoverflow.com/questions/8113271
复制相似问题