嗯,标题是我的问题。在使用php进入mysql数据库之前,有人可以给我一些清理数据的清单,特别是如果数据包含html标签吗?
答案 0 :(得分:2)
这取决于很多事情。如果您不想接受任何HTML,这使得它变得更加容易,首先通过strip_tags()
运行它以从中删除所有HTML。之后它会更安全。如果你想接受一些HTML,你可以选择性地使用相同的功能保留一些标签,只需添加标签即可。例如:strip_tags($string_to_sanitize, '<p><div>'); // Keeps only <p> and <div> tags
。
至于插入数据库,最好在插入数据库之前清理任何;采用“不信任任何人”的心态会为你省去很多麻烦。防止SQL注入是相当简单的,这是我使用的方法:
$q = sprintf("INSERT INTO table_name (string_field, int_field) VALUES ('%s', %d);",
mysql_real_escape_string($values['string']),
mysql_real_escape_string($values['number']));
$result = mysql_query($q, $connection)
一般来说,一旦你打开允许HTML进入的大门,你就会有很多事情需要担心(有一些关于防御XSS的好文章)。如果要测试XSS漏洞,请尝试http://ha.ckers.org/xss.html上的示例。有一些他们可能永远都不会考虑,所以看看吧!
此外,如果您接受特定类型的输入(例如:数字,电子邮件,布尔值),请尝试在PHP中使用内置的filter_var()
函数。他们有一堆内置类型来验证针对(http://www.php.net/manual/en/filter.filters.validate.php)的数据,以及一些用于清理数据的过滤器(http://www.php.net/manual/en/filter.filters.sanitize.php)。
一般来说,接受任何输入就像打开潘多拉盒子一样,虽然你可能永远无法阻止100%的弱点(人们总是希望找到一种方法),你可以阻止常见的除了你头疼。
最后记得要清理所有外部数据。仅仅因为你输入下拉菜单并不意味着一些阴暗的人不能发送他们自己的数据!
答案 1 :(得分:1)
使用mysql_real_escape_string();
mysql_query("INSERT INTO table(col) VALUES('".mysql_real_escape_string($_POST['data']."')");
答案 2 :(得分:1)
将数据插入数据库时应使用prepared statements,而不是任何类型的转义。 (PHP手册:pdo和mysqli中准备好的语句。)
正如其他人所提到的那样,HTML输出的清理应当在您将数据库 out 带入数据库并将其合并到页面中时发生,而不是之前。
答案 3 :(得分:0)
关闭register_globals
和magic_quotes
,对用户发出的任何字符串使用mysql_real_escape_string,然后再将其放入查询中。
答案 4 :(得分:0)
当然是mysql_real_escape_string 当处理任何类型的输入时,我将不允许任何支持点和白名单只被认为是可接受的。
答案 5 :(得分:0)
在插入时,您需要确保数据是MySQL转义的。为此,请使用mysql_real_escape_string。
在显示数据之前,您需要删除不安全的HTML和/或JavaScript代码。许多人选择将清理后的版本存储在数据库中。其他人喜欢在渲染之前从字符串中剥离丑陋的HTML。
您可以在PHP中执行此操作并进行一些过滤。一个例子是Drupal filter_xss函数:
function filter_xss($string, $allowed_tags = array('a', 'em', 'strong', 'cite', 'code', 'ul', 'ol', 'li', 'dl', 'dt', 'dd')) {
// Only operate on valid UTF-8 strings. This is necessary to prevent cross
// site scripting issues on Internet Explorer 6.
if (!drupal_validate_utf8($string)) {
return '';
}
// Store the input format
_filter_xss_split($allowed_tags, TRUE);
// Remove NUL characters (ignored by some browsers)
$string = str_replace(chr(0), '', $string);
// Remove Netscape 4 JS entities
$string = preg_replace('%&\s*\{[^}]*(\}\s*;?|$)%', '', $string);
// Defuse all HTML entities
$string = str_replace('&', '&', $string);
// Change back only well-formed entities in our whitelist
// Decimal numeric entities
$string = preg_replace('/&#([0-9]+;)/', '&#\1', $string);
// Hexadecimal numeric entities
$string = preg_replace('/&#[Xx]0*((?:[0-9A-Fa-f]{2})+;)/', '&#x\1', $string);
// Named entities
$string = preg_replace('/&([A-Za-z][A-Za-z0-9]*;)/', '&\1', $string);
return preg_replace_callback('%
(
<(?=[^a-zA-Z!/]) # a lone <
| # or
<!--.*?--> # a comment
| # or
<[^>]*(>|$) # a string that starts with a <, up until the > or the end of the string
| # or
> # just a >
)%x', '_filter_xss_split', $string);
}
答案 6 :(得分:0)
好吧,当我们谈论将数据从textarea插入mysql数据库时,没有太多事情要做。
对于放入查询的字符串,Mysql要求并不那么复杂 只需遵循两条规则:
请注意,此操作与安全性无关。这是语法要求。
假设您已经添加了引号,您唯一需要添加的是转义。取决于您的编码,您可以使用addslashes或mysql_escape_string或mysql_real_escape_string函数。
但是,查询的其他部分需要更多关注。如果您感到好奇,请参阅我之前的回答,并附上完整指南:In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?
HTML标记与数据库无关,无需特别注意。
但是,为了显示来自不受信任来源的数据,应采取一些预防措施。已经在本主题中进行了描述,只有我必须添加的是当与第二个参数一起使用时你不能信任strip_tags。
答案 7 :(得分:-3)
你可以使用mysql_real_escape_string,你也可以使用带有addslashes的htmlentities ...或者你也可以同时使用所有3个...