0

我正在创建一个基本博客,并且正在使用以下代码。

它正在从 url 中收集 id(总是一个数字),在我使用之前,我想知道是否有人可以检查代码的安全性并让我知道它是否可以?

我真的不想要任何注射等,我想尽可能保证它的安全。

<?php
    if(is_numeric($_GET['id']) && $_GET['id'] > 0){

        include("connectionfile.php");

        $ia = intval($_GET['id']);
        $ib = mysql_real_escape_string($ia);
        $ic = strip_tags($ib);

        $qProfile = "SELECT * FROM #### WHERE id='$ic'  ";
        $rsProfile = mysql_query($qProfile);
        $row = mysql_fetch_array($rsProfile);
        extract($row);
        $title = trim($title);
        $post = trim($post);
        $date = trim($date);
        mysql_close();
    }else{
       echo 'hack error here';
    }
?>
4

3 回答 3

0
$ia = intval($_GET['id']);
$ib = mysql_real_escape_string($ia);
$ic = strip_tags($ib);

strip_tags没用,因为它只在 HTML 上下文中相关。其他两种方法中的任何一种都足以防止 SQL 注入。通常,只需为您正在处理的语言使用适当的转义机制。在这种情况下,您正在处理 SQL,所以mysql_real_escape_string单独使用就可以了。请参阅The Great Escapism(或:使用文本中的文本需要知道的内容),了解逐步的转义方法。

更好的是,使用准备好的语句而不是弃用的mysql_函数来学习 PDO,这样可以更好地解决 SQL 注入问题。

于 2012-09-09T10:36:54.583 回答
0
  1. 不要使用mysql_函数。它们已被弃用。使用 mysqli 或 PDO。
  2. 使用参数化查询
  3. 不要使用“提取”,因为它会污染本地范围。在极少数情况下它是安全的,通常在 ORM 内部,在对象中。否则这是很危险的,因为可能会引入所有形式的讨厌的变量名,尤其是在成功的 SQL 注入的情况下。
  4. 进行异常处理,以便数据库错误不会完全破坏页面,并且在通过 SQL 注入以某种方式强制执行的错误查询的情况下,不会显示任何内容来指示查询被破坏。
  5. 即使您完成了上述所有操作,在显示之前仍要确保使用htmlentities()或以其他方式验证数据是您所期望的。
于 2012-09-09T10:37:35.007 回答
0

这段代码一团糟;-)

  1. if 语句可以简化为 "if (($id = (int)$_GET['id']) > 0) {"
  2. 如果您承认我的 1. 点,则可以删除 $ia、$ib 和 $ic
  3. 不要 trim() 数据库数据!在 INSERT 到数据库之前应该修剪数据。
  4. 阅读@FilmJ 回答你的内容
于 2012-09-09T10:57:20.303 回答