0

如果我像这样构建我的页面,我是否必须检查 news_id 在 news.php 中是否也是数字?或者这样安全吗?

索引.php:

    if (ctype_digit($_GET['news_id'])) include('news.php');

新闻.php:

    $query = mysql_query("SELECT * FROM news WHERE news_id = $_GET[news_id]");
    $row = mysql_fetch_assoc($query);

    if (!mysql_num_rows($query)) exit('The news you're trying to read do not exist.');
4

4 回答 4

4

其他答案是绝对正确的,您永远不应该允许任何用户直接输入您的数据库或任何其他敏感区域。

您应该验证/清理来自 $_GET、$_POST 等的所有输入...您可以使用 PHP 的内置过滤器功能或使用内置于框架中的过滤器功能,例如 Cake PHP 或 Symphony,它们都可以更轻松地处理用户数据。

jonstjohn 有一个很好的观点,即您以这种方式让自己打开 sql 注入,以及基于将恶意代码输入您的应用程序的其他形式的攻击。

值得阅读 Jeff Atwood 的25 个最危险的编程错误,了解这些问题以及其他问题的背景知识。

于 2009-02-25T13:10:04.220 回答
2

简短的回答:是的,你应该。

有人可能(并且将会)绕过 index.php 请求 news.php。

于 2009-02-25T13:01:53.037 回答
0

您确实应该在将数据发送到 MySQL 之前对其进行转义并对其进行清理。不能保证有人不会尝试通过帖子数据发送恶意内容。

$news_id = (int)$_GET[news_id];

$query = mysql_query("SELECT * FROM news WHERE news_id = " . 
                      mysql_real_escape_string($news_id));
$row = mysql_fetch_assoc($query);

if (!mysql_num_rows($query)) exit('The news you're trying to read do not exist.');
于 2009-02-25T13:03:45.577 回答
0
  1. 不安全
  2. 不要检查,使用 intval() 将其转换为整数;
  3. 永远不要在没有转义或强制转换的情况下将 GPC 变量放入 SQL 中;
于 2009-02-25T13:05:08.520 回答