Вопрос безопасности Ajax: JQuery ajax () + PHP scandir () = Проблема безопасности? - PullRequest
2 голосов
/ 26 июня 2009

Я новичок в вопросах безопасности PHP. Кто-то сообщил о проблеме безопасности с моим кодом, но никогда не сообщал подробности.

Ниже приведена сокращенная версия кода. Я использую функцию JQuery AJAX для отправки некоторых данных на сервер, где они используются функцией PHP scandir ().

Видите ли вы какие-либо проблемы с безопасностью?

HTML-документ

 <script 
   src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js">
 </script>
 <script>
$.ajax({
    type: "POST",
    url: "example.php",
    cache: false,
    data: {
        foo: "images",
        bar: "something else",
            },
    success: function(html){
    alert(html);
    }
});
</script>

PHP-документ

<?php

$foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING);
$bar = filter_var($_POST["bar"], FILTER_SANITIZE_STRING);

$foo = scandir($foo);
$bar = (explode(",",$bar));

foreach ($foo as $a) {
    echo "<img src='$foo/$a'>";
}

?>

Ответы [ 2 ]

4 голосов
/ 26 июня 2009

Да, я могу перечислить каждый файл на вашем компьютере. И, возможно, другие машины, к которым ваш сервер имеет доступ через fopen wrappers . Эта информация может помочь идентифицировать другое уязвимое программное обеспечение, работающее или уязвимые файлы, чтобы помочь мне нацелиться на дальнейшие атаки.

FILTER_SANITIZE_STRING предназначен для защиты HTML, а не ссылок на пути к файлам, поэтому он действительно здесь вам не поможет. Это следует использовать только в качестве выходного фильтра для сгенерированного HTML, а не при использовании внутренней функции.

Вы хотите ограничить использование опасных токенов, таких как:, @, .., \ и /. Но сделайте это, занеся в белый список символы или значения, которые вы считаете безопасными, как в примере кода Тома Хейга.

1 голос
/ 26 июня 2009

Вы могли бы потенциально получить список любых файлов в вашей файловой системе, разместив вредоносное значение с именем 'foo' - если было отправлено значение '/', вы сможете увидеть в исходном коде HTML все файлы в вашей файловой системе. корень. Это может не всегда работать из-за таких ограничений, как open_basedir, но все равно это не очень хорошая идея.

Возможным решением было бы сначала очистить параметр 'foo', например разрешать только определенные символы, или вы можете разрешить только значения 'foo', которые существуют в белом списке разрешенных имен каталогов, например ::

$foo = filter_var($_POST["foo"], FILTER_SANITIZE_STRING);

if (!in_array($foo, array('allowed_dir1', 'allowed_dir2'))) {
    //not valid, not in whitelist
}

//or

if (!preg_match('/^[a-zA-Z0-9+]+$/', $foo)) {
   //not valid, contains more than just letters and numbers
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...