这些安全功能是否足够?

时间:2010-05-04 20:21:04

标签: php mysql security xss sql-injection

我正在尝试保护我的网站,所以我不容易受到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_tagshtmlspecialchars

所有这些功能都是:

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脚本?什么时候有表格?

4 个答案:

答案 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。遵循这些规则,你应该没问题。

但请注意,更好的数据库安全解决方案是使用准备/参数化查询(请参阅herehere),因为这些将为您处理转义,从而消除了你的遗忘。

此外,请不要忘记检查magic quotes

答案 3 :(得分:1)

如果要打印HTML,则应先使用HTML Purifier进行清理。可以将其视为strip_tags()的高级(和可自定义)版本。

为了插入数据库,我使用prepared statements。这是万无一失的。