Вставить HTML / текст в MySQL - PullRequest
       5

Вставить HTML / текст в MySQL

0 голосов
/ 31 августа 2011

Я использую TinyMCE, чтобы позволить пользователям редактировать содержимое определенных страниц, проблема в том, что я должен хранить html-теги вместе с class = "" -es и ..etc.Как защищать приложение от внедрения SQL и хранить теги html?(главная проблема - это "-s, это портит запрос mysql)

В двух словах, я не знаю, как добавить $ _POST (который является текстом) в функцию insert_to_content ()

    $html = "";
    $url = "";if (isset($_GET["page"])) {$url = safesql($_GET["page"]);}
    $sqlSelectPageText = mysql_query('SELECT * FROM content WHERE name="'.$url.'" LIMIT 1');
    $pageText = mysql_fetch_array($sqlSelectPageText); /**/ $sqlSelectPageText = ""; 
    if (isset($_GET["edit"]) and isset($_POST["text"])) {
        insert_to_content($url,I_SHOULD_DO_SOMTHG_WAAA($_POST["text"]));
        header('Location: admin.php?page='.$url);
    }

    $html .= '<div id="editor1div">';
    $html .= '<form action="admin.php?page='.$url.'&edit" method="post">';
    $html .= '  <input class="formsSubmit" type="image" src="images/yep2.png" alt="Save" />';
    $html .= '<p>Content:</p>';
    $html .= '  <textarea id="editor1" name="text">';
            $html .= '      '.$pageText["text"]; /**/$pageText = ""; 
    $html .= '  </textarea>';
    $html .= '</form>';
    $html .= '</div>';


    echo $html;

function insert_to_content($whatPage, $text) {
    if (mysql_query('UPDATE content SET text="'.$text.'", lastdate=NOW() WHERE name="'.$whatPage.'"')) {
        return true;
    } else {
        return false;   
    }
}

function I_SHOULD_DO_SOMTHG_WAAA($text) {
           //what should i do with it?
}

РЕДАКТИРОВАТЬ:@CaNNaDaRk: Я пытаюсь использовать вашу работу, но никогда не использовал PDO (или OOP PHP) так.Итак, возможно ли, что у меня нет этой функции?: D"Класс 'PDO' не найден в .."`

$db = new PDO("mysql:host=$sqlHost;dbname=$sqlDb;$sqlUser,$sqlPass"); 
$stmt = $db->prepare('UPDATE content SET text=:text, lastdate=NOW() WHERE name=:name');
$stmt->execute( array(':text' => $html, ':name' => $whatPage ) );

Ответы [ 4 ]

3 голосов
/ 31 августа 2011

Это не только текст tinyMCE, но и весь ваш скрипт, который может привести к SQL-инъекциям .Либо используйте mysql_real_escape_string для каждого параметра, вставляемого в запрос, либо подумайте об использовании подготовленных операторов , таких как PDO .

1 голос
/ 31 августа 2011
  1. используйте mysql_real_escape_string() как предложено
  2. при отображении контента, используйте htmlspecialchars() при добавлении контента в текстовую область, чтобы предотвратить XSS.
1 голос
/ 31 августа 2011

Использование подготовленных операторов может предотвратить инъекцию и помочь вам решить проблему.
Небольшой пример, основанный на вашем коде:

$stmt = $db->prepare('UPDATE content SET text=:text, lastdate=NOW() WHERE name=:name');
$stmt->execute( array(':text' => $html, ':name' => $whatPage ) );

Метод Execute также возвращает bool, так чтовам не нужно сильно менять код.

0 голосов
/ 23 сентября 2011

Вам нужны разные цитаты для целевых форматов html / sql. Нет ничего лучше "универсального цитирования" . При цитировании вы всегда цитируете текст для какого-то конкретного вывода , например:

  1. строковое значение для запроса MySQL
  2. like выражение для запроса mysql
  3. HTML-код
  4. 1017 * JSON *
  5. регулярное выражение mysql
  6. PHP регулярное выражение

Для каждого случая вам нужны разные кавычки, потому что каждое использование присутствует в различном синтаксическом контексте. Это также подразумевает, что цитирование должно производиться не при вводе в PHP, а при конкретном выводе ! Именно поэтому такие функции, как magic_quotes_gpc, не работают ( никогда не забывайте обращаться с ним, или, что еще лучше, убедитесь, что он выключен !!! ).

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

  1. mysql_real_escape_string($str)
  2. mysql_real_escape_string(addcslashes($str, "%_"))
  3. htmlspecialchars($str)
  4. json_encode() - только для utf8! Я использую свою функцию для ISO-8859-2
  5. mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}')) - вы не можете использовать preg_quote в этом случае, потому что обратный слеш будет экранирован два раза!
  6. preg_quote()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...