我有以下php代码:
<?php $redirect_lp = $_GET['lp']; ?>
<script>
setTimeout(function(){
window.location.href = "<?php echo $redirect_lp; ?>";
}, 10)
</script>
如何清理$redirect_lp
?
我知道这个代码很糟糕,因为这次攻击:
http://example.com/index.php?lp= “ - 警报(” XSS \ n \ n “个%2bdocument.domain) - ”
为了防止这种特殊的攻击,我对"
:
$redirect_lp = str_replace("\"", "", $redirect_lp);
这够了吗?
答案 0 :(得分:4)
首先从$redirect_lp
变量中删除所有非法字符,然后检查它是否是有效的网址:
<?php
$redirect_lp = $_GET['lp'];
// Remove all illegal characters from a url
$redirect_lp = filter_var($redirect_lp, FILTER_SANITIZE_URL);
?>
<?php if (filter_var($redirect_lp, FILTER_VALIDATE_URL)): ?>
<script>
setTimeout(function(){
window.location.href = "<?php echo $redirect_lp; ?>";
}, 10)
</script>
<?php endif; ?>
答案 1 :(得分:1)
有很多方法可以filter a string in PHP。这是清理URL
的唯一方法:
// Remove all illegal characters from a url
filter_var($redirect_lp, FILTER_SANITIZE_URL);
或者您可以在获得输入时过滤输入:
$redirect_lp = filter_input(INPUT_GET, 'lp', FILTER_SANITIZE_SPECIAL_CHARS);
答案 2 :(得分:0)
基本上,只要您想将某些内容输出到来自用户输入的浏览器,您就需要使用函数htmlspecialchars()
。
使用这样的东西的正确方法(足以防止XSS攻击):
echo htmlspecialchars($redirect_lp, ENT_QUOTES, 'UTF-8');
在此类卫生设施之后,您可以验证网址(filter_var()
并带有FILTER_VALIDATE_URL
标记)并允许进一步的步骤将用户重定向到指定页面,如果验证通过了当然。
PS:您也可以使用strip_tags()
,但请注意,它会删除标记,但不会删除"
或'
等特殊字符,因此如果您使用strip_tags()
你还必须使用htmlspecialchars()
。