我是PHP新手,几天前我遇到了一次面试。他们给了我一个PHP代码来找出错误和错误的编程实践。我指出了一些错误和不良做法。但我不确定代码中的所有bug。你能帮我找出确切的答案吗?这样我就可以在下一次面试中改进我的答案了。
我的建议是:
这是代码
<?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>";
}
?>发布于 2014-03-31 09:14:35
更多的想法:
$_GET['id']不是一个好主意。你应该打电话给intval()。$row['description']进行输出不是一个好主意。你应该打电话给htmlspecialchars()。$authorized=true;在while循环中的代码中设置,而不调用is_authorized()。include('/path/to/' . $_REQUEST['module'] . '.php');在while循环中被调用。应该在循环之外调用。也许,include_once()是个更好的主意。is_authorized()返回false,也会执行整个代码。发布于 2014-03-31 09:15:01
我可以在这份清单上再加几个:
$_REQUEST中使用include的安全漏洞$_GET打开SQL注入作为一个亲自为新的PHP开发人员面试过的人,这是我会一直在寻找的安全问题。
发布于 2014-03-31 09:15:27
$_REQUEST,始终使用特定于方法的数组。WHERE id != $id也可以https://stackoverflow.com/questions/22757598
复制相似问题