@yossiz כתב בSSE בנטפרי:
@איש-נחמד האם אתה יודע איך פתרו? כי אם פשוט החריגו את האתר שלך מסינון זה לא יעזור לאחרים
אאל"ט גם בפרוטוקול wss הם מאשרים כתובות רק לפי רשימה לבנה
@yossiz כתב בSSE בנטפרי:
@איש-נחמד האם אתה יודע איך פתרו? כי אם פשוט החריגו את האתר שלך מסינון זה לא יעזור לאחרים
אאל"ט גם בפרוטוקול wss הם מאשרים כתובות רק לפי רשימה לבנה
@חגי כתב בSSE בנטפרי:
@איש-נחמד תפנו לנטפרי, אולי כבר יש להם פתרון לזה.
יש"כ, פניתי אליהם ופתרו את הבעיה
בניתי בשרת לוקלי יישום שמקבל אירועים מקובץ PHP באמצעות SSE והוא עובד מצוין - כל אירוע נשלח בעיתו ובזמנו עד לסגירה יזומה בצד לקוח.
אבל כשהעליתי את היישום לאתר שלי גיליתי שבגלישה מנטפרי הדפדפן לא מחזיר את האירועים מהשרת עד שהשרת לא מסיים את סוף הפלט. בגלישה מסינון אחר הבעיה לא קיימת.
האם הבעיה היא בגלל הסינון של נטפרי שיושב 'בין' הדפדפן לשרת? והאם יש דרך לפתור את זה?
יצרתי סביבת עבודה עם הקוד הבא:
קובץ docker-compose.yml
:
version: '3.9'
services:
php:
build: .
restart: always
ports:
- 8000:80
volumes:
- ./myapp:/var/www/html/
links:
- db
networks:
- default
db:
image: 'mysql:latest'
container_name: db
restart: always
volumes:
- ./mysql:/var/lib/mysql
- ./dump:/docker-entrypoint-initdb.d
environment:
MYSQL_DATABASE: 'myDb'
MYSQL_USER: 'user'
MYSQL_PASSWORD: 'test'
MYSQL_ROOT_PASSWORD: 'test'
ports:
- '3306:3306'
networks:
- default
phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
links:
- db:db
restart: always
environment:
MYSQL_USER: 'user'
MYSQL_PASSWORD: 'test'
MYSQL_ROOT_PASSWORD: 'test'
ports:
- '5000:80'
קובץ dockerfile
:
FROM php:8.2-apache
RUN docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable mysqli
RUN a2enmod rewrite
# --- NETFREE CERT INTSALL ---
ADD https://netfree.link/dl/unix-ca.sh /home/netfree-unix-ca.sh
RUN cat /home/netfree-unix-ca.sh | sh
ENV NODE_EXTRA_CA_CERTS=/etc/ca-bundle.crt
ENV REQUESTS_CA_BUNDLE=/etc/ca-bundle.crt
ENV SSL_CERT_FILE=/etc/ca-bundle.crt
# --- END NETFREE CERT INTSALL ---
הרצתי את הפקודה docker-compose up -d
וקיבלתי סביבה עובדת
בניתי יישום והוא היה זמין בתוך הקונטיינר של apache
כעת, לאחר הפעלה מחדש של המחשב אני מגלה ששרת הקבצים של apache לא מזהה את הקבצים שנמצאים בתיקייה myapp
מה יכולה להיות הבעיה?
עריכה: ביצעתי הפעלה מחדש לתוכנה דרך היישום בווינדוס והבעיה נפתרה
אני מנסה לחפש את ה-image המתאים עבור הפרויקט שלי ב-hub ולא מוצא ידי ורגלי:
א. האם קיימת דרך כלשהי למיין את התוצאות לפי כמות ההורדות (בהנחה שזה אמור להעיד על אמינות גבוהה יותר) ?
ב. איך אפשר לוודא אמינות של מאגר ב-hub? והאם יש חשש למאגרים מזוהמים?
ג. במאגר של docker ב-github אני רואה 2 מאגרים מקבילים 8.2/bullseye/apache
ו-8.2/buster/apache
, האם אחד מהם יתאים להתקנה על ubuntu ?
ובקיצור: איך אני מוצא תמונה מוכנה ואמינה של שרת אפאצ'י עם PHP ו-MySQL ?
@dovid כתב במניעת מופע כפול של מחלקה:
לממש DI בPHP
בסופו של דבר העברתי את שלב אימות ה-recaptcha אל המחלקה שאחראית על יצירת ה-user, וכך אני יוצר מופע של user, בודק האם השאילתה הנוכחית מאומתת עם $_SESSION או recaptcha, ואם אחד משתי התנאים האלו נכון - יוצר מופע של db ומעביר אותו עם setter injection ל-user
עוד על יתרונות וחסרונות הסינגלטון במאמר בעברית:
https://codetime.co.il/singleton/
@dovid אני מעריך את התגובה המפורטת שלך
להלן מספר קישורים ב-stackoverflow
https://stackoverflow.com/a/138012
https://stackoverflow.com/a/1020384
שם תמצא עוד קישורים למכביר
@dovid כתב במניעת מופע כפול של מחלקה:
מה זה אומר מופע של DB?
חיבור למסד הנתונים
המחלקה של user צריכה להחזיר מידע על המשתמש מתוך מסד הנתונים
המחלקה של ה-API צריכה להחזיר מידע ממסד הנתונים וגם לכתוב אליו, אבל רק לאחר אימות גישה באמצעות בדיקה אם קיים session פעיל או אימות recaptcha (בצד שרת)
המחלקה של ה-API גם תרצה לבדוק את הרשאות המשתמש (משתמש, נציג, או מנהל) כדי לנהל את הגישה לפונקציות השונות
אלו 2 הפונקציות שמאמתות את הגישה לפונקציה במחלקה API:
private function check_permissions( User $user, string $action )
{
return isset( $this->allowed_actions_array[$action]['permissions'] ) && in_array( $this->user->role(), $this->allowed_actions_array[$action]['permissions'] );
}
private function access_auth( User $user, string $action )
{
if( !isset( $this->allowed_actions_array[$action]['auth'] ) ) $this->return_json( false, 'אירעה שגיאה בהגדרות הפעולה' );
$auth = $this->allowed_actions_array[$action]['auth'];
switch ( $auth ) {
case 'logged_in':
return $user->is_logged_in();
break;
case '':
if( !isset( $_GET['r'] ) ) return false;
else return $this->recaptcha_verification( $_GET['r'] );
break;
default:
return false;
break;
}
}
הפונקציה role
במחלקה User
יכולה אמנם לטעון את ההרשאה מתוך ה-session (ולחסוך את הקריאה הנוספת למסד הנתונים, שתיצור מופע נוסף של החיבור ל-DB), אבל האם זה מספיק מאובטח?
@Shloimy כתב במניעת מופע כפול של מחלקה:
@איש-נחמד לדעתי, singleton. לא מתעסק עם PHP אבל זה דוגמא אחת למימוש בשפה הנ"ל.
יש דרך אחרת? קראתי מאוד הרבה חומר נגד המבנה הזה, כל מי שמעז להציע את זה ב-stackoverflow מקבל מיד ביקורת שלילית
יש לי פרוייקט ב-PHP שבו יש מחלקה שמטפלת בבקשות API ומאפשרת גישה למסד הנתונים רק אם התקיימו אחד משני התנאים: אימות recaptcha או שקיים session פעיל (המשתמש כבר מחובר, משמע שכבר עבר אימות)
הבעיה שלי היא שבמקרה שבו האימות מתבצע דרך recaptcha אזי ברור שאני יצור מופע חדש של DB לאחר שלב האימות
אך במקרה שהמשתמש כבר מחובר זה אומר שה-class שיצר את מופע האובייקט של המשתמש כבר ניגש ל-DB ויצר כבר מופע אחד של המחלקה
מצד אחד לא הגיוני לגשת ל-DB דרך this->user->db
, אך גם לא מסתבר ליצור מופע נפרד של DB עבור ה-user ושני עבור ה-API
מה הפתרון?
<?php
$name = 'שם';
$subject = 'נושא';
$body = 'תוכן';
$filing = '1f_cM';
$recipient = 'A1234@GMAIL.COM';
function callGoogleAPI($url, $query){
if(!is_array($query))return false;
$ch = curl_init();
$url .= '?'.http_build_query($query);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
// Receive server response ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if($http_code != 200) return( ['status' => false, 'answer' => $http_code ] );
curl_close ($ch);
return( ['status' => true, 'answer' => $server_output] );
}
$url = 'https://script.google.com/macros/s/AKfycbwO5ZjANufUiWfAsijJhinMewr-Z1Blquzh4DtCawM1cjGDeHTaQio0gAGIU7WcKms5ww/exec';
$query = [
'name' => $name,
'subject' => $subject,
'body' => $body,
'filing' => $filing,
'recipient' => $recipient
];
$call_api = callGoogleAPI( $url, $query );
var_dump( $call_api, $call_api['answer'] );
@שמואל-ש כתב בבהרצת קישור בPHP ע"י file_get_contents עם תווים בעברית, התווים נהיים ג'יבריש:
להכניס את השורה האחרונה למשתנה?
האם ידוע לך מה עושות הפונקציות: urldecode
, var_dump
?
אם לא - אני ממליץ לך להיכנס לאתר הרשמי וללמוד: https://php.net
@שמואל-ש כתב בהעלאת קובץ לגוגל דרייב ע"י גוגל סקריפט:
@שמואל-ש הקוד הוא
function saveFile() { var url = "******"; var blob = UrlFetchApp.fetch(url).getBlob(); DriveApp.createFile('new.MP3', blob); }
נסה את זה:
function saveFile() {
var url = "******";
var blob = UrlFetchApp.fetch(url).getBlob();
DriveApp.createFile(blob).setName('new.MP3');
}
@שמואל-ש כתב בבהרצת קישור בPHP ע"י file_get_contents עם תווים בעברית, התווים נהיים ג'יבריש:
לכתוב ככה
מה האופציות הנוספות שיכולות להיות לדעתך?
@שמואל-ש כתב בבהרצת קישור בPHP ע"י file_get_contents עם תווים בעברית, התווים נהיים ג'יבריש:
@איש-נחמד חזר לי כבר מה שהוחזר באמת.
אבל עכשיו הטמעתי את זה בימות המשיח-קובץ PHP שקורא לגוגל סקריפט, אך בקריאה הוא משום מה מוסיף & בסוף, יש לך מושג למה?
וכן התווים עדיין בג'יבריש!
אני לא יכול לדעת מה הבעיה אם לא תביא את הפלט
נסה את זה:
var_dump( urldecode( $image ) );
@שמואל-ש כתב בבהרצת קישור בPHP ע"י file_get_contents עם תווים בעברית, התווים נהיים ג'יבריש:
כתבתי echo על $image וחזר לי איזשהוא כתובת
מה חזר לך?
@שמואל-ש כתב בבהרצת קישור בPHP ע"י file_get_contents עם תווים בעברית, התווים נהיים ג'יבריש:
@איש-נחמד זה להכניס בסוף הקובץ שלי-אחרי ההצהרה על המשתנים במקום הרצת הקישור?
ניסית לבדוק מה המשמעות של הפונקציות בהן עשיתי שימוש?
@שמואל-ש כתב בבהרצת קישור בPHP ע"י file_get_contents עם תווים בעברית, התווים נהיים ג'יבריש:
@איש-נחמד זה לPHP? איפה להכניס את זה? בנוסף/בקובץ אחר? ומה הפרמטר השני לשליחה?
זו דוגמא למימוש של curl ב-PHP, ממליץ לך לחפש מידע על הפונקציה הזו:
https://www.php.net/manual/en/ref.curl.php
כל השאר די מקביל לקוד המקורי שלך עם מבניות קצת שונה בסה"כ