阅读所有关于消毒的帖子让我很困惑。我正在创建一个博客类型的网站,需要清理用户输入,这些输入将进入数据库(用户个人资料信息,博客帖子和评论)以及来自GET请求的某些ID和用户名,以使用查询来显示信息。
这是我根据我所读到的内容拼凑而成的:
function escape($data) {
global $conn;
connect();
$data = $conn->real_escape_string($data);
$conn->close();
$data = str_replace(chr(0), '', $data);
return $data;
}
function sanitize($data) {
$data = trim($data);
$data = strip_tags($data);
$data = stripslashes($data);
$data = escape($data);
$data = htmlspecialchars($data);
return $data;
}
striplashes让我感到困惑。我知道PHP自动将这些放入GET和POST请求中,双斜线可能是个问题。我应该在stripslashes之后的函数中添加addslashes()以确保它没问题吗?
对于所有insert和update语句,插入的值都是使用预准备语句绑定的,但是所有其他语句都没有准备好(在这个项目的这个阶段,由于各种原因,对它们执行预处理语句效率不高)。
我很想得到您的反馈。就像我说的,这一切都很混乱!
更新:
我添加了$ data = str_replace(chr(0),'',$ data);防止空字节注入。是吗?
BTW,进入查询的唯一GET请求是ID号(我有一个删除除数字之外的所有内容的函数)或用户名。在进入任何查询之前,我正在使用上面的转义函数来清理用户名。这够好吗?我在博客文章和个人资料信息上使用的清理功能,由用户提供并通过预准备语句插入到表中。
答案 0 :(得分:1)
function cleanInput($input) {
$search = array(
'@<script[^>]*?>.*?</script>@si', // Strip out javascript
'@<[\/\!]*?[^<>]*?>@si', // Strip out HTML tags
'@<style[^>]*?>.*?</style>@siU', // Strip style tags properly
'@<![\s\S]*?--[ \t\n\r]*>@' // Strip multi-line comments
);
$output = preg_replace($search, '', $input);
return $output;
}
function sanitize($input) {
if (is_array($input)) {
foreach ($input as $var => $val) {
$output[$var] = sanitize($val);
}
} else {
if (get_magic_quotes_gpc()) {
$input = stripslashes($input);
}
$input = cleanInput($input);
$output = mysql_real_escape_string($input);
}
return $output;
}