2009-09-03 12 views
3

少し奇妙な問題があります。私のページには、ページを更新してPHP変数を呼び出すhtmlリンクが含まれています。この変数は、MySQLクエリに入力されるURL文字列に日付文字列を追加します。この文字列は、この日付に一致するレコードを取得します。私はこれが時々データベースからユーザを削除するので、これは注入を引き起こしていると思います!日付文字列からの注入可能クエリの選択

ハイパーリンクに「#」を使用してセキュリティ上の問題が発生する可能性がありますが、何が起こっているのかを知りたいと思います。また、これはJavaScriptがどのように使用されているかを見ているさまざまなブラウザにさまざまな影響を及ぼします。削除されているユーザーは、一部のコンピュータでのみ発生するようです。

は、PHPコードは3日、今からタイムスタンプを計算し、その後、SQL形式にそれを置く:

$ts_threeDays = mktime(1,0,0,date('m'), date('d')+3-date('w'), date('y'));  
$threeDaysAhead = date('y-m-d', $ts_second_day);  
スクリプトはその後、上のハイパーリンクによって渡されたURL文字列の「日」変数をリッスン

ページ:

$date = mysql_real_escape_string($_GET['day']); 

JavaScriptとハイパーリンクがある:

<a href='#' onClick="document.location.href='planner.php?day=<?php echo $threeDaysAhead; ?>'"> 3 Days Later</a> 

MySQ Lクエリはより大きいが、ユーザのアクションから取る唯一の入力は上記の日付文字列である。誰もが私を助け、私が最も感謝するでしょう私の問題を説明することができた場合は

SELECT planner.details FROM planner 
WHERE planner.date = '$date' AND users.`user_id` = '$id' // Logged in Id superglobal 

:クエリは、基本的には、この(usersテーブルにアクセスするために、別のselect文を使用しています)のように見えます。 多くのおかげ

答えて

2

あなたはmysql_real_escape_stringを通じて$dateを渡しているとして、疑惑は$id、または私たちが見ることができない何かのいずれかに該当しなければなりません。

SELECTステートメントはあなたのデータベースからものを削除するつもりはありません。あなたのPHPファイルには、ユーザーの削除を担当する他に何かがありますか?実際にはいけないときにユーザーを削除する関数を通過するようになった壊れたif/elseロジックがありますか?

0

以前の回答はあなたの問題を非常によく説明しています。

そして、あなたはあなたの「一日」を検証することができますが、この方法のようにVARを得る:

$day = ''; 
if (preg_match('/^\d{4}-\d{2}-\d{2}$/', $_GET['day']) 
{ 
    $day = $_GET['day']; 
} else { 
    die("bye bye"); 
} 
+0

あなたも、正規表現のマッチング部分day' '$割り当てることができます。あなたが日付を含むゴミを持っているなら、この方法で( '2009-09-03 'のように); DROP TABLE Students;)、あなたはゴミを取り除きます。 –

+0

あなたはそうです。正規表現は '^ \ d {4} - \ d {2} - \ d {2} $' ^でなければなりません。私の間違い – inakiabt