2012-09-09 76 views
0

我正在创建一个基本博客,并使用以下代码。从网址安全获取ID

它从网址收集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'; 
    } 
?> 
+0

[codereview.stackexchange.com(http://codereview.stackexchange.com/)。而且,'mysql_ *'函数已被弃用,以支持PDO或MySQLi扩展。 – Bojangles

+0

感谢大家的帮助,任何人都可以举一个PDO的例子来做与上面相同的事情吗? – user1657967

回答

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 (Or: What You Need To Know To Work With Text Within Text)以获得转义的逐步方法。

更好的是,通过准备语句而不是已弃用的mysql_函数来学习PDO,它更好地解决了SQL注入问题。

+0

嗨,感谢您的反馈,您能否举一个PDO的例子,做一些阅读,但有点混乱! – user1657967

+0

链接文章结尾处有一个示例。 – deceze

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

此代码是一团糟;-)

  1. if语句可以简化 “如果(($ ID =(int)的$ _ GET [ 'ID'])> 0){”
  2. 如果您承认我的1.点,那么可以删除$ ia,$ ib和$ ic
  3. 不修剪()数据库数据!数据在INSERT到数据库之前应该被修饰。
  4. 读什么@FilmJ已经回答了你