2017-09-01 5 views
2

私は、小さくてシンプルなデータベースでPHPページを作成しています。私のページが脆弱かどうかを理解しようとしています

私はそれをオンラインで見て、URLにパラメータ "length"を渡そうとします:index.php/?length=1それはうまく動作し、データを取得します。

私はindex.php/?length=1'のような単一引用符を追加した場合、私は、ページにはSQLエラーを持っていない...

が、私はindex.php/?length=-1を使用している場合、私は私のページにSQLエラーを参照してください。

これは私のページが脆弱であることを意味しますか?

これをさらにテストして問題を解決するにはどうすればよいですか?

編集:あなたは、ユーザー入力を取得し、直接あなたのMySQLの文に挿入のようなコード

$length = $wpdb->get_results($wpdb->prepare("SELECT `title`, `website`, `material`, `color`, `width`, `height`, `group`, `category`, `numbers_positive`, `numbers_negative`, `custom` FROM {$wpdb->shirts} WHERE `id` = '%d' ORDER BY `rank` ASC, `id` ASC", intval($shirt_id))); 

if (!isset($shirt[0])) return false; 

$shirt= $shirt[0]; 
$shirt->title = htmlspecialchars(stripslashes($shirt->title), ENT_QUOTES); 
$shirt->custom = maybe_unserialize($shirt->custom); 
$shirt->color = maybe_unserialize($shirt->color); 
if ($this->hasBridge()) { 
    global $lmBridge; 
    $shirt->shirtColor = $lmBridge->getShirtColor($shirt->color); 
} 
$shirt = (object)array_merge((array)$shirt,(array)$shirt->custom); 
unset($shirt->custom); 

return $shirt; 

答えて

1

を追加しましたはい、あなたが与えているURLの例から、それはそうです。それは絶対的な最悪です。ユーザーからの直接入力では、文字列がエスケープされ、DB内のすべての表が削除されるため、ユーザー入力を常に解析する必要があります。これは素晴らしい例です:Bobby Tables

また、これは大きな議論のトピックでした。素晴らしい答えがありますhere

編集* WordPressフレームワークを使用してコードを見ても、それほど悪くないようです。

+0

私に戻ってくれてありがとう!私は学び、理解しようとしているので、忍耐強くお待ちください。 これはコードです:https://pastebin.com/sXhtPG7r ここでこのコードに問題があるかもしれませんか? 本当に問題がある場合は、このコードに基づいて、どのようにURLを挿入して注入する必要がありますか?私が作った基本的なテストには何の問題もなかったからです。 ありがとうございました – qefseri

+0

ああ、WordPressであなたの準備文を使用しています。それはフレームワークがあなたのための多くのセキュリティチェックを処理するので、より安全になります。表示されるSQLエラーはおそらくid -1(負の1)が存在しないためで、 'intval'は引き続き負の数を返すためです。追加される見積もりは 'intval'で削除されます – Ice76

0

受け入れることはできますが、-1でエラーを生成しても、あなたは注射による攻撃にうんざりしています。入力が整数であり、整数要素のみを使用していることをバリデーションしている限り、あなたはかなり安全です。

プリペアドステートメントは、クエリからデータを分離することで、より安全です。そうすれば、誰かができることを意味するあなたが取り組んでいると思われるものから逃れる。 SQLを使用することは絶対に正しい方法です。

さらに、ストアドクエリを実行するアカウントの能力を制限し、PHPではなくSQLサーバー側にクエリを保存することで、さらに進歩することができます。その時点で、たとえそれができなかったとしても(それはできない)、それらの定義されたクエリにしかアクセスすることができませんでした。

関連する問題