Уязвим ли я к SQL-инъекциям и межсайтовому скриптингу (и другим ...)?Что делать? - PullRequest
1 голос
/ 13 апреля 2011

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

Сейчас я работаю над страницей, которая займетпользовательский ввод (в конечном счете, будет угадайку в игре с угадыванием) и сохраните его в CSV-файле.Технический парень предупредил меня об опасности внедрения SQL-кода и межсайтового скриптинга, поэтому я нашел их в Google и стратегии защиты.Но похоже, что существует МНОГИЕ стратегии, и мне трудно понять, какие из них мне нужно использовать.Например, мне даже нужно беспокоиться о внедрении SQL, если я не использую SQL?Я использую sql и просто не знаю?Было бы достаточно убрать все не алфавитные символы из ввода, используя javascript (я действительно не нуждаюсь в них)?

Может кто-нибудь сказать мне: какие стратегии защиты мне нужно использовать, учитывая то,пытаюсь сделать?

Если это поможет, вот мой код до сих пор.Я пытаюсь использовать Ajax, поэтому у меня есть следующие компоненты:

A.HTML: представляет текстовое поле и кнопки для записи ввода в файл CSV (один для записи в ту же строку, другой для записи в новую строку).

<input id="input" type="text"><br><br> <input type="button" onClick="javascript:writeToFile(0, document.getElementById('input').value)" value="write on same line"><br><br> <input type="button" onClick="javascript:writeToFile(1,document.getElementById('input').value)" value="write on new line"><br>

B.Javascript: создает объект XMLHttpRequest, открывает его с помощью post и указывает сценарий php и отправляет его вместе со строкой, введенной пользователем (здесь я не включил функцию обратного вызова, потому что я не изменяю html-страницу в ответ, ноесли мне нужно, дайте мне знать).

function createRequestObject()<br> {<br> var ro;<br> var browser = navigator.appName;<br> if(browser == "Microsoft Internet Explorer")<br> {<br> ro = new ActiveXObject("Microsoft.XMLHTTP");<br> }<br> else<br> {<br> ro = new XMLHttpRequest();<br> }<br> return ro;<br> }<br> function writeToFile(newline, content)<br> {<br> var ajaxRO = createRequestObject();<br> content+=", "<br> var params="newline=" + newline + "&content=" + content<br> ajaxRO.open("POST", "writer2.php", true);<br> ajaxRO.setRequestHeader("Content-type", "application/x-www-form-urlencoded");<br> ajaxRO.send(params);<br> }

C.PHP: извлекает переменные из Post (первая сообщает, если нужна новая строка, вторая сообщает, что писать)

<?php<br> $myFile = "results.csv";<br> $fh = fopen($myFile, 'a') or die("can't open file");<br> $toWrite = $_POST['content'];<br> $newLine = $_POST['newline'];<br> if($newLine==1)<br> {<br> fwrite($fh, "\n");<br> fwrite($fh, $toWrite);<br> fclose($fh);<br> }<br> else<br> {<br> fwrite($fh, $toWrite);<br> fclose($fh);<br> }<br> ?>

Спасибомного для любой информации, которую вы можете предоставить!

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Я не уверен, почему вы разместили HTML / JavaScript, это не совсем то, где проблемы.XSS и SQL-инъекция - это проблема на стороне сервера, и вам следует публиковать PHP-код, если вам нужна помощь (откладывая XSS на основе DOM, потому что это так необычно).

Для SQL-инъекций вы всегда должны использовать параметризованные запросы.PDO и ADOB - хорошие библиотеки для этого.

Межсайтовый скриптинг защита намного сложнее.Вы не можете просто бросить htmlspeicalchars($var,ENT_QUOTES) на каждую переменную, которую вы печатаете, и ожидать безопасности.Это хорошая практика, но следует также ТЕСТИТЬ ВСЕ .Я предлагаю использовать бесплатный сервис, такой как Sitewatch , который будет проверять xss, sql инъекции и многое другое.Или вы можете использовать бесплатный xss сканер Acunetix .

С точки зрения файла CSV, это просто медленно и громоздко.Вы должны использовать базу данных для этого.Если вам нужно предоставить файл csv, вы можете выбрать то, что вам нужно, и распечатать его на PHP.

1 голос
/ 13 апреля 2011

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

После сбора входных данных, если вы отображаете собранные данные как выходные данные на странице, вам следует HTML-кодировать it.

Это только верхушка айсберга.Безопасность никогда не решается, вы просто поднимаете планку для потенциальных злоумышленников.

0 голосов
/ 14 апреля 2011

Ваш код не уязвим для межсайтовых сценариев, и вы используете не SQL, а только простой текст.

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

$_SESSION['token'] = md5(rand());

if($_SESSION['token'] != $_POST['token']){
    echo 'Invalid Request!';
}
else{
    //valid request!
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...