2013-06-04 163 views
-2

我已经做了一个函数来处理CSS和XSS注入,但它仍然通过。如何防范XSS和CSS注入?

有人说下面给我,但我不知道这意味着什么:

在您sanitize_input功能,做一个用strip_tags剥离可能已经通过形式加入所有的HTML标签。在strip_tags上阅读php.net。

这里是我的代码:

private function sanitizeInput() { 
    foreach($_POST as &$post) { 
     $post = $this -> db -> real_escape_string($post); 
    } 
} 
+2

你是**不**在那里做任何消毒。你只是在做一些SQL上下文转义,它不会从根本上“修复”恶意数据。如果你不打算在SQL查询中使用这些数据,那么这样的转义也是毫无意义的。 –

+1

[伟大的逃避现实(或:你需要知道如何处理文本中的文本)](http://kunststube.net/escapism/) – deceze

+0

你用什么功能访问数据库? 你也应该有strip_tags函数:'$ post = strip_tags($ this-> db-> real_escape_string($ post));'如果你想删除标签。 –

回答

0

你的代码,使你的输入安全地插入到数据库中。但是,数据库的安全可能对HTML不安全。

通常情况下,您应该使用该函数来插入数据,稍后当您检索它时,通过诸如htmlspecialchars之类的东西运行它,然后输出它。但是,在保存数据之前不要这样做,只能在最终输出阶段进行。

1

你正在错误的地方做这项工作。要防止SQL注入,use prepared/parameterized queries with PDO。这从根本上分离了命令中的数据,使其免于一般的SQL注入问题。

您的XSS问题无疑是因为您在HTML上下文中使用任意数据而没有任何转义。在您的数据的输出,使用htmlspecialchars()。这会将所有特殊字符编码到适当的实体中。

+0

你的意思是像$ html value =“'。htmlentities(htmlspecialchars(stripcslashes($ _ POST ['userName']))。'”/>? ?? – LearningPhPbasics

+0

他的意思是使用PDO它是PHP访问mysql的驱动程序。有很多关于如何在他提供的链接中使用的例子。 – Ace

+0

@LearningPhPbasics,不!看到我的答案在这里:http://stackoverflow.com/a/7810880/362536你不能只是抛出一堆转义函数在一起,并期望一个有用的结果。只有当你需要它,并在正确的位置逃脱。不要尽早对HTML进行编码。切勿使用'stripslashes()'。不要同时使用'htmlentities()'和'htmlspecialchars()'!你正在把数据搞得一团糟。 – Brad

0

这取决于...您是否希望能够保存标签,但不能让它们在浏览器中呈现?如果是这样,请使用htmlentities。如果不是,请使用strip_tags。

也许:

private function sanitizeInput() { 
    foreach($_POST as $key => $val) { 
    $_POST[$key] = $this->db->real_escape_string(htmlentities($val, ENT_QUOTES)); 
    } 
} 

这真的取决于你要完成的任务。

上面的例子将转换:A 'quote' is <b>bold</b>A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;

这种解决方案,但是,是不理想的。在保存到数据库之前,您不应该转换数据。相反,您希望在从数据库中查询数据之后处理数据。

+0

哇谢谢你好我明白 – LearningPhPbasics