我使用查询字符串来访问我的页面。我尝试制作,如果有人手动输入未知的查询字符串,然后重定向到某个地方..
例如:
网址:test.php?m = 1(这是一个有效的网址) test.php?m = 1324234(这不是一个有效的网址) test.php?m = 1asdaa(这不是一个有效的网址)
include("config/database.inc");
$qm=$_GET['m'];
$query = "select acc from test where acc=$qm";
$numresults=mysql_query($query);
$numrows=mysql_num_rows($numresults);
if ($numrows == 0){
header("Location: index.php");
exit;
}
在数据库中我有两行,LINE 1:acc = 1;第2行:acc = 2;
如果我键入url:test.php?m = 12312431,则重定向到index.php'coz $ numrows = 0。没关系。 但如果我键入:test.php?m = 1sdfsfsf,那么我得到了这个错误消息: 警告:mysql_num_rows():提供的参数不是...中的有效MySQL结果资源。
我该怎么做?在从数据库查询之前需要检查$ _GET ['m']吗?
谢谢。
答案 0 :(得分:2)
如果没有正确地过滤和转义它,就不应该将GET变量的值直接放入SQL查询中。您的问题是您允许将不是数字的内容放入SQL查询中。在这种特殊情况下,您的测试是无害的,只是错误,但恶意用户也可以通过SQL注入做更有害的事情。
相反,你真正想做的是将变量的值转换为知道的类型(在这种情况下,是一个整数),然后使用它来查询数据库。试试这个:
include("config/database.inc");
$qm=intval($_GET['m']);
$query = "select acc from test where acc=$qm";
$numresults=mysql_query($query);
$numrows=mysql_num_rows($numresults);
if ($numrows == 0){
header("Location: index.php");
exit;
}
注意对intval()的调用,它强制结果为整数值,而不是可能有害的字符串。
答案 1 :(得分:1)
这样做:
$qm=intval($_GET['m']);
答案 2 :(得分:0)
如果m无效,mysql_query将返回$ query = false。
如果你向mysql_num_rows提供“false”,它不知道你发送了什么查询,并且正确地获得了无效的numrows结果,例如:失败。
检查m是否为intval($ m)的整数;
答案 3 :(得分:0)
除了验证输入或强制类型转换,正如其他人建议确保输入有意义一样,尝试养成用引号括起用户提交的值的习惯,例如
$query = "select acc from test where acc='$qm'";
虽然这里你在技术上将一个整数与一个字符串进行比较,MySQL允许这个(并且仍然会使用可用的整数键),如果你忘记过滤输入,它会提供最后一道防线。