Лучший способ хранить статьи в базе данных?(php и sql) - PullRequest
4 голосов
/ 23 июля 2011

Я хочу хранить статьи в базе данных, но я не могу найти много информации о том, как лучше всего это сделать, из того, что я прочитал, большинство людей узнают, как эффективно это сделать.Многие люди предложат способ, а другие укажут на проблемы с внедрением 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 и базах данных, я хочу получить некоторую информацию о том, как лучше это сделать, прежде чем продолжить.

Ответы [ 6 ]

2 голосов
/ 23 июля 2011

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

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

1 голос
/ 18 октября 2013

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

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

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

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

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

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

1 голос
/ 23 июля 2011

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

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

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

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

1 голос
/ 23 июля 2011

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

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

1 голос
/ 23 июля 2011

Сохранение в базе данных SQL - это хорошо, но вы можете и должны защищать от внедрения SQL в ваш код.

т. Е. Очистка всего пользовательского ввода перед отправкой в ​​базу данных.

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

0 голосов
/ 23 июля 2011

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

// Prevent MySQL Injection Attacks
function cleanQuery($string){
    if(get_magic_quotes_gpc())  // prevents duplicate backslashes
        $string = stripslashes($string);
    return mysql_escape_string($string);
}
...