2011-07-28 49 views
11

我特林让我的PHP尽可能的安全,而我试图避免两个主要的事情是一个PHP函数来防止SQL注入和XSS

  • MySQL的注射
  • 跨端脚本(XSS)

这是我对MySQL的注射脚本:

function make_safe($variable) { 
$variable = mysql_real_escape_string(trim($variable)); 
return $variable; } 

http://www.addedbytes.com/writing-secure-php/writing-secure-php-1/


反对XSS,我发现这一点:

$username = strip_tags($_POST['username']); 

现在我想两个凝聚成一个单一的功能。这是否是最好的方式? :

function make_safe($variable) { 
$variable = strip_tags(mysql_real_escape_string(trim($variable))); 
return $variable; } 

抑或是mysql_real_escape_string已经防止XSS?最后,还有什么我可以添加到此功能,以防止其他形式的黑客?

+3

没有魔杖,只是时刻保持警惕。 –

+3

你和[PDO](http://php.net/manual/en/book.pdo.php)应该成为朋友! – Jacob

+0

我真的不明白你们俩在说什么;) – LonelyWebCrawler

回答

11

mysql_real_escape_string()不会阻止XSS。它只会使SQL注入变得不可能。

要与XSS战斗,您需要使用htmlspecialchars()strip_tags()。 1st会将特殊字符如<转换为&lt;,这些字符将显示为<,但不会执行。第二只是将所有标签剥离。

我不建议做特殊功能来做到这一点,或者甚至只有一个功能可以做到这一点,但是您所举的例子是可行的。我假设。

+0

为什么不是一个函数? – LonelyWebCrawler

+0

我不能只使用strip_tags(),使htmlspecialchars()多余? # – LonelyWebCrawler

+0

#1问题 - 什么都不适合。 #2问题 - 没错。 – daGrevis

13

此功能:

function make_safe($variable) 
{ 
    $variable = strip_tags(mysql_real_escape_string(trim($variable))); 
    return $variable; 
} 

都不行

SQL注入和XSS是两个不同的野兽。因为它们每个都需要不同的转义,所以需要分别使用每个转义函数strip_tagsmysql_real_escape_string
加入他们将击败每个人的安全。在将数据输入数据库时​​使用标准mysql_real_escape_string()
使用strip_tags()在将数据输出到屏幕之前将数据从数据库中查询出来。

为什么两者结合功能是很危险的
从马口:http://php.net/manual/en/function.strip-tags.php

因为用strip_tags()并不真正验证HTML,部分或破损的标签可能会导致删除的详细文本/数据超出预期。

因此,通过向数据库字段中输入格式错误的html,智能攻击者可以使用您的天真实施来击败组合中的mysql_real_escape_string()

+0

所以我在将数据添加到数据库时使用mysql_real_escape_string(),而不是在比较用户输入和数据库条目时(比如在登录时)? – LonelyWebCrawler

+0

@user,你可以在每个查询中使用'mysql_real_escape_string()** ** always **,不管它是否选择,更新删除或插入。 – Johan

2

您真正应该关注的是使用prepared statementsPDO来为您的数据库提供一个抽象层以及完全根除SQL注入攻击。

至于XSS,请确保永远不要信任用户输入。当您存储数据或输出数据时(不是两者都会因为这会混淆输出)而运行strip_tagshtmlentities,并且您会一切正常。

+0

我从来没有听说过PDO。那是什么? – LonelyWebCrawler

+0

PDO是PHP附带的数据库抽象层。看看这里的介绍:http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/ –