سؤال

ولدي rootPath أنني على ثقة وrelativePath أنني لا. أريد أن الجمع بينهما في مثل هذه الطريقة التي يمكنني التأكد من أن النتيجة هي تحت rootPath والتي لا يمكن للمستخدم استخدام .. أن نعود الماضي نقطة البداية. I <م> لا تريد المسار النسبي للسماح للأشياء مثل: hello\..\world == world

نصائح أخرى

هل يمكن أن مجرد دعوة Path.GetFullPath() ومعرفة ما اذا كان يبدأ مع rootPath الموثوق بها. إذا كنت تميل إلى جنون العظمة، وتحقق أيضا متجذر أن rootPath.

public Boolean IsPathSafe(String rootPath, String relativePath)
{
  return rootPath.EndsWith(Path.DirectorySeparatorChar.ToString()) &&
    Path.IsPathRooted(rootPath) &&
    Patch.Combine(rootPath, relativePath).GetFullPath().StartsWith(rootPath);
}

للحصول على شرح لأول اختبار نرى تعليق أليكس مارتيلي على الجواب technophile ل.

وشيء واحد يمكنك القيام به هو لحساب عدد من الخطوط المائلة العكسية (\) والنقاط المزدوجة (..)، وتأكد من أن عدد مزدوج النقاط أصغر من عدد من الخطوط المائلة العكسية. لكي تذهب فوق rootPath في بنية المجلد الخاص بك، ستحتاج على الأقل يصل الى الخطوط المائلة العكسية كنقاط مزدوجة - وبالتالي، إذا سمحت فقط relativePaths مع واحد على الأقل مائل، يجب أن تكون آمنة

.
scroll top