2016-05-04 10 views
1

私のWebページにはページがあります。だから、私は改ページからのポストを持っている場合は、私のクエリに行を追加する:mysql is_numeric sql injection

$q=""; 
if(isset($_POST["inpi"])){ 
    $in = $_POST["inpi"]; 
    if(is_numeric($in)){ 
     $q = "and c.id < '$in'"; // add this to mysql 
    } 
    else{die("something is wrong!");} 
} 

だから私はここにたstatmentsを準備し使用することはできません。

select k.user, c.id, c.from, c.sent, c.message, c.recd from chat c 
inner join cadastro k on c.from=k.id 
where `from`=? and `to`=? $q 

予告$ qを変数のポストが空かと<「内の$」をc.idであれば、それは何の価値もありません。

十分に安全ですか?あなたが行くとこのようにそれを構築するよう

+1

is_numericを使用して入力を検証している場合、この場合はSQLインジェクションについて心配する必要はありません。 SQLインジェクションでは、いくつかの引用符と文字列が含まれている必要があります。 –

+2

ここでは、準備済みのステートメントを絶対に使用できます。 PDOを使用していますか?クエリ文字列に何かを追加し、同時に値を保持するために使用する '配列'を追加することができます。 – tadman

+0

@tadman私はmysqli –

答えて

2

あなたは常に引数を蓄積することができます

$query = "SELECT ... WHERE `from`=? AND `to`=?"; 
$binds = array("ss", &$from, &$to); 

if (isset($_POST["inpi"])) { 
    $query .= " AND c.id < ?"; 

    $$binds[0] .= "i"; 
    $binds[] = &$_POST["inpi"]; 
} 

$stmt = $mysqli->prepare($query); 

call_user_func_array(array($stmt, 'bind_param'), $binds); 

私はこれをテストしていませんが、それは、this codeに基づいていると動作するようにいくつかの調整が必要な場合があります。

PDOの​​関数は、arrayをまっすぐに扱うので、操作が簡単です。

+0

ああ、それは素晴らしいです!助けてくれてありがとう、友達! –