0

私は最近、SQL インジェクションを防ぐために php PDO を使い始めましたが、ページの結果を変更するために URL を通過しているパラメーターに応じて変更されるため、ステートメントに問題があります。私が苦労している部分は$_GET['cat_id']、URL に cat_id がある場合に for を実行配列に追加する方法です。これは動作するバージョンですが、明らかに SQL インジェクションの傾向があります。事前に助けてくれてありがとう!

PHP

$and = '';
if (isset($_GET['cat_id'])) {
    $and = "AND art_cat_id = ".$_GET['cat_id'];
}   

$statement_article = $db->prepare("SELECT * FROM app_articles WHERE art_sta_id = :art_sta_id $and ORDER BY art_date DESC");

$statement_article->setFetchMode(PDO::FETCH_ASSOC); 

$statement_article->execute(array(':art_sta_id' => "1"));

これが私が試したものですがcat_id、URLにない場合は失敗します

PHP

$and = '';
if (isset($_GET['cat_id'])) {
    $and = "AND art_cat_id = :cat_id";
}


$statement_article = $db->prepare("SELECT * FROM app_articles WHERE art_sta_id = :art_sta_id $and ORDER BY art_date DESC");

$statement_article->setFetchMode(PDO::FETCH_ASSOC); 

$statement_article->execute(array(':art_sta_id' => "1",':cat_id' => $_GET['cat_id']));
4

1 に答える 1

2

cat_id がある場合は、パラメーター配列を調整します。

$and = '';
$params = array(':art_sta_id' => "1");

if (isset($_GET['cat_id'])) 
{
  $and = "AND art_cat_id = :cat_id"
  $params[':cat_id'] = $_GET['cat_id'];
}   

$statement_article = $db->prepare("SELECT * FROM app_articles WHERE art_sta_id = :art_sta_id $and ORDER BY art_date DESC");

$statement_article->setFetchMode(PDO::FETCH_ASSOC); 

$statement_article->execute($params);
于 2013-05-10T02:46:17.543 に答える