我一直在使用:
if ($_POST['Comments']!=""){
$comments = mysql_real_escape_string($_POST['Comments']);
}else{
$comments = "";
}
自从用户添加并篡改他们的数据并且它破坏了我的sql语句以来。我认为这也同时保护了数据。但刚才我收到了一份提交内容,并在数据库的评论栏中看到:
/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r/r
<a href="http://seowebsite.com">seohelp</a>
当有人提交时,我收到的电子邮件中包含链接的文本实际上正在运行。
我认为mysql_real_escape_string()
应该摆脱所有这些?
有什么建议吗?我正在考虑做一个功能,在几个不同的步骤中为我做所有的字符串清理。但是,如果有一种方法可以在一步中获得保障,那就太棒了。
答案 0 :(得分:2)
mysql_real_escape_string()
仅保护 * 免受SQL注入攻击,而不是针对跨站点脚本(XSS)。
* mysql_real_escape_string()
与SET NAMES
一起使用时表现不正常,因为它不知道正在使用的字符集。请改用mysql_set_charset()
。
为了保护自己免受XSS攻击,您还必须在插入时(htmlentities()
之前)或在显示时使用htmlspecialchars()
或mysql_real_escape_string()
。
$escaped = htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
如果您想允许某些 HTML内容,请使用HTML Purifier以及您要允许的元素和属性的白名单。