سؤال

حسنًا ، حاولت وفشلت ، هنا أنا مرة أخرى.

أحتاج إلى مطابقة نمط مسار القيمة المطلقة الخاص بي.

 /public_html/mystuff/10000001/001/10/01.cnt

أنا في وضع taint وما إلى ذلك ..

#!/usr/bin/perl -Tw
use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
$ENV{PATH} = "bin:/usr/bin";
delete ($ENV{qw(IFS CDPATH BASH_ENV ENV)});

أحتاج إلى فتح نفس الملف عدة مرات أو أكثر ، وتجبرني Taint على إلغاء اسم الملف في كل مرة. على الرغم من أنني قد أفعل شيئًا آخر خاطئًا ، إلا أنني ما زلت بحاجة إلى مساعدة في بناء هذا النمط للرجوع إليه في المستقبل.

my $file = "$var[5]";
if ($file =~ /(\w{1}[\w-\/]*)/) {
$under = "/$1\.cnt";
} else {
ErroR();
}

يمكنك أن ترى من خلال محاولتي المبتدئين أنني قريب من الجاهل.

اضطررت إلى إضافة الملاذ الأمامي والتمديد إلى $1 بسبب بلدي سيئة البناء ، ولكن العمل ، regex.

لذا ، أحتاج إلى مساعدة في تعلم كيفية إصلاح تعبيري لذلك $1 يمثل /public_html/mystuff/10000001/001/10/01.cnt

هل يمكن لأي شخص أن يمسك يدي هنا ويريني كيفية صنعه:

$file =~ /(\w{1}[\w-\/]*)/ تطابق طريقي المطلق /public_html/mystuff/10000001/001/10/01.cnt ?

شكرا على أي مساعدة.

هل كانت مفيدة؟

المحلول

تعديل: استخدام $ في النمط (كما فعلت من قبل) لا ينصح هنا لأنه يمكن أن يتطابق \n في نهاية اسم الملف. يستخدم \z بدلاً من ذلك لأنه يطابق نهاية السلسلة بشكل لا لبس فيه.

كن محددًا قدر الإمكان في ما تتوافق معه:

my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';

if ( $fn =~ m!
    ^(
        /public_html
        /mystuff
        /[0-9]{8}
        /[0-9]{3}
        /[0-9]{2}
        /[0-9]{2}\.cnt
     )\z!x ) {
     print $1, "\n";
 }

بدلاً من ذلك ، يمكنك تقليل المساحة الرأسية التي يتم الاستيلاء عليها بواسطة الكود عن طريق وضع ما أفترض أنه بادئة شائعة '/public_html/mystuff' في متغير وجمع بين المكونات المختلفة في أ qr// بناء (انظر بيرلوك بيرلوب) ثم استخدم المشغل الشرطي ?::

#!/usr/bin/perl

use strict;
use warnings;

my $fn = '/public_html/mystuff/10000001/001/10/01.cnt';
my $prefix = '/public_html/mystuff';
my $re = qr!^($prefix/[0-9]{8}/[0-9]{3}/[0-9]{2}/[0-9]{2}\.cnt)\z!;

$fn = $fn =~ $re ? $1 : undef;

die "Filename did not match the requirements" unless defined $fn;
print $fn, "\n";

أيضا ، لا يمكنني التوفيق بين استخدام مسار نسبي كما تفعل في

$ENV{PATH} = "bin:/usr/bin";

مع استخدام وضع taint. هل تعني

$ENV{PATH} = "/bin:/usr/bin";

نصائح أخرى

تتحدث عن فك مسار الملف في كل مرة. ربما هذا لأنك لا تقسيم خطوات البرنامج.

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

لذلك ، عندما تحصل على البيانات ، قم بإلغاء كل شيء وتخزين القيم في بنية بيانات جديدة. لا تستخدم البيانات الأصلية أو وظائف CGI بعد ذلك. وحدة CGI موجودة فقط لتسليم البيانات إلى البرنامج. بعد ذلك ، يجب أن يعرف بقية البرنامج أقل قدر ممكن عن CGI.

لا أعرف ما تفعله ، لكن دائمًا ما تكون رائحة تصميم لاتخاذ أسماء الملفات الفعلية كمدخلات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top