testing ml
This commit is contained in:
parent
851d21c3db
commit
4dbbecc131
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
.venv/
|
|
@ -1,12 +1,5 @@
|
||||||
import { Close, UnfoldLess, UnfoldMore } from "@mui/icons-material";
|
import { Close, UnfoldLess, UnfoldMore } from "@mui/icons-material";
|
||||||
import {
|
import { Box, IconButton, Modal, Tooltip, Typography, useTheme } from "@mui/material";
|
||||||
Box,
|
|
||||||
IconButton,
|
|
||||||
Modal,
|
|
||||||
Tooltip,
|
|
||||||
Typography,
|
|
||||||
useTheme,
|
|
||||||
} from "@mui/material";
|
|
||||||
import { FC, ReactNode } from "react";
|
import { FC, ReactNode } from "react";
|
||||||
import { defaultSettings } from "../../lib/settings";
|
import { defaultSettings } from "../../lib/settings";
|
||||||
|
|
||||||
|
@ -40,19 +33,18 @@ export const FloatingDialog: FC<FloatingDialog> = ({
|
||||||
<>
|
<>
|
||||||
{openButton}
|
{openButton}
|
||||||
|
|
||||||
<Modal onClose={close} open={openState}>
|
<Modal
|
||||||
|
onClose={close}
|
||||||
|
open={openState}
|
||||||
|
>
|
||||||
<Box
|
<Box
|
||||||
sx={{
|
sx={{
|
||||||
backdropFilter: `blur(${defaultSettings.style.blur_radius}px)`,
|
backdropFilter: `blur(${defaultSettings.style.blur_radius}px)`,
|
||||||
backgroundColor: theme.palette.background.paper,
|
backgroundColor: theme.palette.background.paper,
|
||||||
borderRadius: maximisedState
|
borderRadius: maximisedState ? "0px" : defaultSettings.style.radius + "px",
|
||||||
? "0px"
|
|
||||||
: defaultSettings.style.radius + "px",
|
|
||||||
display: "flex",
|
display: "flex",
|
||||||
flexDirection: "column",
|
flexDirection: "column",
|
||||||
height: maximisedState
|
height: maximisedState ? "100%" : defaultSettings.style.window_height + "%",
|
||||||
? "100%"
|
|
||||||
: defaultSettings.style.window_height + "%",
|
|
||||||
left: "50%",
|
left: "50%",
|
||||||
maxHeight: maximisedState ? "100vh" : "96vh",
|
maxHeight: maximisedState ? "100vh" : "96vh",
|
||||||
maxWidth: maximisedState ? "100vw" : "96vw",
|
maxWidth: maximisedState ? "100vw" : "96vw",
|
||||||
|
@ -61,11 +53,8 @@ export const FloatingDialog: FC<FloatingDialog> = ({
|
||||||
top: "50%",
|
top: "50%",
|
||||||
transform: "translate(-50%, -50%)",
|
transform: "translate(-50%, -50%)",
|
||||||
transition: "all ease-in-out",
|
transition: "all ease-in-out",
|
||||||
transitionDuration:
|
transitionDuration: defaultSettings.style.transition_duration + "ms",
|
||||||
defaultSettings.style.transition_duration + "ms",
|
width: maximisedState ? "100vw" : defaultSettings.style.window_width + "px",
|
||||||
width: maximisedState
|
|
||||||
? "100vw"
|
|
||||||
: defaultSettings.style.window_width + "px",
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Box
|
<Box
|
||||||
|
@ -75,7 +64,7 @@ export const FloatingDialog: FC<FloatingDialog> = ({
|
||||||
px: 1,
|
px: 1,
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Typography variant="h6">{title}</Typography>
|
<Typography variant='h6'>{title}</Typography>
|
||||||
<Box sx={{ flexGrow: 1 }} />
|
<Box sx={{ flexGrow: 1 }} />
|
||||||
|
|
||||||
{actionButtons}
|
{actionButtons}
|
||||||
|
@ -92,7 +81,7 @@ export const FloatingDialog: FC<FloatingDialog> = ({
|
||||||
{maximisedState ? <UnfoldLess /> : <UnfoldMore />}
|
{maximisedState ? <UnfoldLess /> : <UnfoldMore />}
|
||||||
</IconButton>
|
</IconButton>
|
||||||
</Tooltip>
|
</Tooltip>
|
||||||
<Tooltip title="Close">
|
<Tooltip title='Close'>
|
||||||
<IconButton onClick={close}>
|
<IconButton onClick={close}>
|
||||||
<Close />
|
<Close />
|
||||||
</IconButton>
|
</IconButton>
|
||||||
|
|
|
@ -16,10 +16,16 @@ export const LoadingScreen: FC<LoadingScreenProps> = ({ loadingText }) => {
|
||||||
justifyContent: "center",
|
justifyContent: "center",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<Typography variant="h6" sx={{ mb: 2 }}>
|
<Typography
|
||||||
|
variant='h6'
|
||||||
|
sx={{ mb: 2 }}
|
||||||
|
>
|
||||||
{loadingText}
|
{loadingText}
|
||||||
</Typography>
|
</Typography>
|
||||||
<LinearProgress color="primary" sx={{ width: "80%" }} />
|
<LinearProgress
|
||||||
|
color='primary'
|
||||||
|
sx={{ width: "80%" }}
|
||||||
|
/>
|
||||||
</Box>
|
</Box>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
41
server-ml/main.py
Normal file
41
server-ml/main.py
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
from flask import Flask, request, jsonify
|
||||||
|
import joblib
|
||||||
|
import os
|
||||||
|
|
||||||
|
# first see if the trained model file exists
|
||||||
|
if os.path.exists("model.pkl"):
|
||||||
|
model = joblib.load("model.pkl")
|
||||||
|
else:
|
||||||
|
raise FileNotFoundError("The model.pkl file does not exist.")
|
||||||
|
|
||||||
|
# load the model
|
||||||
|
model = joblib.load("model.pkl")
|
||||||
|
|
||||||
|
# create the flask app
|
||||||
|
app = Flask(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
# app route for the predict endpoint
|
||||||
|
@app.route("/predict", methods=["POST"])
|
||||||
|
def predict():
|
||||||
|
try:
|
||||||
|
# get the input query from the request
|
||||||
|
data = request.json
|
||||||
|
query = data.get("query", "")
|
||||||
|
|
||||||
|
if not query:
|
||||||
|
return jsonify({"error": "No query provided."}), 400
|
||||||
|
|
||||||
|
# make a prediction
|
||||||
|
# the model expects an array
|
||||||
|
prediction = model.predict([query])[0]
|
||||||
|
bad = bool(prediction)
|
||||||
|
|
||||||
|
return jsonify({"bad": bad}), 200
|
||||||
|
|
||||||
|
except Exception as error:
|
||||||
|
return jsonify({"error": str(error)}), 500
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
app.run(debug=True, host="0.0.0.0", port=5000)
|
BIN
server-ml/model.pkl
Normal file
BIN
server-ml/model.pkl
Normal file
Binary file not shown.
3
server-ml/requirements.txt
Normal file
3
server-ml/requirements.txt
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
flask
|
||||||
|
scikit-learn
|
||||||
|
joblib
|
35
server-ml/training.py
Normal file
35
server-ml/training.py
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
import joblib
|
||||||
|
from sklearn.feature_extraction.text import CountVectorizer
|
||||||
|
from sklearn.linear_model import LogisticRegression
|
||||||
|
from sklearn.pipeline import make_pipeline
|
||||||
|
from sklearn.model_selection import train_test_split
|
||||||
|
|
||||||
|
# random data
|
||||||
|
data = [
|
||||||
|
("' OR '1'='1", 1),
|
||||||
|
("SELECT * FROM users WHERE id=1", 1),
|
||||||
|
("DROP TABLE users;", 1),
|
||||||
|
("username=admin'--", 1),
|
||||||
|
("hello world", 0),
|
||||||
|
("this is a normal query", 0),
|
||||||
|
("select data from table", 0),
|
||||||
|
("just another harmless input", 0),
|
||||||
|
]
|
||||||
|
|
||||||
|
queries, labels = zip(*data)
|
||||||
|
|
||||||
|
# split data into training and testing sets
|
||||||
|
X_train, X_test, y_train, y_test = train_test_split(
|
||||||
|
queries, labels, test_size=0.2, random_state=42
|
||||||
|
)
|
||||||
|
|
||||||
|
# build a pipeline with a vectorizer and a logistic regression model
|
||||||
|
pipeline = make_pipeline(CountVectorizer(), LogisticRegression())
|
||||||
|
|
||||||
|
# train the model
|
||||||
|
pipeline.fit(X_train, y_train)
|
||||||
|
|
||||||
|
# save the model to a file
|
||||||
|
joblib.dump(pipeline, "model.pkl")
|
||||||
|
|
||||||
|
print("Model trained and saved to model.pkl")
|
Loading…
Reference in a new issue