我正在使用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 ) );
答案 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)
mysql_real_escape_string()
htmlspecialchars()
以防止XSS。答案 3 :(得分:0)
你基本上需要针对html / sql目标格式的不同引用。 没有什么比“普遍引用”更像。引用时,始终为某些特定输出 引用文字,例如:
like
mysql查询表达式对于每种情况,您需要不同的引用,因为每种用法都存在于不同的语法上下文中。这也意味着引用不应该在PHP的输入中进行,而是在特定的输出!这就是为什么像magic_quotes_gpc
这样的功能被打破的原因(永远不会忘记处理它,或者更好,确保它被关闭!!! )。
那么,在这些特定情况下,用什么方法来引用? (随意纠正我,可能有更现代的方法,但这些对我有用)
mysql_real_escape_string($str)
mysql_real_escape_string(addcslashes($str, "%_"))
htmlspecialchars($str)
json_encode()
- 仅适用于utf8!我将我的功能用于iso-8859-2 mysql_real_escape_string(addcslashes($str, '^.[]$()|*+?{}'))
- 在这种情况下你不能使用preg_quote,因为反斜杠会被转义两次!preg_quote()