2011-02-28 79 views
2

我是新手,只是要清楚。我听到很多关于逃避数据以防止XSS攻击的信息。我该如何做到这一点?如何在PHP中跳出输出

这是我在做什么现在 -

$s = mysqli_real_escape_string($connect,$_POST['name'])); 

难道这还不够?谢谢

+0

你需要告诉我们你在处理数据。你是否将其插入数据库?或者在网站上输出它?您对数据所做的每件事都需要不同形式的卫生设施。 – 2011-02-28 11:47:17

+0

@pekoe都....在一个文件中,我接受并插入...其他...我输出。 – Chrism 2011-02-28 11:47:57

+0

现在考虑我要在数据库中插入$ s。它足够安全吗? – Chrism 2011-02-28 11:49:55

回答

6

如果你将数据输出到HTML中,应该使用用htmlspecialchars() 否则,如果你存储在数据库中的数据,你应该使用mysqli_real_escape_string()逃脱投下数(或使用预准备语句对于两者) 并且通过基于白名单的过滤来保护标识符/操作符。

如果以正确的方式使用它们,这两种方法都是您所需要的。

+0

编辑您的答案,使其有帮助 – 2011-02-28 11:56:46

0

如果您刚刚开始修复您的代码以抵御攻击(意思是SQL注入攻击),那么您将更好地检出参数化查询。你基本上做的是将你的内容(输入)与命令(sql)分开,所以你不能让它们被一个可能的用户输入的信息(比如名字)混淆。

您可以尝试开始使用PDO类: 你可以从这里开始阅读PDO手册:http://php.net/manual/en/book.pdo.php而这个页面有一个很好的例子:http://php.net/manual/en/pdo.prepared-statements.php

<?php 
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); 
$stmt->bindParam(':name', $name); 
$stmt->bindParam(':value', $value); 

// insert one row 
$name = 'one'; 
$value = 1; 
$stmt->execute(); 

// insert another row with different values 
$name = 'two'; 
$value = 2; 
$stmt->execute(); 
?> 

不过,你不需要使用PDO,您可以使用mysqli也看到http://php.net/manual/en/mysqli.prepare.php

<?php 
/* Script A -- We are already connected to the database */ 

$stmt = mysqli_prepare($link, "INSERT INTO table VALUES (?, ?, 100)"); /* Query 1 */ 
mysqli_stmt_bind_param($stmt, "si", $string, $integer); 
mysqli_stmt_execute($stmt); 
mysqli_stmt_close($stmt); // CLOSE $stmt 
?> 

因为名字是一个单独的值,我t永远不会是一个SQL命令,所以你会自动安全的。

+0

我该怎么做?对不起,很愚蠢。 – Chrism 2011-02-28 11:47:02

+0

为你增加了一个例子和一些链接:) – Nanne 2011-02-28 11:49:28

+0

这可以防止SQL注入攻击,而不是XSS攻击。 – geoffspear 2011-02-28 11:50:31

3

您应该使用htmlspecialchars的输出,而不是mysqli_real_escape_string

+0

按输出,你的意思是回声? – Chrism 2011-02-28 11:48:49

+0

@Chrism通过输出他的意思是**你要求的输出**。检查您的问题标题以提醒。 – 2011-02-28 11:54:44

+0

在这种情况下,输出意味着“以HTML格式输入到HTML文档中的东西”(而不是JavaScript)。不管你使用echo,print,'<?='还是别的东西。 – Quentin 2011-02-28 11:55:00