SQL инъекции из удаленного файла - PullRequest
2 голосов
/ 16 января 2012

У меня есть файл "submit.php", который записывает ряд значений, отправленных из предыдущей формы в "choose-product.php", в базу данных MySQL.Я использовал mysql_real_escape_string, как предложено в предыдущем вопросе, но заметил, что, если я загружу свой файл «choose-product.php» на отдельный сервер и изменит открытие формы на

<form name="form" id="form" action="http://www.myserver.com/submit.php" method="post">

это также записывает серию значений в базу данных.Очевидно, это очень плохо!Теперь я знаю, что будет способ исправить это, но поскольку я впервые пишу такой код, я немного озадачен.

Вот полный код для submit.php:

<?php
include("db.php");

function random_string() {
    $character_set_array = array();
    $character_set_array[] = array('count' => 7, 'characters' => 'abcdefghijklmnopqrstuvwxyz');
    $character_set_array[] = array('count' => 1, 'characters' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    $character_set_array[] = array('count' => 3, 'characters' => '0123456789');
    $character_set_array[] = array('count' => 1, 'characters' => '!@#$*&:');
    $temp_array = array();
    foreach ($character_set_array as $character_set) {
        for ($i = 0; $i < $character_set['count']; $i++) {
            $temp_array[] = $character_set['characters'][rand(0, strlen($character_set['characters']) - 1)];
        }
    }
    shuffle($temp_array);
    return implode('', $temp_array);
}

$key = random_string();


if($_SERVER["REQUEST_METHOD"] == "POST") {
    $productid = mysql_real_escape_string($_POST['productid']);
    mysql_query("INSERT INTO sales VALUES('','$productid','$key',CURRENT_TIMESTAMP,'','active')");
    echo "
    <form action='XYZ' id='BB_BuyButtonForm' method='post' name='BB_BuyButtonForm' target='_top'>
        <input name='item_name_1' type='hidden' value='Test item 1'/>
        <input name='item_description_1' type='hidden' value='Testing item sales'/>
        <input name='item_quantity_1' type='hidden' value='1'/>
        <input name='item_price_1' type='hidden' value='0.5'/>
        <input name='item_currency_1' type='hidden' value='GBP'/>
        <input name='shopping-cart.items.item-1.digital-content.url' type='hidden' value='http://www.XYZ.com/download.php?key=$key'/>
        <input name='_charset_' type='hidden' value='utf-8'/>
        <input alt='' src='XYZ' type='image'/>
    </form>
    ";
}
?>

Ответы [ 2 ]

5 голосов
/ 17 января 2012

Добро пожаловать в протокол HTTP.

http://www.myserver.com/submit.php может быть вызван кем угодно в любое время. Форма, которая вызывает, может быть на любой другой веб-странице. Или пользователь может вообще не вызывать его из формы, но может использовать инструмент командной строки для отправки данных. Этот инструмент может претендовать на звание веб-браузера, и вы не узнаете.

Я догадываюсь из твоего вопроса:

Вы полагаетесь на choose-product.php, чтобы обеспечить некоторую безопасность для submit.php?

Вы не можете.

Вы должны выполнить все проверки безопасности на submit.php, даже если вы только что сделали это для choose-product.php 5 секунд назад.

0 голосов
/ 17 января 2012

Это не проблема с инъекцией.Ваш php-скрипт должен где-то содержать местоположение, имя пользователя и пароль для вашей базы данных.Если ваша база данных не настроена специально, чтобы запретить ее, любой, у кого есть такая информация (например, ваш скрипт), может использовать ее для внесения изменений.

Обычно и легко ограничить доступ к вашему локальному хосту.Я сейчас гуглю, как это сделать.

...