将html / text插入mysql

时间:2011-08-31 11:56:35

标签: php mysql text sql-injection

我正在使用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 个答案:

答案 0 :(得分:3)

它不仅是tinyMCE文本,而是可能导致SQL注入的整个脚本。您可以对查询中插入的每个参数使用mysql_real_escape_string,或者考虑使用预备语句,例如PDO

答案 1 :(得分:1)

使用prepared statements可以防止注射并帮助您解决“问题。” 一个基于代码的小例子:

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

Execute方法也返回bool,因此您不必更改代码。

答案 2 :(得分:1)

  1. 按建议使用mysql_real_escape_string()
  2. 在显示内容时,在将内容添加到文本区域时使用htmlspecialchars()以防止XSS。

答案 3 :(得分:0)

你基本上需要针对html / sql目标格式的不同引用。 没有什么比“普遍引用”更像。引用时,始终为某些特定输出 引用文字,例如:

  1. mysql查询的字符串值
  2. like mysql查询表达式
  3. html代码
  4. JS​​ON
  5. mysql正则表达式
  6. php正则表达式
  7. 对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。这也意味着引用不应该在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()