2013-05-25 42 views
0

我想从用户检查我的数据XSS和SQL注入,这是我怎样努力如何防止对XSS和SQL注入

if (isset($_GET['membernumber'])) 
{ 
    $mem = htmlentities($_GET['membernumber']); 
    $memberparamter = cleanData($mem); 

} 

但哪种方法是检查最好/正确的方法是什么?

方法1

function cleanData($data) 
    { 
     $data=mysql_real_escape_string($data); 
     $data=trim($data); 
     $data=stripcslashes($data); 
     $data=htmlspecialchars($data); 
     $data=strip_tags($data); 
     return $data; 
    } 

方法2

function cleanData($data) 
    { 
     $data=mysql_real_escape_string($data); 
     $data=trim($data); 
     $data=strip_tags($data); 
     return $data; 
    } 

方法3

htmlspecialchars(stripcslashes(trim($data))) 
+1

使用准备好的语句,它会照顾所有这些障碍 – Achrome

+0

应该membernumber是一个int?为什么不使用'intval($ _ GET ['membernumber'])'? – Ladadadada

+0

是的,它应该是一个int – Zaz

回答

3

如前所述,预准备语句是防止SQL注入的最佳方法之一。即,您不应将您的参数添加为最终查询字符串的一部分。您应该使用参数占位符,并通过键/值数组添加参数。

如果您使用PDO,看看这个页面,该页面将详细介绍预处理语句:

http://php.net/manual/en/pdo.prepared-statements.php

PHP的输入滤波器相当详尽的解释(和消毒的好文章)可以在这里找到:

http://coding.smashingmagazine.com/2011/01/11/keeping-web-users-safe-by-sanitizing-input-data/

入住这里PHP自己的过滤器/消毒功能:

http://www.php.net/manual/en/filter.filters.php

你是在filter_var和filter_input职能可能感兴趣的:

而且,这个问题有一些很好的指针: What's the best method for sanitizing user input with PHP?

这个问题也有很好的指针: What are the best PHP input sanitizing functions?

-2
XSS

$ 数据=用htmlspecialchars($数据); sql注入 $ data = stripcslashes($ data);

如果数据将被存储到数据库然后显示在网页上,你应该都是他们。

+0

不,不是'stripcslashes',而是使用准备好的语句。 –

+0

yeah.thanks Marcel – HuangJacky

1

如果你想防止SQL注入攻击使用预处理语句。当你做类似的事情时

SELECT * FROM TABLE WHERE id = $_GET['x'] 

这个查询的问题是变量被认为是SQL语句的一部分。这意味着DBMS将解析/编译和执行该变量以及查询的其余部分。如此有效,我可以提供类似于

$x = "1); DROP TABLE users;" 

并且由于它是语句的一部分,服务器将执行该命令。

当您引入准备好的语句时,变量作用域将被限制为参数的作用域,即使没有转义,也不会影响查询的其余部分。那是因为SQL语句被数据库解析/ optmised /编译等,你所要做的就是绑定这些参数。 sql语句是模板

SELECT * FROM TABLE WHERE id = ? 

使用预准备语句的附加优势是速度。由于模板已经被解析/编译等,数据库将不需要重复该过程,因此可以重复使用,您只需更换参数即可。

在PHP中,PDO和mysqli_ *函数都支持预处理语句。

对于mysqli的看到http://php.net/manual/en/mysqli.prepare.php 对于PDO看到http://php.net/manual/en/pdo.prepare.php

至于XSS攻击,你可以拿这几个方法。首先是在打印到页面时简单地转义任何用户输入。如此危险的字符,如:

<>"" // and so on 

将被替换为其对应的html实体。所以在<script>的情况下,它将被转换为&lt;script&gt;

您还可以设置白名单方式,只允许X标签进行用户输入。这对于内容导向的站点特别有用,在这些站点中用户可能需要访问特定的html标签,例如div,p标签等,但不包括脚本标签。任何不在白名单内的标签都会被过滤掉。这是很难完全覆盖的,因为有太多的做事方式,但它可以提供更高的安全性。有关更多信息,请参阅http://php.net/manual/en/function.filter-var.php

第三种方法是用自定义标签替代html标签(如SO)。因此,某个词的明星盈方可能代表<strong> html标记等等。

请注意,如果你确实占用了后两者,你应该仍然逃避数据。所有的用户输入数据应该被认为是潜在的危险,即使被过滤,因为他们说,总是有不止一种方式来剥皮猫。

+0

Thanx :)所以如果你必须防止xss和sql注入,你会怎么做。用户输入如数字类型。你能举一个例子吗? – Zaz

0

它们都不够有效。

你应该像你一样寻找消毒,并使用准备好的陈述。