PDA

View Full Version : سوال: برای ذخیره اطلاعات با امنیت بالا باید چه چیزایی رو رعایت کرد؟



tehro0n
دوشنبه 11 مرداد 1389, 22:49 عصر
من چنین فرمی را ایجاد کردم
که بازدید کننده می تونه تبادل لینک هوشمند داشته باشه، اما بعضی ها کمی کرم میریزند و نمی دونم چیا می زنند که اسکریپت آگهی هایی که ثبت شده نمایش داده نمیشه یا قاطی می کنه
مثلا یک چیز جالب این بود که در متن آگهی خود اسکریپت رو گذاشته بود و موجب تو در تو شدن آگهی ها شده بود!
وقتی می خوام چنین فرمی رو طراحی کنم و بازدیدکننده اطلاعات خودشو ثبت کنه چه چیزایی رو رعایت کنم؟

راستی یه کار دیگه هم هست، وقتی دکمه ثبت زده میشه می خوام وقتی اطلاعات در SQL ثبت شد بزنه اطلاعات با موفقیت ثبت شد.. چون چنین کاری رو نمی دونستم اسکریپتی طراحی کردم که وقتی دکمه ثبت رو می زنه چه ثبت بشه چه مشکل داشته باشه می گه با موفقیت ثبت شد

اینم

<?php

require_once ("_config.php");

$con = mysql_connect ( MYSQL_HOST, MYSQL_USER, MYSQL_PASS );
mysql_select_db ( MYSQL_DB, $con );

if (! $con) {
printf ( "Connect failed: %s\n", mysql_error () );
exit ();
}

$_HOST = $_POST["site"];
$_subject = $_POST["subject"];
$_comment = $_POST["comment"];

if(strlen($_HOST) <> 0){
$res = mysql_query("SELECT `s_id` FROM `sites` WHERE `site` LIKE '{$_HOST}'", $con);
if(mysql_num_rows($res)!==1){
// we have this site yet, so lets add it
$_flag = 1;
mysql_query("INSERT INTO `sites` (`site`, `flag`, `subject`, `comment`, `ip`) VALUES ('{$_HOST}', '{$_flag}', '{$_subject}', '{$_comment}', '{$_SERVER['REMOTE_ADDR']}')", $con);
}
}
?>
<html dir="rtl" lang="fa">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<link href="style.css" rel="stylesheet" type="text/css">

<script type="text/javascript">
function ismaxlength(obj){
var mlength=obj.getAttribute? parseInt(obj.getAttribute("maxlength")) : ""
if (obj.getAttribute && obj.value.length>mlength)
obj.value=obj.value.substring(0,mlength)
}
</script>

<SCRIPT LANGUAGE="JavaScript">
function checkSite(myForm) {

if (!(/^\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(myForm.site.value))){
document.getElementById('msgdiv').innerHTML='<b>'+'سایت وارد شده معتبر نمی باشد'+'</b>';
myForm.site.focus();
return (false);
}

if(myForm.subject.value==""){
document.getElementById('msgdiv').innerHTML='<b>'+'لطفاً عنوان پيام را وارد كنيد'+'</b>';
myForm.subject.focus();
return (false);
}

if(myForm.comment.value==""){
document.getElementById('msgdiv').innerHTML='<b>'+'لطفاً متن پيام را وارد كنيد'+'</b>';
myForm.comment.focus();
return (false);
}

document.getElementById('msgdiv').innerHTML='<b>'+'* کد زیر را در قالب سایت خود کپی کنید'+'</b>';
return (true);
}

function clrmsg(){
document.getElementById('msgdiv').innerHTML='';
}
// End -->
</script>
</head>

<body bgcolor="#f4e4f4" onload="document.getElementById('formcheck').name.focus();" >
<form onreset="clrmsg()" name="formcheck" target="msgframe" action="http://link.-----------/add.php" method="post" onsubmit="return checkSite(this)">
<fieldset class="repeat">
<legend >تبادل لینک</legend>

<span class="oneField">
<font color="red">*</font> <label for="site" class="preField">آدرس سایت</label>
<input dir="ltr" type="text" maxlength="32" name="site" onkeyup="output.value='<!-- Begin Tools.----------- link code -->\n<script type=text/javascript language=javascript src=http://link.-----------/link.php?site='+ site.value +'&total=3></script>\n<!-- End Tools.----------- link code -->';">.www
</span>

<span class="oneField">
<font color="red">*</font> <label for="subject" class="preField">عنوان</label>
<input type="text" maxlength="20" name="subject" class="required">
</span>

<span class="oneField">
<font color="red">*</font> <label for="comment" class="preField">متن</label>
<textarea maxlength="140" onkeyup="return ismaxlength(this)" name="comment" class="required"></textarea>
</span>
</fieldset>

<div class="actions">
<input type="submit" class="primaryAction" name="submit" value=" ارسال ">
<input type="reset" class="secondaryAction" name="reset" value=" پاك كردن ">
</div>

<div class="errMsg" id="msgdiv" name="msgdiv"></div>
<div><textarea name="output" onmouseup=this.select() style="width:300px; height:70px; font-size:11px;" readonly></textarea></div>
</form>

<iframe name="msgframe" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>

</body>
</html>

tehro0n
سه شنبه 12 مرداد 1389, 11:59 صبح
یعنی هیچ برنامه نویسی در هیچ سایتی این سئوالات منو نمی تونه جواب بده :((

eshpilen
سه شنبه 12 مرداد 1389, 12:50 عصر
اینطور سوالات درحد جزییات کدنویسی هست که معمولا کسی وقت و انرژی و انگیزهء خوندن کدهای موردی دیگران و اصلاح و ارائه راهکار رو (که اونم خودش کلی کار بیشتر میبره) نداره.
ولی فکر میکنم اشاره به تابع htmlspecialchars مفید باشه. این تابع از تفسیر کاراکترهایی که در HTML کاربرد ویژه دارن جلوگیری میکنه. هر زمان ورودی کاربر رو میخواید در صفحه ای نمایش بدید، مثلا بعنوان کامنت و غیره، باید اول ورودی کاربر رو از این تابع بگذرونید تا همش بصورت متن ساده تفسیر بشه (کاراکترهای کنترلی HTML رو با معادلهای متنی اونا جایگزین میکنه).

tehro0n
سه شنبه 12 مرداد 1389, 19:08 عصر
اینطور سوالات درحد جزییات کدنویسی هست که معمولا کسی وقت و انرژی و انگیزهء خوندن کدهای موردی دیگران و اصلاح و ارائه راهکار رو (که اونم خودش کلی کار بیشتر میبره) نداره.
ولی فکر میکنم اشاره به تابع htmlspecialchars مفید باشه. این تابع از تفسیر کاراکترهایی که در HTML کاربرد ویژه دارن جلوگیری میکنه. هر زمان ورودی کاربر رو میخواید در صفحه ای نمایش بدید، مثلا بعنوان کامنت و غیره، باید اول ورودی کاربر رو از این تابع بگذرونید تا همش بصورت متن ساده تفسیر بشه (کاراکترهای کنترلی HTML رو با معادلهای متنی اونا جایگزین میکنه).

خوب یعنی این سایت برای افرادی که همه چیز می دونن طراحی شده!
این تابع ساده رو خوب کمی توضیح می دادی!
مثلا کامنت رو به عنوان مثال از این تابع رد می کردی که بفهمم چی گفتی!

AbiriAmir
سه شنبه 12 مرداد 1389, 21:27 عصر
خب من سیستم سایت شما رو نمیدونم اما با این تفاسیر کاربر هم کرمی که میخواد بریزه (البته ببخشیدا) باید تو فیلد comment بریزه
به خاطر همین هم شما باید محتوای این فیلد رو فیلتر کنید
البته اگر فکر میکنید اینطور نیست یکم بیشتر راجع به سیستمتون توضیح بدین

tehro0n
چهارشنبه 13 مرداد 1389, 00:22 صبح
اینجوریه؟


<?php
function escape($_comment)
{
$search=array("\\","\0","\n","\r","\x1a","'",'"');
$replace=array("\\\\","\\0","\\n","\\r","\Z","\'",'\"');
return str_replace($search,$replace,$_comment);
}
?>

یا مثلا این رو همین جوری بذارم قاطی کدا؟


$_GET = array_map('trim', $_GET);
$_POST = array_map('trim', $_POST);
$_COOKIE = array_map('trim', $_COOKIE);
$_REQUEST = array_map('trim', $_REQUEST);
if(get_magic_quotes_gpc()):
$_GET = array_map('stripslashes', $_GET);
$_POST = array_map('stripslashes', $_POST);
$_COOKIE = array_map('stripslashes', $_COOKIE);
$_REQUEST = array_map('stripslashes', $_REQUEST);
endif;
$_GET = array_map('mysql_real_escape_string', $_GET);
$_POST = array_map('mysql_real_escape_string', $_POST);
$_COOKIE = array_map('mysql_real_escape_string', $_COOKIE);
$_REQUEST = array_map('mysql_real_escape_string', $_REQUEST);

یا اینم باشه..


<?php
$new = htmlspecialchars("<a href='test'>Test</a>", ENT_QUOTES);
echo $new; // &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>



آخر سر بخوام مثلا برای کامنت یک مسیر امن ایجاد کنم چیو بزنم؟
لطفا یک راه کامل رو مثال بزنید..

eshpilen
چهارشنبه 13 مرداد 1389, 09:21 صبح
من دقیق حضور ذهن ندارم، اما فکر کنم همون قطعه کد آخری کافی باشه.
فکر میکنم باید اینطور عمل کنی:

htmlspecialchars($var, ENT_QUOTES)مطلب آخر این صفحه هم اطلاعات خوبی داده درمورد روشهایی که جاهای مختلف باید بکار ببریم:
http://stackoverflow.com/questions/526438/do-you-only-run-htmlspecialchars-on-output-or-is-there-other-functionality-you
در هر جایی داستان متفاوت هست؛ یه زمانی میخوای ورودی کاربر رو در دیتابیس درج کنی یک تابع و روش داره، میخوای در جاوااسکریپت درج کنی یک روش دیگه داره، میخوای در HTML درج کنی همین روش که دیدی و غیره.

tehro0n
چهارشنبه 13 مرداد 1389, 11:25 صبح
من دقیق حضور ذهن ندارم، اما فکر کنم همون قطعه کد آخری کافی باشه.
فکر میکنم باید اینطور عمل کنی:

htmlspecialchars($var, ENT_QUOTES)مطلب آخر این صفحه هم اطلاعات خوبی داده درمورد روشهایی که جاهای مختلف باید بکار ببریم:
http://stackoverflow.com/questions/526438/do-you-only-run-htmlspecialchars-on-output-or-is-there-other-functionality-you
در هر جایی داستان متفاوت هست؛ یه زمانی میخوای ورودی کاربر رو در دیتابیس درج کنی یک تابع و روش داره، میخوای در جاوااسکریپت درج کنی یک روش دیگه داره، میخوای در HTML درج کنی همین روش که دیدی و غیره.

خوب من که در ابتدای این تاپیک زدم که فرمی دارم و می خوام اسم سایت، موضوع و متن سایت رو در دیتابیس درج کنم!

از این خوشم اومده احساس می کنم روش دستیه :دی یعنی هر چیزی که نمی خوام وارد بشه رو تو متن نگاه می اندازه و پاک می کنه.. این روش برای کار من خوبه؟
آخه به نظر می رسه htmlspecialchars فقط برای اسکریپت باشه و این جور علامت هارو کاری نمی کنه!

<?php
function escape($_comment)
{
$search=array("\\","\0","\n","\r","\x1a","'",'"');
$replace=array("\\\\","\\0","\\n","\\r","\Z","\'",'\"');
return str_replace($search,$replace,$_comment);
}
?>

eshpilen
چهارشنبه 13 مرداد 1389, 19:40 عصر
برای درج هرچیزی در دیتابیس که از mysql_real_escape_string استفاده میکنیم.
یه تابعی مثل این میخواد:

function quote_smart($value, $identifier=false)
{

if(!is_numeric($value)) {
if(get_magic_quotes_gpc()) $value = stripslashes($value);
if(!$identifier) return "'" .mysql_real_escape_string($value) . "'";
else if(strpos($value, '`')===false) return '`' .$value . '`';
else {
$this->error("Value contains invalid character (backtick - '`') for identifiers");
return false;
}
}
else return $value;

}برای درج در HTML هم همون htmlspecialchars() (file:///E:/misc/php_manual_en/html/function.htmlspecialchars.html) کافیه بنظرم.

درصورتیکه وقتی میخوایم ورودی کاربر رو در هر جایی درج کنیم از روش مناسب و استاندارد برای escape کردنش استفاده کنیم، فکر نمیکنم مشکلی باشه. تمام کاراکترهای خطرناک توسط این توابع escape میشن. پس فکر نمیکنم نیازی باشه شما دستی کاری رو قبل یا بعد از این توابع انجام بدی.
اگر بعضی کاراکترهای رو حذف میکردی یه چیزی، اما شما داری کار همین توابع رو دستی انجام میدی که این موجب افزایش احتمال ایجاد باگهای فنی و باگهای امنیتی میشه.
یه مثال میزنم.
فرض کن در نسخهء بعدی از MySQL، یک کاراکتر دیگر هم معنای خاص پیدا کرد و خطرناک شد، در اینصورت برنامهء شما اون کاراکتر رو نمیشناسه و escape نمیکنه و شما هم که روحت خبر نداره، ولی وقتی از mysql_real_escape_string استفاده کرده باشی همه چیز و آپگرید بصورت خودکار انجام میشه، بخصوص که این تابع در خود MySQL اجرا میشه.
شما همیشه باید حتی الامکان از روشها و توابع استاندارد استفاده کنید. اگر میخواید خودتون هم تابعی بکار ببرید باید توجیه منطقی ای داشته باشه (مثلا یکسری کاراکترها یا متون خاص رو به علتهای دیگری نمیخواید اجازه بدید) و تابع شما جایگزین توابع و روشهای استاندارد نباشه و بعد از بکار بردن تابع خودتون، تابع و روشهای استاندارد رو هم اعمال کنید.
\r و \n هم در HTML هیچ خطری ندارن و بجاشون یک فاصله درج میشه.
\0 هم فکر میکنم نادیده گرفته میشه.
کاراکترهای دیگه رو هم که توابع مورد نظر تبدیل میکنن.
حالا چه مشکلی درکار هست؟
نیاز به چه کار دیگری روی ورودی کاربر دارید و چرا؟