Bienvenue visiteur !
|
Statistiques
Liste des membres
Contact
Mentions légales
453 connectés actuellement
30732736 visiteurs depuis l'ouverture
2715 visiteurs aujourd'hui
Partenaires
Tous nos partenaires
Devenir partenaire
|
❤ 0 Auteur : berka
Logiciel : RPG Maker XP & VX
Nombre de scripts : 1
Source : https://www.rpgmakervx-fr.com/t8487-support-mysql-pour-rgss
En cas de piratage, votre mot de passe sql est visible.
Bonjour à tous.
Certains me l'avaient demandé. Le voici enfin.
Ceux qui s'y connaissent auront directement compris l'utilité de ce script par le titre de ce sujet. Pour les autres, ce script permet d'établir une connexion à une base de donnée de type mysql directement depuis rpgmaker.
Vous allez pouvoir envoyer et recevoir des informations dans votre jeu et cela beaucoup plus rapidement que par des transferts de fichiers classiques.
Mais tout d'abord il faut savoir que ce script ne fonctionne pas pour tous les types d'hébergement mysql. Seuls les hébergements (payants) offrant une connexion SSH (connexion depuis un programme externe au serveur web) peuvent faire fonctionner ce script. Vous pouvez toutefois tester en local, via des logiciels comme wamp.
Sachez enfin qu'en cas de décryptage de votre jeu, les identifiants mysql seront lisibles en clair. Ne mettez aucunes données personnelles sur votre serveur. Mais là, ce n'est plus mon problème.
Ce script a besoin d'une dll pour fonctionner. La voici : Libmysql32.dll ou Libmysql64.dll (Archive Mediafire)
Voila le script à copier au dessus de main.
Vous avez des réglages à faire au début du script. Lisez bien tout. Enfin, je voudrais que vous me demandiez la permission avant de poster ce script sur un autre forum.
Version 1.0 (recommandée)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
| #======================================================================
# Net::Mysql
# 29-05-2010 www.rpgmakervx-fr.com Rgss1&2 v.1
# par berka
#--------------------------------------------------------------------------------------------------------------
# This script is free to use. Do not post anywhere without my permission. Credits needed.
#--------------------------------------------------------------------------------------------------------------
# Warning: if your game is cracked and decrypted, your mysql login will be available !
# Do not use with a database containing personal information.
# Your mysql host should accept external connections.
# Check with it for remote SSH access to your database.
#--------------------------------------------------------------------------------------------------------------
# This script allows interractions with a mysql database directly in the game
# It requires a file "libmysql.dll" in the game folder
#--------------------------------------------------------------------------------------------------------------
# Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles !
# Ne pas utiliser de base de donnée contenant des informations personnelles.
# Votre hébergeur Mysql doit accepter les connexions mysql externes.
# Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données.
#--------------------------------------------------------------------------------------------------------------------------
# Ce script permet d'interragir avec une base de données mysql directement via le jeu.
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu.
#--------------------------------------------------------------------------------------------------------------------------
# ● md5() support
# ● Mysql functions:
# - Net::Mysql.new([host,user,pass,base,port]) : return : mysql connection handle
# - @mysql.close : return : bool
# - @mysql.list_tables([filter]) : return : ["table1", "table2"]
# - @mysql.select_db(base_name) : return : true if the db exists or false
# - @mysql.query("query",ret=false) : return : if ret = true : rows else result handle
# - @mysql.get_fields([handle result]) : return : ["field1", "field2"]
# - @mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
# - @mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
# - @mysql.num_rows([handle result]) : return : integer
# ● Html functions:
# - "string".to_ruby : return : true, false, nil, Integer, Float, self, etc.
# - "<berka>".htmlspecialchars : return : "&lr;berka>"
# - "<berka>".urlencode : return : "%3Cberka%3E"
# - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------------------
# SQL queries samples
# ● "SELECT * FROM table"
# ● "INSERT INTO table (fields) VALUES (values)"
# ● "INSERT INTO table SET field = value WHERE field = value"
# ● "UPDATE table SET field = value WHERE field = value"
#--------------------------------------------------------------------------------------------------------------------------
# Sample :
# @mysql = Net::Mysql.new
# @mysql.query("SELECT * FROM `members`)
# res = @mysql.fetch_assoc
# => {:id=>["1","2"], :nom=>["berka","rgss"], :age=>["19",""]}
#======================================================================
module Berka
module Mysql
Host = "127.0.0.1" # mysql server(local : 127.0.0.1)
User = "" # mysql user
Pass = "" # mysql password
Base = "rgss" # base name
Port = 3306 # server port (default: 3306)
Err_Con = "Mysql:\nUnable to connect to the database"
Err_Req = "Mysql:\nUnable to send the query"
end
module Html
Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
end
end
class Numeric
def copymem(len)
# move memory to convert c structs to ruby objects
Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
end
end
class String
def to_ruby
# detect if the string is a md5 hash
return self if self=~/^[a-f0-9]{32}$/
# converts syntax of a string to ruby controls
eval(self)rescue self
end
def htmlspecialchars
# converts special chars to html compatibles chars (ASCII)
# REMOVE THE * !!!!
{"&"=>"&*amp;",'"'=>"&*quot;","'"=>"&*#039;","<"=>"&*lr;",">"=>"&*gt;"}.each_pair{|k,v|self.gsub!(k,v)}
self
end
def urlencode
# converts special char of url
o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Berka::Html::Spec_Char.include?(c);o << c};o
end
def urldecode
# converts encoded special char of url to normal chars
self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
end
end
module Net
class Mysql
MI=Win32API.new("libmysql.dll","mysql_init","l","l")
MC=Win32API.new("libmysql.dll","mysql_close","l","l")
MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
MSDB=Win32API.new("libmysql.dll","mysql_select_db","p","l")
attr_reader :handle
def initialize(h=Berka::Mysql::Host,u=Berka::Mysql::User,p=Berka::Mysql::Pass,b=Berka::Mysql::Base,po=Berka::Mysql::Port)
# @handle : handle of mysql initialization
@handle=MI.call(0)
# establishes the mysql connection
(print(Berka::Mysql::Err_Con))if MRC.call(@handle,h,u,p,b,po,nil,0)==0
# returns: handle
@handle
end
def close
# closes the current connection
MC.call(@handle)
end
def select_db(base)
# selects a current database
MSDB.call(base)==true
end
def list_tables(m="")
# lists tables request -> fetch the result -> to ruby string
l=MFR.call(MLT.call(@my,m)).copymem(1024)
# splits the string to array -> list of tables
l.scan(/\t(\w+)\0/).flatten
end
def query(req,ret=false)
# sends the query (msg error)
(return print(Berka::Mysql::Err_Req+req))if !MQ.call(@handle,req)
# previous results are released
MFRE.call(@result)if @result
# gets the results from the query -> c struct handle
@result=MSR.call(@handle)
ret ? get_rows(@result) : @result
end
# Proc: gets the name of the field (cstruct) -> to ruby string of handles -> to ruby string
# returns the fieldname or nil if the field is not found.
ReadField=Proc.new{|r,i,of|MFFD.call(r,i).copymem(1024).unpack("iissi")[0].copymem(of).delete!("\0")}
def get_fields(res=nil)
# if a result handle is provided
r=res.nil? ? @result : res
# gets the number of fields, offset: 8bytes-2 (cf. loop)
nf,ch,of=MFC.call(@handle),[],6
# each field: if the fieldname is not found: increase the offset of bytes.
nf.times{|i|a=ReadField.call(r,i,of+=2)until a
# add to the fields array
ch << a
# reinitialize the offset for the next iteration
of=6}
# returns an array of fields
ch
end
def get_rows(res=nil)
# if a result handle is provided
r=res.nil? ? @result : res
# nr: number of rows, nf: number of fields
nr,nf,en=MNR.call(r),MNF.call(r),[]
# each row:
nr.times{|i|
# gets each row: c struct -> to ruby string -> to array (handles)
c=MFR.call(r).copymem(4).unpack("i")[0]
# gets each field length: c struct -> to ruby string -> to array (handles)
tf=MFL.call(r).copymem(4*nf).unpack("i*")
# size of field: offset of each field
sf=tf.inject(0){|n,i|n+i}
# handle of row -> to string (offset) -> to array
en << c.copymem(sf+nf).split("\0")
}
# returns each row as an array
en
end
def num_rows(res=nil)
# if a result handle is provided
r=res.nil? ? @result : res
# returns: number of rows
MNR.call(r)
end
def fetch_assoc(to_ruby=false)
# gets rows and fields
h,f,r={},get_fields,get_rows
# each field: read the rows and store them to an hash : h[:field]=[rows]
# rows are converted to ruby objects if to_ruby == true
f.each_with_index{|fi,i|t=[];r.each{|l|t << l[i]};h[fi.to_sym]=(to_ruby ? t.map!{|o|o.to_ruby if o} : t)}
h
end
end
end |
Version 0.1 (archive)
Spoiler (cliquez pour afficher)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
| #======================================================================
# Net::Mysql
# 22-05-2010 www.rpgmakervx-fr.com Rgss2 v0.1
# par berka
#--------------------------------------------------------------------------------------------------------------------------
# Ce script est libre d'utilisation. Ne pas poster sans accord de l'auteur. Crédits requis.
#--------------------------------------------------------------------------------------------------------------------------
# Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles !
# Ne pas utiliser de base de donnée contenant des informations personnelles.
#
# Votre hébergeur Mysql doit accepter les connexions mysql externes.
# Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données.
#--------------------------------------------------------------------------------------------------------------------------
# Ce script permet d'interragir avec une base de données mysql directement via le jeu.
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu.
#--------------------------------------------------------------------------------------------------------------------------
# ● fonctions Mysql :
# - Net::Mysql.connect : return : mysql connection handle
# - Net::Mysql.close : return : bool
# - Net::Mysql.query("query") : return : query result handle
# - Net::Mysql.get_fields([handle result]) : return : ["field1", "field2"]
# - Net::Mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
# - Net::Mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
# - Net::Mysql.list_tables([filtre]) : return : ["table1", "table2"]
#
# ● fonctions Html:
# - "string".to_ruby : return : true, false, nil, Integer, Float, self
# - "<berka>".htmlspecialchars : return : "&lr;berka>"
# - "<berka>".urlencode : return : "%3Cberka%3E"
# - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------------------
# Exemples de requetes SQL
# ● "SELECT * FROM `table`"
# ● "INSERT INTO `table` (champs) VALUES (valeurs)"
# ● "INSERT INTO `table` SET champ = valeur WHERE champ = valeur"
# ● "UPDATE `table` SET champ = valeur WHERE champ = valeur"
#--------------------------------------------------------------------------------------------------------------------------
# Exemple d'utilisation:
# Net::Mysql.connect
# Net::Mysql.query("SELECT * FROM `membres`)
# res = Net::Mysql.fetch_assoc
# => {"id"=>["1","2"], "nom"=>["berka","rgss"], "age"=>["19",""]}
#======================================================================
module Berka
module Mysql
Host ="127.0.0.1" # serveur mysql (local : 127.0.01)
User ="root" # utilisateur mysql
Pass ="" # mot de passe mysql
Base ="test" # nom de la base
Port =3306 # port du serveur (par défaut: 3306)
Err_Con = "Mysql:\nImpossible de se connecter à la base"
Err_Req = "Mysql:\nLa requete n'a pu être envoyée."
end
module Html
Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
end
end
class Numeric
def copymem(len)
Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
end
end
class String
include Berka::Html
def to_ruby
eval(self) rescue self
end
def htmlspecialchars
{"&"=>"&",'"'=>""","'"=>"'","<"=>"&lr;",">"=>">"}.each_pair{|k,v|self.gsub!(k,v)}
self
end
def urlencode
o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Spec_Char.include?(c);o<<c};o
end
def urldecode
self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
end
end
module Net
module Mysql
MI=Win32API.new("libmysql.dll","mysql_init","l","l")
MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
MC=Win32API.new("libmysql.dll","mysql_close","","l")
MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
MFF=Win32API.new("libmysql.dll","mysql_fetch_field","p","l")
MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
module_function
include Berka::Mysql
def connect
@my=MI.call(0)
(print(Err_Con)) if MRC.call(@my,Host,User,Pass,Base,Port,nil,0)==0
@my
end
def close
MC.call(@my)
end
def list_tables(m="")
l=MFR.call(MLT.call(@my,m)).copymem(1024)
l.scan(/\t(\w+)\0/).flatten
end
def query(req)
(return print(Err_Req))if !MQ.call(@my,req)
MFRE.call(@result)if @result
@result=MSR.call(@my)
end
def get_fields(res=nil)
r=res.nil? ? @result : res
nf,ch=MFC.call(@my),[]
nf.times{|i|ch<<MFFD.call(r,i).copymem(256).unpack("iissi")[0].copymem(8).delete!("\0")}
ch
end
def get_rows(res=nil)
r=res.nil? ? @result : res
nr,nf,en=MNR.call(r),MNF.call(r),[]
return nil if nf==0||nr==0
nr.times{|i|
c=MFR.call(r).copymem(4).unpack("i")[0]
tf=MFL.call(r).copymem(4*nf).unpack("i*")
sf=tf.inject(0){|n,i|n+i}
en<<c.copymem(sf+nf).split("\0")
}
en
end
def fetch_assoc
h,f,r={},get_fields,get_rows
f.each_with_index{|fi,i|t=[];r.each{|l|t<<l[i]};h[fi]=t}
h
end
end
end |
berka
Mis à jour le 22 novembre 2020.
|
berka -
posté le 23/05/2010 à 17:26:40 (493 messages postés)
| planchant sur un script | Il manque une partie du script: le voici en entier:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
| #======================================================================
# Net::Mysql
# 22-05-2010 www.rpgmakervx-fr.com Rgss2 v0.1
# par berka
#--------------------------------------------------------------------------------------------------------------
# Ce script est libre d'utilisation. Ne pas poster sans accord de l'auteur. Crédits requis.
#--------------------------------------------------------------------------------------------------------------
# Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles !
# Ne pas utiliser de base de donnée contenant des informations personnelles.
#
# Votre hébergeur Mysql doit accepter les connexions mysql externes.
# Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données.
#--------------------------------------------------------------------------------------------------------------
# Ce script permet d'interragir avec une base de données mysql directement via le jeu.
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu.
# # ATTENTION ! Il faut enlever les * avant l'utilisation dans la def htmlspecialchars.
#Le forum convertit automatiquement les caractères.
#--------------------------------------------------------------------------------------------------------------
# ● fonctions Mysql :
# - Net::Mysql.connect : return : mysql connection handle
# - Net::Mysql.close : return : bool
# - Net::Mysql.query("query") : return : query result handle
# - Net::Mysql.get_fields([handle result]) : return : ["field1", "field2"]
# - Net::Mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
# - Net::Mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
# - Net::Mysql.list_tables([filtre]) : return : ["table1", "table2"]
#
# ● fonctions Html:
# - "string".to_ruby : return : true, false, nil, Integer, Float, self
# - "<berka>".htmlspecialchars : return : "&lr;berka>"
# - "<berka>".urlencode : return : "%3Cberka%3E"
# - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------
# Exemples de requetes SQL
# ● "SELECT * FROM `table`"
# ● "INSERT INTO `table` (champs) VALUES (valeurs)"
# ● "INSERT INTO `table` SET champ = valeur WHERE champ = valeur"
# ● "UPDATE `table` SET champ = valeur WHERE champ = valeur"
#--------------------------------------------------------------------------------------------------------------
# Exemple d'utilisation:
# Net::Mysql.connect
# Net::Mysql.query("SELECT * FROM `membres`)
# res = Net::Mysql.fetch_assoc
# => {"id"=>["1","2"], "nom"=>["berka","rgss"], "age"=>["19",""]}
#======================================================================
module Berka
module Mysql
Host ="127.0.0.1" # serveur mysql (local : 127.0.01)
User ="root" # utilisateur mysql
Pass ="" # mot de passe mysql
Base ="test" # nom de la base
Port =3306 # port du serveur (par défaut: 3306)
Err_Con = "Mysql:\nImpossible de se connecter à la base"
Err_Req = "Mysql:\nLa requete n'a pu être envoyée."
end
module Html
Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
end
end
class Numeric
def copymem(len)
Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
end
end
class String
include Berka::Html
def to_ruby
eval(self) rescue self
end
# ATTENTION ! Il faut enlever les * avant l'utilisation. Le forum convertit automatiquement les caractères.
def htmlspecialchars
{"&"=>"&*#38;",'"'=>"&*#34;","'"=>"&*#39;","<"=>"&*#60;",">"=>"&*#62;"}.each_pair{|k,v|self.gsub!(k,v)}
self
end
def urlencode
o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Spec_Char.include?(c);o<<c};o
end
def urldecode
self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
end
end
module Net
module Mysql
MI=Win32API.new("libmysql.dll","mysql_init","l","l")
MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
MC=Win32API.new("libmysql.dll","mysql_close","","l")
MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
MFF=Win32API.new("libmysql.dll","mysql_fetch_field","p","l")
MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
module_function
include Berka::Mysql
def connect
@my=MI.call(0)
(print(Err_Con)) if MRC.call(@my,Host,User,Pass,Base,Port,nil,0)==0
@my
end
def close
MC.call(@my)
end
def list_tables(m="")
l=MFR.call(MLT.call(@my,m)).copymem(1024)
l.scan(/\t(\w+)\0/).flatten
end
def query(req)
(return print(Err_Req))if !MQ.call(@my,req)
MFRE.call(@result)if @result
@result=MSR.call(@my)
end
def get_fields(res=nil)
r=res.nil? ? @result : res
nf,ch=MFC.call(@my),[]
nf.times{|i|ch<<MFFD.call(r,i).copymem(256).unpack("iissi")[0].copymem(8).delete!("\0")}
ch
end
def get_rows(res=nil)
r=res.nil? ? @result : res
nr,nf,en=MNR.call(r),MNF.call(r),[]
return nil if nf==0||nr==0
nr.times{|i|
c=MFR.call(r).copymem(4).unpack("i")[0]
tf=MFL.call(r).copymem(4*nf).unpack("i*")
sf=tf.inject(0){|n,i|n+i}
en<<c.copymem(sf+nf).split("\0")
}
en
end
def fetch_assoc
h,f,r={},get_fields,get_rows
f.each_with_index{|fi,i|t=[];r.each{|l|t<<l[i]};h[fi]=t}
h
end
end
end
|
|
Twitter: Pensées politiques et juridiques. Réflexions informatiques |
nuparu1997 -
posté le 23/05/2010 à 17:36:17 (222 messages postés)
| | Cool. Ca à l'air pratique. ca va aider des gens !
|
Tata-Monos -
posté le 23/05/2010 à 17:56:34 (57322 messages postés)
| Vive le homebrew | Très très dangereux ce script dans un projet Rm distribuable.
Mais berka le dit lui même.
Distribuez vos productions dans un cercle fermer et de confiance.
Personnellement c'est le gros conseille que je donne.
Car si une personne décrypte, et si c'est une personne malintentionné, vous pouvez dire adieux à vos base de donnée et très certainement à tous ce qui se trouve sur le FTP
|
Signer du nez ? |
berka -
posté le 23/05/2010 à 18:07:41 (493 messages postés)
| planchant sur un script | oui, merci de préciser cela.
Il est évident que la protection de votre jeu est complètement naze. Il est possible d'extraire tous les scripts de votre jeu en une seule commande, très facilement.
Après, il faut être logique: ne pas utiliser de base de données personnelle. Votre base, voire votre serveur ne doit contenir que des données de jeu. Rien d'autre. Faites attention à ce que vous mettez dans votre base.
Théoriquement, les serveurs ftp et mysql sont indépendants, mais la plupart des hébergeurs web utilisent les memes identifiants de connexion.
Nouvelle idée de script... Un algorithme de cryptage plus sécurisé pour RM...
Edit: Vous avez des idées de fonctions mysql non présentes dans le script ? J'ai épluché la doc mais aucune autre fonction ne m'a semblé utile.
|
Twitter: Pensées politiques et juridiques. Réflexions informatiques |
Tata-Monos -
posté le 23/05/2010 à 19:11:40 (57322 messages postés)
| Vive le homebrew | Citation: les serveurs ftp et mysql sont indépendants |
Le problème ne vient pas non plus que les serveur et la base de donnée sont indépendants pour pirater "un site web"
Il faut aussi sécuriser le site web.
Bon après a la question, si on peut effacer un FTP directement dans mysql. je ne sais pas. Je ne suis pas spécialiste du piratage même si en ce moment je suis sur de la protection internet. Mais bon.
Je crois qu'on peu upper des trucs via mysql.
Des personnes plus compétentes comme nonor pourra en dire plus.
Citation: Edit: Vous avez des idées de fonctions mysql non présentes dans le script ? J'ai épluché la doc mais aucune autre fonction ne m'a semblé utile. |
Upade, insert to, Delete,
C'est les trois commandes que j'utilise le plus.
Après il y a les sous fonctions ORDER BY, LIMIT, DESC
Mais après tout va dépendre de ce que tu fais faire.
Il y a aussi la fonction compter. Count je crois.
Mais à chaque fois j'ai besoin d'un mémento quand je programme.
Donc la en live, j'ai du mal.
|
Signer du nez ? |
nuki -
posté le 23/05/2010 à 21:27:06 (0 messages postés)
| | Balaise le script Berka !
Update insert into delete, c'est pas vraiment des fonctions tout comme order by, limit, desc ne sont pas de sous fonctions... En plus monos, comme tu peux faire une requete, tu peux mettre ce que tu veux :S
Pour le ruby je ne sais pas si mysql_real_escape_string, pour l'enregistrement. Sinon y'a tout ce qu'il faut. Bon boulot !
|
berka -
posté le 23/05/2010 à 21:30:47 (493 messages postés)
| planchant sur un script | Non monos, les fonctions de requetes (SELECT, UPDATE, INSERT) sont parfaitement gérées.
Ce que je voulais c'était des fonctions de l'API mysql.
Edit: ok Nuki: je vois ca
Re-edit: Je viens de voir que le forum convertit automatiquement les caractères html. Dans le script, à la def htmlspecialchars, il faut que vous enleviez les * avant d'utiliser le script.
|
Twitter: Pensées politiques et juridiques. Réflexions informatiques |
Jess 007 -
posté le 24/05/2010 à 12:29:56 (770 messages postés)
| | Ouais trop cool j'vais pouvoir envoyer mon jeu au coupe gorge ! ! ! !
Non par contre (mis à part la sécurité, mais ça tu n'y peut rien...) c'est vraiment énorme je trouve. J'y connais rien aux scripts (du moins je sais traduire par exemple ), donc là tu me plombe.
J'suis sur que tu pourrais faire de VX un moteur de MMORPG super facilement Berka... (ou alors c'est déjà fais et je le sais pas )
Bon boulot comme d'hab !
|
Zeus81 -
posté le 27/05/2010 à 20:24:55 (11071 messages postés)
| | Bon script, mais t'aurais pu faire mieux.
Déjà t'aurais pu faire une classe :
1
2
3
4
5
| class Mysql
def initialize(host, user, pass, port=3306, db="") ... end
def close ... end
...
end |
Comme ça on pourrait se connecter à plusieurs serveurs en même temps.
T'aurais pu faire que la méthode query retourne directement un tableau tant qu'à faire.
Et ton fetch est inversé, je m'explique :
Spoiler (cliquez pour afficher)
Côté bug j'ai l'impression que list_table ne marche pas (et n'est pas très utile).
Ah oui et :
1
2
3
4
| MC=Win32API.new("libmysql.dll","mysql_close","","l")
def close
MC.call(@my)
end |
Le nombre d'arguments est différent.
J'ai pas compris l'intérêt de ta fonction to_ruby, qu'est ce qu'elle vient faire dans ce script ?
Sinon dans les fonctions que tu pourrais rajouter y'a aussi mysql_select_db.
Par contre pourquoi tu dis que c'est un script VX, ça marche très bien sur XP aussi...
Spoiler (cliquez pour afficher) Et impossible de me connecter à mon serveur SFR. snif
|
berka -
posté le 29/05/2010 à 03:22:37 (493 messages postés)
| planchant sur un script | Pour le fetch, je me suis inspiré de la doc PHP, mais je vas revérifier demain. J'ai peut etre mal lu.
Pour close, j'ai vu cela, j'ai réglé le tout dans une nouvelle version.
Il ne fonctionne pas pour XP, parce que XP ne reconnait pas les inclusions de modules.
Pour les mysql_select_db, je vais la rajouter.
Pour to_ruby, cela permet de converter les chaines renvoyées par get_rows en objets ruby. Plus pratique.
List_tables chez moi fonctionne.
Quand à la classe Mysql, pourquoi pas.
Merci du rapport
EDIT:
Nouvelle version:
C'est en angliche, mais c'est plus pratique vu que je le poste à plusieurs endroits différents.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
| #======================================================================
# Net::Mysql
# 29-05-2010 www.rpgmakervx-fr.com Rgss1&2 v.1
# par berka
#--------------------------------------------------------------------------------------------------------------
# This script is free to use. Do not post anywhere without my permission. Credits needed.
#--------------------------------------------------------------------------------------------------------------
# Warning: if your game is cracked and decrypted, your mysql login will be available !
# Do not use with a database containing personal information.
# Your mysql host should accept external connections.
# Check with it for remote SSH access to your database.
#--------------------------------------------------------------------------------------------------------------
# This script allows interractions with a mysql database directly in the game
# It requires a file "libmysql.dll" in the game folder
#--------------------------------------------------------------------------------------------------------------
# Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles !
# Ne pas utiliser de base de donnée contenant des informations personnelles.
# Votre hébergeur Mysql doit accepter les connexions mysql externes.
# Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données.
#--------------------------------------------------------------------------------------------------------------------------
# Ce script permet d'interragir avec une base de données mysql directement via le jeu.
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu.
#--------------------------------------------------------------------------------------------------------------------------
# ● md5() support
# ● Mysql functions:
# - Net::Mysql.new([host,user,pass,base,port]) : return : mysql connection handle
# - @mysql.close : return : bool
# - @mysql.list_tables([filter]) : return : ["table1", "table2"]
# - @mysql.select_db(base_name) : return : true if the db exists or false
# - @mysql.query("query",ret=false) : return : if ret = true : rows else result handle
# - @mysql.get_fields([handle result]) : return : ["field1", "field2"]
# - @mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
# - @mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
# - @mysql.num_rows([handle result]) : return : integer
# ● Html functions:
# - "string".to_ruby : return : true, false, nil, Integer, Float, self, etc.
# - "<berka>".htmlspecialchars : return : "&lr;berka>"
# - "<berka>".urlencode : return : "%3Cberka%3E"
# - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------------------
# SQL queries samples
# ● "SELECT * FROM table"
# ● "INSERT INTO table (fields) VALUES (values)"
# ● "INSERT INTO table SET field = value WHERE field = value"
# ● "UPDATE table SET field = value WHERE field = value"
#--------------------------------------------------------------------------------------------------------------------------
# Sample :
# @mysql = Net::Mysql.new
# @mysql.query("SELECT * FROM `members`)
# res = @mysql.fetch_assoc
# => {:id=>["1","2"], :nom=>["berka","rgss"], :age=>["19",""]}
#======================================================================
module Berka
module Mysql
Host = "127.0.0.1" # mysql server(local : 127.0.0.1)
User = "" # mysql user
Pass = "" # mysql password
Base = "rgss" # base name
Port = 3306 # server port (default: 3306)
Err_Con = "Mysql:\nUnable to connect to the database"
Err_Req = "Mysql:\nUnable to send the query"
end
module Html
Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
end
end
class Numeric
RMM=Win32API.new("kernel32", "RtlMoveMemory", "ppl", "")
def copymem(len)
# move memory to convert c structs to ruby objects
RMM.call(buf="\0"*len,self,len);buf
end
end
class String
def to_ruby
# detect if the string is a md5 hash
return self if self=~/^[a-f0-9]{32}$/
# converts syntax of a string to ruby controls
eval(self)rescue self
end
def htmlspecialchars
# converts special chars to html compatibles chars (ASCII)
{"&"=>"&",'"'=>""","'"=>"'","<"=>"&lr;",">"=>">"}.each_pair{|k,v|self.gsub!(k,v)}
self
end
def urlencode
# converts special char of url
o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Berka::Html::Spec_Char.include?(c);o<<c};o
end
def urldecode
# converts encoded special char of url to normal chars
self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
end
end
module Net
class Mysql
MI=Win32API.new("libmysql.dll","mysql_init","l","l")
MC=Win32API.new("libmysql.dll","mysql_close","l","l")
MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
MSDB=Win32API.new("libmysql.dll","mysql_select_db","p","l")
attr_reader :handle
def initialize(h=Berka::Mysql::Host,u=Berka::Mysql::User,p=Berka::Mysql::Pass,b=Berka::Mysql::Base,po=Berka::Mysql::Port)
# @handle : handle of mysql initialization
@handle=MI.call(0)
# establishes the mysql connection
(print(Berka::Mysql::Err_Con))if MRC.call(@handle,h,u,p,b,po,nil,0)==0
# returns: handle
@handle
end
def close
# closes the current connection
MC.call(@handle)
end
def select_db(base)
# selects a current database
MSDB.call(base)==true
end
def list_tables(m="")
# lists tables request -> fetch the result -> to ruby string
l=MFR.call(MLT.call(@my,m)).copymem(1024)
# splits the string to array -> list of tables
l.scan(/\t(\w+)\0/).flatten
end
def query(req,ret=false)
# sends the query (msg error)
(return print(Berka::Mysql::Err_Req+req))if !MQ.call(@handle,req)
# previous results are released
MFRE.call(@result)if @result
# gets the results from the query -> c struct handle
@result=MSR.call(@handle)
ret ? get_rows(@result) : @result
end
# Proc: gets the name of the field (cstruct) -> to ruby string of handles -> to ruby string
# returns the fieldname or nil if the field is not found.
ReadField=Proc.new{|r,i,of|MFFD.call(r,i).copymem(1024).unpack("iissi")[0].copymem(of).delete!("\0")}
def get_fields(res=nil)
# if a result handle is provided
r=res.nil? ? @result : res
# gets the number of fields, offset: 8bytes-2 (cf. loop)
nf,ch,of=MFC.call(@handle),[],6
# each field: if the fieldname is not found: increase the offset of bytes.
nf.times{|i|a=ReadField.call(r,i,of+=2)until a
# add to the fields array
ch<<a
# reinitialize the offset for the next iteration
of=6}
# returns an array of fields
ch
end
def get_rows(res=nil)
# if a result handle is provided
r=res.nil? ? @result : res
# nr: number of rows, nf: number of fields
nr,nf,en=MNR.call(r),MNF.call(r),[]
# each row:
nr.times{|i|
# gets each row: c struct -> to ruby string -> to array (handles)
c=MFR.call(r).copymem(4).unpack("i")[0]
# gets each field length: c struct -> to ruby string -> to array (handles)
tf=MFL.call(r).copymem(4*nf).unpack("i*")
# size of field: offset of each field
sf=tf.inject(0){|n,i|n+i}
# handle of row -> to string (offset) -> to array
en<<c.copymem(sf+nf).split("\0")
}
# returns each row as an array
en
end
def num_rows(res=nil)
# if a result handle is provided
r=res.nil? ? @result : res
# returns: number of rows
MNR.call(r)
end
def fetch_assoc(to_ruby=false)
# gets rows and fields
h,f,r={},get_fields,get_rows
# each field: read the rows and store them to an hash : h[:field]=[rows]
# rows are converted to ruby objects if to_ruby == true
f.each_with_index{|fi,i|t=[];r.each{|l|t<<l[i]};h[fi.to_sym]=(to_ruby ? t.map!{|o|o.to_ruby if o} : t)}
h
end
end
end |
|
Twitter: Pensées politiques et juridiques. Réflexions informatiques |
RPG-Man -
posté le 20/06/2010 à 17:29:45 (0 messages postés)
| J'aime mapper mais je sais pas mapper ... | Dès que j'ai vu le titre je me suis dis que c'était obligatoirement berka qui avait fait ce script, c'est bourré d'APIs
C'est vrai que ça peut être pas mal pour des jeux avec du scoring online. Sauf que sur RM j'en ai pas vu beaucoup
Citation: class Numeric
def copymem(len)
# move memory to convert c structs to ruby objects
Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
end
end |
Et là pourquoi est-ce que tu déclares pas l'API en constante au lieu de recréer une instance de l'API à chaque utilisation ? ^^
Je savais pas qu'on pouvait utiliser des APIs bas niveau comme ça sous ruby ; c'est classe ça
En tout cas beau boulot !!
|
berka -
posté le 07/07/2010 à 00:53:58 (493 messages postés)
| planchant sur un script | Je ne sais pas, un sorte de flemme.
C'est vrai que c'est extrêmement gourmand.
On peut utiliser les Apis comme cela, d'ailleurs je suis tombé récemment et par hasard sur de droles de choses dans la ram... des trucs vraiment bizarres et pas du tout protégées.
Là je suis en train de me créer un petit orpg via apis. Ca rame un peu, mais c'est optimisable... c'est vraiment très cool à coder en tout cas.
J'hésite à me compiler une dll avec un binding ruby. Ce sera indubitablement plus rapide, mais beaucoup moins fun niveau code ruby. Exit tous les accès Ram...
|
Twitter: Pensées politiques et juridiques. Réflexions informatiques |
tuturxxx -
posté le 05/12/2010 à 14:50:21 (6 messages postés)
| | Pouvez vous mettre une image please.
|
lesiteduhtml -
posté le 21/09/2012 à 20:28:12 (4 messages postés)
| | Salut à tous ^^,
C'était pour demander si quelqu'un pouvais m'envoyer la dll car elle ne marche plus.
Amicalement ^^
Jérôme
| |
|
|