Меры для предотвращения уязвимости XSS (как Твиттер один за несколько дней до этого)

Мне плохо, что я не сразу это увидел.

int numLines = lineCount(inFile);

возвращает правильное количество строк в файле. Жука здесь нет, чувак.

std::string data[numLines];

Не является кошерным C ++, но создаст массив с элементом для каждой строки в файле, если поддерживается. Ваша программа запущена, поэтому она поддерживается. Тем не менее, предпочтительнее использовать библиотечные контейнеры .

Между тем в readFile ...

while(std::getline(inFile, data[i]))

Попробую прочитать строку в data[i]. Независимо от того, успешно ли выполняется чтение, должен быть data[i] для чтения. Не будет последней попытки.

Логика

  1. читается в строке 1. Успешно, поэтому
  2. читается в строке 2. Успешно, поэтому
  3. читается в строке 3. Успешно, поэтому
  4. читайте в строке 4. Fail. Но это не мешает getline отвести взгляд от конца data на string и идущий бум (в частности, неопределенное поведение , которое проявляется как идущий бум), потому что его нет. [1119 ]

Правильное решение

int main(){
    std::ifstream inFile("input.txt");
    // no longer need. Vector keeps track for us
    // int numLines = lineCount(inFile);
    std::vector data;
    // read nothing from file. Don't need to rewind
    readFile(inFile, data);

    // note: files close themselves when they are destroyed.
    //inFile.close(); 
    return 0;
}
void readFile(std::istream& inFile, std::vector & data){
    int i = 0;
    std::string line; // line to read into. Always there, so we don't have to worry.
    while(std::getline(inFile, line)){
         std::cout << i << "\n"; //testing values
         std::cout << line << "\n"; //testing values
         data.push_back(line); // stuff line into vector.
         i++;
    }
}

Недопустимое решение vector

int main(){
    std::ifstream inFile("input.txt");
    int numLines = lineCount(inFile);
    // legal in every C++, but prefer container may want some extra armour 
    // here to protect from numlines 0. 
    std::string * data = new std::string[numlines]; 
    // the following is a faster way to rewind a file than closing and re-opening
    inFile.clear(); // clear the EOF flag
    inFile.seekg(0, ios::beg); // rewind file.
    readFile(inFile, data);
    inFile.close();
    return 0;
}
void readFile(std::istream& inFile, std::string * data){
    int i = 0;
    std::string line; // same as above. line is here even if data[i] isn't
    while(std::getline(inFile, line)){
         std::cout << i << "\n"; //testing values
         std::cout << line << "\n"; //testing values
         data[i] = line; // stuff line into array. Smart compiler may realize it can move
                         //if not, c++11 adds a formal std::move to force it.
         i++;
    }
}

6
задан tvanfosson 3 May 2009 в 03:24
поделиться

3 ответа

Первое, что вы можете сделать, это установить для файлов cookie только HTTP ... что, по крайней мере, защищает от перехвата файлов cookie сеанса. Как кто-то украл ваш cookie, когда вы, вероятно, являетесь администратором своего собственного сайта.

Остальное сводится к проверке всего введенного пользователем.

  • ПРАВИЛО № 0 - Никогда не вставляйте ненадежные данные, кроме разрешенных мест
  • ПРАВИЛО № 1 - HTML Escape перед вставкой ненадежных данных в содержимое элемента HTML
  • RULE # 2 - Удаление атрибутов перед вставкой ненадежных данных в общие атрибуты HTML
  • RULE # 3 - Escape JavaScript перед вставкой ненадежных данных в значения данных HTML JavaScript
  • RULE # 4 - Экранирование CSS перед вставкой ненадежных данных в значения свойств стиля HTML
  • ПРАВИЛО № 5 - Экранирование URL перед вставкой ненадежных данных в атрибуты HTML HTML

Очень длинный предмет, подробно обсуждаемый здесь:

http: //www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet

http://www.owasp.org/index.php/Cross_site_scripting

XSS - это только один из многих эксплойтов, и каждый веб-разработчик должен выучить 10 лучших OWASP наизусть imho

http://www.owasp.org/index.php/Top_10_2007

8
ответ дан 10 December 2019 в 00:44
поделиться

Я не то, чем вы пишете свой код, но если вы используете asp.net, вы частично охвачены. У asp.net есть то, что они называют проверкой запросов: когда он включен, он предотвращает внедрение вредоносного скрипта через пользовательский ввод.

Но иногда вам придется разрешить какой-то текстовый редактор, подобный тому, который вы ввели в этом вопросе. В этом случае вам придется частично отключить проверку запросов, чтобы конечный пользователь мог вводить некоторые «расширенные текстовые» html. В этом случае вам придется создать какой-то механизм фильтрации белого списка.

К вашему сведению, я не знаю о других, но у Microsoft есть библиотека под названием Anti-Xss.

0
ответ дан 10 December 2019 в 00:44
поделиться

Точно так же, как вы можете сделать SQL-инъекцию беспроблемной с помощью подготовленных операторов, вы можете сделать так, чтобы XSS не создавал проблем, используя механизм шаблонов (сериализатор DOM), который делает то же самое.

Дизайн ваше приложение, чтобы весь вывод проходил через механизм шаблонов. Сделайте этот шаблонизатор HTML-экранированием всех данных по умолчанию. Таким образом, у вас будет система, которая по умолчанию безопасна и не полагается на людей (и остальную часть большой системы), которые стараются избежать HTML.

2
ответ дан 10 December 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: