2010-05-04 174 views
3

我想保护我的网站,所以我不容易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,因此当数据被输入到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脚本对我?何时有表格?

+0

我会建议适当的表单验证,而不是仅仅用户提供的数据。 – 2010-05-04 21:43:21

+0

适当的表单验证是什么意思? – ggfan 2010-05-05 02:08:41

+0

当我说适当的表单验证时,我主要想到了一些使用编程语言中构建的html表单抽象的web框架中的例子,那就是创建一个类来表示一个表单,它将知道它具有哪些字段以及如何验证它们,返回清理数据,打印出html等。在你的例子中,你可以使用正则表达式('\ w +')验证你的$ first_name,如果验证通过,你很确定你没有任何不安全的字符反斜杠等,否则你提出一个错误。 – 2010-05-05 13:18:25

回答

1

对于SQL注入,mysql_real_escape_string应该工作。 (要完全确定,你可以使用准备好的语句)

对于XSS,htmlspecialchars应该可以工作。 strip_tags可能不是那么安全,因为有人可以巧妙地排除他们的javascript。

+0

因此,任何用户可以输入数据的地方,我应该使用htmlspecialchars,如果我将数据插入dbc,我应该使用mysql_real_espace_string并准备语句? – ggfan 2010-05-04 20:28:55

+1

是的。 (real_escape_string或准备好的语句)你不(同时可能不应该)一次使用两者。 – 2010-05-04 20:29:50

+0

好的,谢谢!我看看准备好的陈述 – ggfan 2010-05-04 20:31:34

1

无论何时将用户提供的信息嵌入到HTML中,都应该使用htmlspecialchars。无论何时您将用户提供的信息嵌入到SQL中,都应该使用mysql_real_escape_string。遵守这些规则,你应该没问题。

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

此外,不要忘记检查magic quotes

2

检查数据是否为字符串是无用的:字符串正是您用于注入的内容。

real_escape_string是避免SQL注入的一种合理但不能保证的方式,因为转义例程有错误风险并且不能正确转义事件(事实上,以前存在错误)。正确的做法是使用parameterized queries - 这将数据从查询结构中分离出来,使注射成为不可能。但是,如果绝对不能使用参数化查询,则real_escape_string(打开连接时使用set_charset)是最好的选择。

您会希望在用户可以触摸的任何内容上使用htmlspecialchars,并且您希望在页面上显示时使用它。如果你想让用户格式化帖子或其他东西,那么你应该为他们提供一种格式化语言(BBCode)(并在之后转换BBCode 运行htmlspecialchars)。如果你需要存储纯HTML,你不想使用htmlspecialchars,但你想确保只有信任的人可以在那里写。例如,如果您正在编写博客,则可以在博客文章中允许使用纯HTML,因为只有博客编辑可以在其中编写内容。然而,你不想在评论中允许它,因为每个人都可以在那里写东西,这只会让它很容易做到像cross-site scripting这样的东西。

1

如果您要打印HTML,请先用HTML Purifier清理它。把它看作是strip_tags()的高级(可定制)版本。

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