HTML Purifier和preg_match / $ _ GET / $ _ POST / FILTER_VALIDATE_EMAIL-是否需要?

时间:2019-02-14 01:55:56

标签: php security xss htmlpurifier

我想问一下是否需要使用html净化器来避免XSS atack:

  1. 已经使用的preg_匹配,例如:

    $userid = $_POST["userid"]; if(!preg_match("/^[a-zA-Z0-9]{3,15}$/", $userid)){ alerts('INVALID')

alerts是带有开关大小写的功能,可以在URL警报中显示,例如...?alert = invalidid

  1. filter_var($email, FILTER_VALIDATE_EMAIL

  2. 我正在使用window.location.href.indexOf('alert') != -1),是否需要它以某种方式过滤警报值?

  3. 我还与$_GET['alert']一起使用,以比较URL中实际存在的警报以回显引导程序div class="alert-danger"。 我需要使用HTML净化器吗?感谢您的回答。在第3种情况下,我不知道该怎么做。

2 个答案:

答案 0 :(得分:0)

  1. 使用preg_match这样的验证是一项很好的安全措施,但是您之前的$userid = $_POST["userid"]行本身就很容易受到攻击。始终确保检查该值是否已设置且未设置null

    $userid = isset($_POST["userid"] && $POST_["userid"] !== null)

关于您的“ 警报功能,带有切换大小写的功能,可以在URL警报中显示,例如...?alert = invalidid ”,这完全取决于您“显示”的含义,但请注意,用户输入回用户的信息是XSS的主要载体。如果要以HTML内容,HTML属性或JavaScript数据值“显示”它,这是不安全的,那么您只需对以下内容进行编码:

 & --> &
 < --> &lt;
 > --> &gt;
 " --> &quot;
 ' --> &#x27;     &apos; not recommended because its not in the HTML spec (See: section 24.4.1) &apos; is in the XML and XHTML specs.
 / --> &#x2F;     forward slash is included as it helps end an HTML entity
  1. 这取决于您使用的PHP版本。假设您已经高于PHP 5.2.1(肯定已经支持,因为不再受支持),FILTER_VALIDATE_EMAIL是对电子邮件地址的很好验证。如果您使用的是PHP 5.2.1或更低版本,则为vulnerable

  2. 我不确定为什么。 alert绝对不是XSS的唯一JavaScript方法。采取, 例如console.log

  3. $_GET['alert']在回显到页面时很容易受到XSS的攻击,但是通过上面列出的六种转换,将不再可能。

使用类似HTML Purifier的方法总是一个好主意。即使您已经完全针对XSS进行了加固,也可以防止自己遭受潜在的未来 XSS漏洞。

我还建议您阅读有关防止XSS的official OWASP guide

答案 1 :(得分:0)

在尝试将这些值提交到表之前,我会为每个验证设置一个标志〜我假设您要提交这些值:) 使用php激活的弹出窗口,并允许用户使用jquery js关闭弹出窗口。如果有人禁用js并试图弄乱它,只是不会插入或更新,但是告诉他们做错了什么的窗口仍然存在,那么他们将无法关闭它。

<?php
$userid = "";
if (isset($_POST['userid'])) {
$userid = $_POST["userid"];

if (!preg_match("/^[a-zA-Z0-9]{3,15}$/", $userid)) {
$flag = "user id error";
echo "
<div id='user-id-alert'>$flag
<input type='button' value='X' onclick='closePopup()' class='button-close' />
</div>
";
}
}

echo "
<script>
function closePopup() {
var elem = document.getElementById('#user-id-alert');
$('#user-id-alert').hide(200);
return false;
}
</script>
";

?>

我在警报窗口中添加了一个ID,在关闭按钮中添加了一个类,但是没有提供CSS,因为它超出了您的请求范围。