我管理的其中一个网站包括新闻稿列表,每个新闻稿标题都是一个指向详细信息页面的链接。
标题和详细信息是从mysql db中提取的。
指向详细信息页面的网址链接为../pr.php?ID=457
如何防止有人在参数中添加sql注入代码?
公共网站没有用户输入表单。
答案 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