2012-07-29 52 views
1

可能重复:
Best way to prevent SQL Injection in PHP保存HTML数据库 - ヶ辆

我的网站上我有一些HTML内容,用户有时必须数据库保存。什么是安全的方式来做到这一点(我不希望我的数据库处于危险之中,或者稍后会从数据库中调用该代码的用户)。

所以我读的是:

使用htmlentities在数据库中的数据保存和html_entity_decode将数据从数据库中进行解码。这是否足够安全,还是应该使用别的东西?

+0

嘛,我不仅对数据库的担忧,也用于从数据库中显示html。 – SomeoneS 2012-07-29 09:11:53

+0

这是[一个完全不同的问题](http://stackoverflow.com/questions/3129899/what-are-the-common-defenses-against-xss)(以及在将内容插入HTML文档之前解决的问题,而不是就在将内容插入数据库之前)。 – Quentin 2012-07-29 09:14:32

回答

5

假设您使用字符串转义和/或预处理语句,HTML标记不会对您的数据库造成任何损害。将HTML标记显示给用户时,会带来危险,就像有人向您要显示的标记中注入了不雅的HTML,然后您的手上就会发生XSS攻击。

如果您不是在逃避或使用准备好的语句,那么几乎所有来自外部的数据都可能是危险的。

+0

我还没有听说过“prerpared语句”,但我发现这个函数: 'function make_safe($ variable){ \t $ variable = stripslashes($ variable); $ variable = mysql_real_escape_string(trim($ variable)); \t $ variable = htmlspecialchars($ variable); return $ variable; }' 这是否足够逃脱? – SomeoneS 2012-07-29 09:10:24

+1

很可怕!不要使用它。 – GordonM 2012-07-29 09:10:59

+0

为什么?那么它应该看起来如何? (我曾用这个代码清理用户注册数据):s – SomeoneS 2012-07-29 09:13:33

0

你可能想看看PHP函数mysql_real_escape_string() ...更多在这个帖子:strip_tags enough to remove HTML from string?

下面是一个例子...

// scrub string ... call with sanitize($blah,1) to allow HTML 
function sanitize($val, $html=0) { 
    if (is_array($val)) { 
     foreach ($val as $k=>$v) $val[$k] = sanitize($v, $html); 
     return $val; 
    } else { 
     $val = trim($val); 
     if (!$html) { 
      $val = strip_tags($val); 
      $pat = array("\r\n", "\n\r", "\n", "\r"); 
      $val = str_replace($pat, '<br>', $val); // newlines to <br> 
      $pat = array('/^\s+/', '/\s{2,}/', '/\s+\$/'); 
      $rep = array('', ' ', ''); 
      $val = preg_replace($pat, $rep, $val); // remove multiple whitespaces 
     } 
     return mysql_real_escape_string($val); // escape stuff 
    } 
} 
+1

你错了,错了.. – 2012-07-29 09:05:38

+1

精心制作并且有用 – neokio 2012-07-29 09:08:49

+2

1)mysql_real_escape_string与HTML标记无关,而是确保字符串被正确引用。 2)如果您想清理或去除HTML,请使用正确的工具(htmlentities/htmlspecialchars/strip_tags),并且不要制定您自己的临时解决方案。 3)mysql_ *已过时,并且在所有名称中都被弃用。如果你仍然在使用它们,那么请切换到mysqli或pdo – GordonM 2012-07-29 09:10:28