在PHP代码中查找编码错误和错误的编码实践

时间:2014-03-31 09:06:21

标签: php mysql

我是PHP新手,几天前我接受了采访。他们给了我一个PHP代码来找出错误和错误的编程实践。我已经指出了一些错误和不良做法。但我不确定代码中的所有错误。你能帮我找出确切的答案,所以我可以在接下来的采访中提高答案。

我的建议是:

  • 根据用户请求包含外部PHP文件不是一个好习惯
  • HTML与PHP混合,而不是使用MVC架构风格
  • 在同一档案中编写连接查询
  • is_authorized()函数未定义
  • 不推荐使用mysql_connect,可以使用mysqli

这是代码

<?php
function output()
{
// Check authorization
if(is_authorized())
{
$authorized = true;
include('/path/to/' . $_REQUEST['module'] . '.php');
}
    echo "<ul>";
    $conn = mysql_connect( "mysql.foo.org:324", "root", "root" );
    mysql_select_db( "conteol", $conn ); // selects a database
    $q = " SELECT * FROM main WHERE id > " . $_GET["id"]. ";";
    $res = mysql_query( $q, $conn);
    while( $row = mysql_fetch_assoc( $res ) )
    {
        echo "<li>".$row['description']."</li>";
    }
    echo "</ul><br><ul>";
    $q = " SELECT * FROM main WHERE id < " . $_GET["id"]. ";";
    $res = mysql_query( $q, $conn);
    while( $row = mysql_fetch_assoc( $res ) )
    {
    $authorized = true;
    include('/path/to/' . $_REQUEST['module'] . '.php');
    echo "<li>".$row['description']."</li>";
    // Display the status if it is authorized, othewise display N/A
    echo "<li>".$row['description']. "(" .
        $authorized ? $row['status'] : "N/A" . ")</li>";
    }
    echo "</ul>";
}
?>

3 个答案:

答案 0 :(得分:0)

更多想法:

  • 直接在SQL查询中使用$_GET['id']不是一个好主意。你应该打电话给intval()
  • 直接使用$row['description']输出不是一个好主意。你应该打电话给htmlspecialchars()
  • $authorized=true;在while循环的代码中设置,而不调用is_authorized()
  • 在while循环中调用
  • include('/path/to/' . $_REQUEST['module'] . '.php');。应该在循环外调用。也许,include_once()是一个更好的主意。
  • 即使is_authorized()返回false,也会执行整个代码。

答案 1 :(得分:0)

我可以在该列表中添加更多内容:

  • 差异/不一致的缩进
  • 格式不一致
  • Undescriptive variables name
  • 使用$_REQUEST
  • include的安全漏洞
  • 在SQL查询中使用$_GET打开SQL注入

作为一个自己采访过新PHP开发人员的人,我一直在寻找安全问题。

答案 2 :(得分:0)

  • 格式化/缩进很糟糕
  • 永远不要使用
  • $_REQUEST,始终使用特定于方法的数组
  • 没有错误检查mysql连接
  • 无SQL注入保护
  • 请勿使用include,请使用include_once
  • Double MYSQL查询基本相同的检查:使用WHERE id != $id也可以使用
  • 第二个循环中的授权始终设置为true
  • 对于您无法访问的内容显示“N / A”是没有意义的。