Лучший способ хранить статьи в базе данных? (php и sql)

Я хочу хранить статьи в базе данных, но я не могу найти много информации о том, как лучше всего это сделать, из того, что я прочитал, кажется, что большинство людей разделились на то, как эффективно это сделать. Многие люди предложат способ, а другие укажут на проблемы с внедрением sql, и я не могу найти много нового в этой теме.

Вот html статьи:

    <div id="main">

        <article>

            <header>
                <h3> Title </h3>
                <time pubdate="pubdate"> 2011-07-22 </time>
            </header>

            <p> Article Text </p>

        </article>

    </div>

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


person valon    schedule 23.07.2011    source источник
comment
Я не понимаю, почему люди говорят о проблемах с SQL Injection. Я думал, что с привязкой параметров такие проблемы в основном остались в прошлом. Я ошибся?   -  person vol7ron    schedule 23.07.2011


Ответы (6)


Сохраните свою статью как ТЕКСТ :) Просто передайте ее сначала через эту функцию php, чтобы предотвратить атаки путем внедрения:

// Prevent MySQL Injection Attacks
function cleanQuery($string){
    if(get_magic_quotes_gpc())  // prevents duplicate backslashes
        $string = stripslashes($string);
    return mysql_escape_string($string);
}
person Paul    schedule 23.07.2011
comment
Я бы посоветовал использовать PDO =› net.tutsplus.com/tutorials/php/. Это безопаснее, быстрее и очень удобно, если вы хотите протестировать свою базу данных. Для тестирования просто используйте SQLite в режиме памяти => new PDO('sqlite::memory:') - person Alfred; 23.07.2011

Когда я сохраняю большой объем пользовательского текста, я просто использую base64, а затем, прежде чем отображать его, обязательно прогоняю его через htmlspecialchars, это предотвратит работу html, поэтому htmlspecialchars(base64_decode($content)) отлично подойдет для отображения.
Если вы используете bbcode для форматирования, то обязательно запустите htmlspecialchars, прежде чем начинать форматирование bbcode.

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

person Ben    schedule 23.07.2011

Хранить его в базе данных SQL — это хорошо, но вы можете и должны защитить свой код от SQL-инъекций.

т.е. очистка всего пользовательского ввода перед его отправкой в ​​БД.

Руководство PHP по внедрению SQL

person Tom Studee    schedule 23.07.2011

Я думаю, что лучший способ — просто сохранить чистый текст, но обычно это не тот случай, когда вы хотите использовать дополнительное форматирование. Вы можете преобразовать теги html в bbcodes или аналогичные теги, которые могут предотвратить внедрение sql, однако, если вы избегаете содержимого html, это будет так же безопасно, как и любой другой контент. так что делайте mysql_real_escape_string для любых данных, которые вы помещаете в базу данных, и все будет в порядке.

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

person Vish    schedule 23.07.2011

используйте lucene или sphinx либо из Zend_Lucene, либо через solr. они ускорят индексацию статьи, а также по ним можно будет выполнять полнотекстовый поиск. использование lucene или solar для индексирования и поиска в этих случаях является довольно стандартной процедурой и позволит вам масштабироваться до миллионов статей.

sphinx — это демон, работающий параллельно с демоном mysql. для использования sphinx вы можете использовать расширение pecl sphinx.

если вы хотите использовать lucene, вы можете попробовать zend_lucene или solr, который на самом деле является дистрибутивом tomcat с веб-приложением, которое предоставляет lucene как веб-сервис, поэтому вы можете получить к нему доступ стандартным способом, независимо от языка.

выбор любого из них в порядке. вы можете индексировать по полному тексту (содержимому) и категориям или тому, что вам нужно индексировать.

person marcelog    schedule 23.07.2011

самый безопасный способ предотвратить внедрение sql здесь - использовать подготовленный оператор.

$stmt = $con->prepare("INSERT INTO Articles (Title, Date, Article) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $title, $currentDate, $articleBody);

Знаки вопроса представляют значения, которые вы будете передавать. «sss» говорит, что каждая из трех переменных будет строкой, а затем вы можете вызвать этот подготовленный оператор и передать ему правильные значения.

$title = $_POST[title];
$currentDate = date("Y-m-d H:i:s");
$articleBody = $_POST[article];
$stmt->execute();

это гарантирует, что вредоносный sql не может быть введен в вашу базу данных.

надеюсь это поможет!

person Danny Blue    schedule 18.10.2013