如何检查查询字符串中的ID是否有效?

问题描述:

我传递一个数据库生成的id值链接到另一个页面。在我拨打$_GET的接收页面中,我想防止人们在网址(例如www.mysite.com?id=43)中的?之后插入虚假值。如何检查查询字符串中的ID是否有效?

我想检查传入的值并确保它是数据库中的有效标识符,或者有没有办法检查NULL或空值?这是我已经试过:

来源页面:

echo "<a href=\"get-post-pg2.php?id=" .urlencode($row['id']) ."\">Second Page</a>"; 

目标页面:

$id = $_GET['id']; 
if(isset($_GET)) { 
    echo $id; 
} else 
    echo 'foo'; 
} 
+0

isset()是检查值的好方法! – powtac 2012-03-08 20:10:53

+0

要确保只有整数值,可以使用'echo(int)$ id;' – powtac 2012-03-08 20:11:23

+2

'empty()'检查isset,null和空字符串。但是,如果必须保护该值,则应该使用'$ _SESSION'来持久保存,而不是'$ _GET'将其传递到您自己站点上的另一个页面。 – 2012-03-08 20:11:56

你应该做的是投了$ _GET变量到整型...

$id = (int) $_GET['id']; 

然后检查是否为空..

if(!empty($id)){ 
    // process code 
} 

任何字符串将被转换为零,它在PHP中返回为空。 然后检查数据库中是否存在该ID!

+0

甜!这完美的作品!数据并不重要,我只想学习更好的编码习惯。非常感谢你的帮助! – Stubb207 2012-03-08 20:30:26

+0

'(int)$ _GET ['id']''会为'1 Oops!'返回'1',因此可能转换为int并不一定是最合适的解决方案(规范url?)。为什么不直接在数据库中查询'$ _GET ['id']'而不检查它?如果该行不存在,则显示404,与用户传入的内容无关。Shrapnel提到,无论用户想要什么,都无法阻止用户输入地址栏。 – 2012-03-08 20:31:19

+0

在我的查询函数中,我已经测试了查询,如果失败了,我重定向到一个oops页面。所以这一步没有必要? – Stubb207 2012-03-08 20:43:44

在目标页面上,我只需检查$ _GET ['id']以确保它是您需要的范围内的整数,如果不是,则默认为某个值或重定向用户。

if(is_int($_GET['id']) And $_GET['id']>=1 And $_GET['id'] <= 1000) { 
    //proceed 
} 
else { 
    header('Location:...'); // or set $id to a default value 
} 
+0

我的下一步也是重定向!干杯! – Stubb207 2012-03-08 20:31:10

检查传入值并确保它是来自数据库IS的有效标识符的唯一方法是根据数据库查询它。简单,呃?

我想防止人们插入虚假值后?在网址中。

答案更简单 - 你不行。
虽然你可以验证你的ID,但是我个人很少打扰这种愚蠢的原因验证变量。

+0

解救的常识!另外,'0'可能是一个有效的ID - 如果你使用像“example.com/?slug = test-for-inserted-values-in-url”那样的slug,那么就没有办法“验证”他们没有数据库查询。 – 2012-03-08 20:33:11