Использовать $ _POST ["x"] напрямую или скопировать в локальную переменную, а затем использовать? - PullRequest
3 голосов
/ 14 февраля 2010

Рассмотрим следующую пару фрагментов, оба, по сути, делают то же самое.

<html>
<body>
    <?php
    if(isset($_POST["firstName"]) && isset($_POST["lastName"])){
    //I'm copying the POST variable to a local one.
    $firstName = $_POST["firstName"];
    $lastName = $_POST["lastName"];     
    echo "<h1>Thank you for taking the census!</h1>";
    echo "On behalf of Sergio's Emporium, we name you: " . $firstName . $lastName . ", conquerer of worlds!";
    //Here I'm just pulling it from the POST info.
    echo "I think that's fitting since you're a " . $_POST["item"];
    }
    else {      
    echo "You didn't write in the necesarry information.";      
    }
    ?>
</body> 
</html>

Какой из них лучше использовать (с точки зрения безопасности) и какой рекомендуется использовать по стандартам.

Поскольку я новичок в PHP, это то, что дергает мою цепочку. Спасибо, парни! :)

Ответы [ 3 ]

7 голосов
/ 14 февраля 2010

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

  • Фильтр / проверка ввода
  • и выход Escape.

Здесь, когда вы выводите некоторый HTML, может быть полезно экранировать ваши данные, например, с помощью htmlspecialchars; -)


Чтобы облегчить это, некоторым людям нравится считать, что:

  • $_POST содержит необработанный ввод
  • и некоторые локальные переменные используются для хранения отфильтрованного ввода, т. Е. Вы можете использовать «безопасно» в оставшейся части вашего скрипта.
0 голосов
/ 14 февраля 2010

Согласно гуру производительности в Google, следует как можно больше избегать копирования переменных PHP: http://code.google.com/speed/articles/optimizing-php.html

Лично мне нравится, когда в верхней части скрипта ясно видно, какие переменные скрипт ожидает от запроса, поэтому я использовал для записи копий $_REQUEST и друзей сверху:

<?php
    $req_param1 = $_REQUEST['param1'];
    ...
    if (isset($req_param1)) {
        ...
    }
    ...

В настоящее время я делаю это по-другому. Обычно я использую define() или в классе const, чтобы определить имена параметров, которые я ожидаю получить из запроса. Затем я могу найти их в коде, чтобы увидеть, где я на самом деле ссылаюсь на них:

define('REQ_PARAM1', 'param1');
...
function foo(){ 
    if (isset($_REQUEST[REQ_PARAM1])){
    ...
    }
    ...
}

пример с классом:

class MyClass {
    const REQ_PARAM1 = "param1";
    ...
    function foo(){
        if (isset($_REQUEST[MyClass::REQ_PARAM1])){
            ...
        }
    }
}
0 голосов
/ 14 февраля 2010

Я полагаю, что вам следует это сделать, потому что вы должны выполнить какую-то очистку для почтовых переменных, а затем присвоить локальную переменную

...