我正在尝试保护我的网站,所以我不容易受到sql注入或xss的攻击。
这是我的代码:
//here's the form (abbreviated)
<form>
<label for="first_name" class="styled">First Name:</label>
<input type="text" id="first_name" name="first_name" value="<?php if (!empty($first_name)) echo $first_name; ?>" /><br />
//submit button etc
</form>
if (isset($_POST['submit'])) {
//gets rid of extra whitesapce and escapes
$first_name = mysqli_real_escape_string($dbc, trim($_POST['first_name']));
//check if $first_name is a string
if(!is_string($first_name)
{
echo "not string";
}
//then insert into the database.
.......
}
mysqli_real_escape_string
:我知道这个函数会转义某些字母,比如\ n \ r \ n,所以当数据输入dbc时,它会在所有转义字母旁边显示“\”吗?
这个脚本是否足以阻止大多数sql注入?只是转义并检查数据是否为字符串。对于整数值(如用户投入价格),我只需:is_numeric()
。
我应该如何使用htmlspecialchars
?我应该只在回显和显示用户数据时使用它吗?或者我也应该在将数据插入数据库时使用它?
我应该何时使用strip_tags
或htmlspecialchars
?
所有这些功能都是:
if (isset($_POST['submit'])) {
//gets rid of extra whitesapce and escapes
$first_name = mysqli_real_escape_string($dbc, trim($_POST['first_name']));
//check if $first_name is a string
if(!is_string($first_name)
{
echo "not string";
}
//gets rid of any <,>,&
htmlspecialchars($first_name);
//strips any tags with the first name
strip_tags($first_name)
//then insert into the database.
.......
}
我应该使用哪些函数进行sql注入?我应该将哪些函数用于xss?
用户什么时候可以插入xss脚本?什么时候有表格?
答案 0 :(得分:2)
检查数据是否是字符串是没用的:字符串正是您用于注入的内容。
real_escape_string是一种合理的,但不能保证避免SQL注入的方法,因为转义例程存在错误风险并且没有正确转义(事实上,之前存在错误)。正确的方法是使用parameterized queries - 这会将数据与查询结构分开,从而无法进行注入。但是,如果您绝对不能使用参数化查询,那么real_escape_string(在打开连接时使用set_charset)是您可以做的最好的。
您将需要在用户可以触摸的任何内容上使用htmlspecialchars,并且您希望在页面上显示它时使用它。如果您希望用户格式化帖子或任何内容,那么您应该为他们提供格式化语言和BBCode(并在运行htmlspecialchars之后转换BBCode )。如果你需要存储纯HTML,你不会想要使用htmlspecialchars,但是你想确保只有受信任的人可以在那里写。例如,如果您正在撰写博客,那么在博客文章中允许纯HTML可能是可以的,因为只有博客编辑可以在那里写东西。但是,您不希望在评论中允许它,因为每个人都可以在那里写东西,这样就可以轻松地完成cross-site scripting之类的内容。
答案 1 :(得分:1)
对于SQL注入,mysql_real_escape_string
应该有效。 (完全可以肯定,你可以使用准备好的陈述)
对于XSS,htmlspecialchars
应该有效。 strip_tags
可能不那么安全,因为有人可能会巧妙地反对他们的javascript。
答案 2 :(得分:1)
每当您在HTML中嵌入用户提供的信息时,都应使用htmlspecialchars
。无论何时在SQL中嵌入用户提供的信息,都应使用mysql_real_escape_string
。遵循这些规则,你应该没问题。
但请注意,更好的数据库安全解决方案是使用准备/参数化查询(请参阅here和here),因为这些将为您处理转义,从而消除了你的遗忘。
此外,请不要忘记检查magic quotes。
答案 3 :(得分:1)
如果要打印HTML,则应先使用HTML Purifier进行清理。可以将其视为strip_tags()
的高级(和可自定义)版本。
为了插入数据库,我使用prepared statements。这是万无一失的。