gpt4 book ai didi

php - 输入的是URL,如何防止xss

转载 作者:可可西里 更新时间:2023-11-01 13:44:23 26 4
gpt4 key购买 nike

我有一个接受 url 的表单文本字段。提交表单后,我使用适当的反 sql 注入(inject)将此字段插入到数据库中。我的问题是关于 xss。

这个输入字段是一个url,我需要在页面上再次显示它。我如何在进入数据库的途中保护它免受 xss 攻击(我认为不需要任何东西,因为我已经处理过 sql 注入(inject))和在离开数据库的途中?

假设我们是这样的,我正在简化它,请不要担心 sql 注入(inject)。之后我该去哪里?

$url = $_POST['url'];

谢谢

最佳答案

假设这将被放入 HTML 内容中(例如 <body></body> 之间或 <div></div> 之间),您需要对 5 个特殊的 XML 字符(&、<、> , ", '),并且 OWASP 建议也包括斜杠 (/)。PHP 内置 htmlentities() 将为您完成第一部分,一个简单的 str_replace() 可以完成斜杠:

function makeHTMLSafe($string) {
$string = htmlentities($string, ENT_QUOTES, 'UTF-8');
$string = str_replace('/', '&#x2F;', $string);
return $string;
}

但是,如果您要将受污染的值放入 HTML 属性中,例如 href= <a 的条款, 然后你需要编码一组不同的字符 ([space] % * + , -/; < => ^ 和 |)——你必须用双引号引用你的 HTML 属性:

function makeHTMLAttributeSafe($string) {
$scaryCharacters = array(32, 37, 42, 43, 44, 45, 47, 59, 60, 61, 62, 94, 124);
$translationTable = array();
foreach ($scaryCharacters as $num) {
$hex = str_pad(dechex($num), 2, '0', STR_PAD_LEFT);
$translationTable[chr($num)] = '&#x' . $hex . ';';
}

$string = strtr($string, $translationTable);
return $string;
}

最后一个问题是非法的 UTF-8 字符——当传送到某些浏览器时,格式错误的 UTF-8 字节序列可能会脱离 HTML 实体。为了防止这种情况,只需确保您获得的所有 UTF-8 字符都是有效的:

function assertValidUTF8($string) {
if (strlen($string) AND !preg_match('/^.{1}/us', $string)) {
die;
}

return $string;
}

u该正则表达式上的修饰符使其成为 Unicode 匹配正则表达式。通过匹配单个字符,. ,我们确信整个字符串都是有效的 Unicode。

由于这完全取决于上下文,因此最好在尽可能晚的时间进行任何此类编码——就在将输出呈现给用户之前。进行这种练习还可以很容易地看到您错过的任何地方。

OWASP提供了大量有关其 XSS prevention cheat sheet 的信息.

关于php - 输入的是URL,如何防止xss,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1699231/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com