Редактировать файл на SFTP-сервере

Я написал скрипт, который берет ввод пользователя из текстовой области и помещает его в текстовый файл. Он также проверяет, существует ли фрагмент текста пользователя в текстовом файле, в этом случае он не записывает в файл (во избежание дублирования записей). В моем коде ниже речь идет о файле textfile.txt. Вместо этого я хочу отредактировать файл на SFTP-сервере. Я что-то читал о ssh2_sftp, но не понял, как его использовать. Помогите мне, пожалуйста!

Кроме того, существует ли какой-либо риск для безопасности, позволяющий людям редактировать текстовый файл на сервере с помощью приведенного ниже кода? (за исключением рассылки спама и увеличения размера файла, так как я использую CAPTCHA для формы ввода).

Благодарю вас!

<?
$text = $_POST['update'];
$handle = file_get_contents("textfile.txt",NULL); 
$text=str_replace(",","",$text); 
$text=explode(" ",$text); 
$c=0; 
foreach($text as $y){ 
if (stristr($handle,"$text[$c]")) $b[]= 'yes'; 
else $b[]='no'; 
$c++; 
} 
echo $handle; 
if (in_array("no",$b)) /*här */if($_POST['Submit']){
$open = fopen("textfile.txt","a+");
$text = $_POST['update'];
fwrite($open, "".$text."\n");
fclose($open);
echo "<br/><br/><br/>".$text." has been saved."; 
foreach($file as $text) {
echo $text."<br />";
}
}else{    
} 
else echo '<br/><br/>Thats already in there.'; 
?>

person Emil    schedule 16.03.2011    source источник
comment
Я знаю, что это не связано, но сделайте себе одолжение и не используйте короткие теги php... stackoverflow.com/questions/200640/   -  person Jason    schedule 17.03.2011


Ответы (2)


Да. Если вы не очищаете способ отображения содержимого файла (из того, что я вижу, вы используете echo $handle; для его отображения), тогда человек может отправить созданный HTML и создать XSS-атаку.

Возможно, вы захотите использовать strip_tags() для входных данных, чтобы предотвратить это.

Кроме того, DOS-атака может быть запущена довольно легко из-за использования file_get_contents в файле неизвестного размера. Это можно уменьшить, просто перебирая файл построчно или ограничивая длину отправляемого пользователем текста. Эта атака, скорее всего, не такая серьезная, потому что вы используете CAPTCHA, которая замедлит быструю отправку текста большинством пользователей, но если file_get_contents() вызывается без использования CAPTCHA (скажем, для просмотра содержимого файла), у вас все равно будет проблема.

Изменить: я переписал для вас большую часть фрагмента кода и добавил много комментариев. Надеюсь, вы сможете почерпнуть из него несколько советов и приемов и лучше понять лучшие практики программирования. (Я не пробовал запускать код, но он должен работать нормально. При необходимости внесите в него изменения.)
http://pastebin.com/W1EQ3fSm

person Mr. Llama    schedule 16.03.2011
comment
Вау, спасибо! Я думаю, что понял все части кода, который вы написали. У меня есть два вопроса; 1. Как я могу сделать так, чтобы часть кода, которая проверяет файл на наличие строки, проверяла только целые слова/строки? Чтобы вы могли иметь ExampleText в текстовом файле и по-прежнему отправлять ExampleLine в файл? Прямо сейчас он находит Example и прерывает работу. 2. Как и в моем вопросе выше, как я могу добавить в текстовый файл на SFTP-сервере? Благодарю вас! - person Emil; 17.03.2011

Используя phpseclib, реализацию SFTP на чистом PHP...

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

echo $sftp->pwd() . "\r\n";
$sftp->put('textfile.txt', $sftp->get('textfile.txt') . $_POST['update']."\n");
?>
person nevershown    schedule 21.03.2011