PHP $ _GET ['id']和安全性

时间:2013-07-09 16:32:57

标签: php mysql

我的网页上有这样的链接:http://test.com/index.php?function=news&id=88

所以无论什么时候我把'88之后,我都会收到以下错误:警告:mysql_fetch_row()期望参数1是资源,布尔值在......第588行中给出

所以我读到了关于mysql_real_escape_string()的内容,但是我没有发布ID而且我不知道如何防止出现此错误。

function news()
{
$query = mysql_query("SELECT * FROM news WHERE id=".$_GET['id']."");
while($news = mysql_fetch_row($query)) 
{
    ...
}
}

4 个答案:

答案 0 :(得分:5)

如果id是一个整数:

,那么简单的方法是将id转换为整数
$id = (int)$_GET['id'];

但强烈建议在准备好的陈述中使用pdo或mysqli:

http://php.net/manual/en/book.pdo.php

http://php.net/manual/en/book.mysqli.php

答案 1 :(得分:1)

只要mysql_fetch_row()没有返回任何内容(即因为没有id 89),你就可以进行重定向。

类似的东西:

if (!$row = mysql_fetch_row($result)) {
    header(Your error page);
}

答案 2 :(得分:0)

您的代码假设查询成功而未进行检查。出于调试目的,在mysql_query()语句的末尾添加一个'或die(mysql_error())'行。

$query = mysql_query("SELECT * FROM news WHERE id=".$_GET['id']."") or die( mysql_query() );

要在生产应用程序中进行更强大的错误处理,请检查$query的值,如果错误则记录错误。

if (false === $query ) {
    // Log error and/or notify an administrator
} 
else { 
    while($news = mysql_fetch_row($query)) ...

正如其他答案中所指出的,您应该确保id参数的值是一个整数,因为您的查询假设它是。您可以通过强制转换来执行此操作:

(int)$_GET['id']

或通过更强大的类型检查

if ( !is_numeric( $_GET['id'] ) ) {
    // Take appropriate action
}
else {
    // Create and execute the query

答案 3 :(得分:0)

警告:mysql_fetch_row()期望参数1为资源

这意味着$ result = mysql_query(....);在mysql_fetch_row()失败之前调用你,并导致FALSE而不是资源(即查询结果的句柄);

查看查询,如果可能,请将其发布,这就是问题所在。