0

次の PHP ソースを見つけました。

$type_ID =$_GET["typeID"];
try{                               
$article_ID =$_GET["articleID"];
$select_query = mysql_query("SELECT articleContent, articleTitle From articles WHERE articleID=$article_ID && typeID=$type_ID");
}
catch(Exception $e)
{ $select_query = mysql_query("SELECT articleContent, articleTitle From articles WHERE typeID=$type_ID");
                                   }
$row = mysql_fetch_assoc($select_query); 
echo '<h1>'.$row['articleTitle'].'</h1>';
echo  $row['articleContent'];

私はこのコードが安全ではないことを知っています.SQLインジェクションを簡単に行うことができます.

ここで問題があるのは、必要な場合でもcatch( の後に) パーツに入っていないことです。try解決策は簡単かもしれませんが、解決できません。

catchなぜそれはセクションに入らなかったのですか?

4

2 に答える 2

1

この場合、失敗をキャッチするためにクエリを変更する必要があります.100%ではありませんが、このようなことがうまくいくかもしれません.ただし、OO スタイルで mysqli または pdo に移行すると、エラーをより適切にトラップして処理できます。

$type_ID =$_GET["typeID"];
try{                               
$article_ID =$_GET["articleID"];
$select_query = mysql_query("SELECT articleContent, articleTitle From articles WHERE articleID=$article_ID && typeID=$type_ID") or throw new Exception("ERROR HERE");
}
catch(Exception $e)
{ 
 $select_query = mysql_query("SELECT articleContent, articleTitle From articles WHERE typeID=$type_ID"); // note we can't throw exception here because its already in the try catch. perhaps we should look at something like the finally statement.
//echo $e->getMessage(); //uncomment this line if you want to output the exception error text set above
}
$row = mysql_fetch_assoc($select_query); 
echo '<h1>'.$row['articleTitle'].'</h1>';
echo  $row['articleContent'];

実際には、このようなことをして、事前に入力を検証する方がはるかに良いと思っていました。(ここでは文字列エスケープを行っていないことに注意してください。忘れないでください)

$type_ID =$_GET["typeID"];
$article_ID =$_GET["articleID"];

if (strlen($type_ID)>0 && strlen($article_ID)>0 && is_numeric($type_ID) && is_numeric($article_ID)) { 
$sqlquery = "SELECT articleContent, articleTitle From articles WHERE articleID=$article_ID && typeID=$type_ID";
} else {
$sqlquery = "SELECT articleContent, articleTitle From articles WHERE typeID=$type_ID";
}

try {
    $queryresult = mysql_query($sqlquery) or throw new Exception("Query Failed");
} catch(Exception $e) { 
    echo $e->getMessage(); 
}

したがって、基本的には、入力を検証してチェックし、SQL ステートメントを切り替える前に、try catch ロジックは、クエリが成功したか失敗したかを純粋に示しています。これは、試行していたものよりもはるかに賢明です。

于 2013-07-03T12:53:46.670 に答える
1

Mysqlクエリはエラー時にFALSEを返す
ので、その例外をスローできます
$result = mysql_query("SELECT articleContent, articleTitle From articles WHERE articleID=$article_ID && typeID=$type_ID");

if(!$result) throw new Exception("Invalid query: ". mysql_error());

そして、キャッチブロックでそれらをキャッチします
catch(Exception $e) { echo $e->getMessage()}

エコーまたはログで何をするかはあなた次第です。

于 2013-07-03T13:06:33.643 に答える