PHP包括数字

时间:2009-02-25 12:58:20

标签: php sql-injection

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

的index.php:

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

news.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 个答案:

答案 0 :(得分:4)

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

你应该验证/清理来自$ _GET,$ _POST等的所有输入......你可以使用PHP内置的filter functions或使用内置在Cake PHP或Symphony等框架中的那些,它们都可以处理用户数据更容易。

jonstjohn有一个很好的观点,你可以通过这种方式让自己开放sql注入,以及基于将恶意代码提供给你的应用程序的其他形式的攻击。<​​/ p>

值得一读Jeff Atwood的25 most dangerous programming mistakes,了解这些问题以及其他问题的背景知识。

答案 1 :(得分:2)

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

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

答案 2 :(得分: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.');

答案 3 :(得分:0)

  1. 安全;
  2. 不检查,使用intval();
  3. 将其转换为整数
  4. 永远不要在没有转义或转换的情况下将GPC变量放在SQL中;