當前位置:首頁 » 編程語言 » python防注入

python防注入

發布時間: 2022-09-07 20:09:29

A. python 怎麼調用odbc

入門
連接到資料庫
調用connect方法並傳入ODBC連接字元串,其會返回一個connect對象。通過connect對象,調用cursor()方法,可以獲取一個游標cursor。如下代碼示例:
import pyodbc
#連接示例: Windows系統, 非DSN方式, 使用微軟 sql Server 資料庫驅動
cnxn =pyodbc.connect('DRIVER={SQL Server};SERVER=localhost;PORT=1433;DATABASE=testdb;UID=me;PWD=pass')
#連接示例: Linux系統, 非DSN方式, 使用FreeTDS驅動
cnxn =pyodbc.connect('DRIVER={FreeTDS};SERVER=localhost;PORT=1433;DATABASE=testdb;UID=me;PWD=pass;TDS_Version=7.0')
#連接示例:使用DSN方式
cnxn = pyodbc.connect('DSN=test;PWD=password')
# 打開游標
cursor =cnxn.cursor()
以上示例只是標准示例,具體的ODBC連接字元串以你自己使用的驅動為准。
查詢一些數據
所有SQL語句都使用Cursor.execute()方法執行。比如select語句會返回一些結果行,你可以使用游標(Cursor)相關的函數功能(fetchone,fetchall,fetchmany)對結果進行檢索。
Cursor.fetchone 用於返回一個單行( Row)對象:
cursor.execute("selectuser_id, user_name from users")
row =cursor.fetchone()
if row:
print(row)
Row 對象是類似一個python元組(tuples),不過也可以通過列名稱來訪問,例如:
cursor.execute("selectuser_id, user_name from users")
row =cursor.fetchone()
print('name:',row[1]) # 使用列索引號來訪問數據
print('name:',row.user_name) # 或者直接使用列名來訪問數據
當所有行都已被檢索,則fetchone返回None.
while 1:
row = cursor.fetchone()
if not row:
break
print('id:', row.user_id)
Cursor.fetchall方法返回所有剩餘行並存儲於一個列表中。如果沒有行,則返回一個空列表。(注意:如果有很多行,會造成大量內存佔用。Fetchall會一次性將所有數據查詢到本地,然後再遍歷)
cursor.execute("selectuser_id, user_name from users")
rows = cursor.fetchall()
for row in rows:
print(row.user_id, row.user_name)
如果並不在意數據處理時間,可以使用游標本身作為一個迭代器,逐行迭代。這樣可以節省大量的內存開銷,但是由於和數據來回進行通信,速度會相對較慢:
cursor.execute("selectuser_id, user_name from users"):
for row in cursor:
print(row.user_id, row.user_name)
由於Cursor.execute總是返回遊標(cursor), 所以也可以簡寫成:
for row incursor.execute("select user_id, user_name from users"):
print(row.user_id, row.user_name)
我們可以在execut中使用」」」三重引號,來應用多行SQL字元串。這樣sql的可讀性大大增強。這是python特有的特性:
cursor.execute(
"""
select user_id, user_name
from users
where last_logon < '2001-01-01'
and bill_overe = 1
""")
SQL參數
ODBC支持使用問號作為SQL的查詢參數佔位符。可以在execute方法的SQL參數之後,提供SQL參數佔位符的值:
cursor.execute(
"""
select user_id, user_name
from users
where last_logon < ?
and bill_overe = ?
""", '2001-01-01', 1)
這樣做可以防止SQL注入攻擊,提高安全性。如果使用不同的參數反復執行相同的SQL它效率會更高,這種情況下該SQL將只預裝(prepared )一次。(pyodbc只保留最後一條編寫的語句,所以如果程序在語句之間進行切換,每次都會預裝,造成多次預裝。)
Python的DB API指定參數應以序列(sequence)對象傳遞,所以pyodbc也支持這種方式:
cursor.execute(
"""
select user_id, user_name
from users
where last_logon < ?
and bill_overe = ?
""", ['2001-01-01', 1])
插入數據
插入數據使用相同的函數 - 通過傳入insert SQL和相關佔位參數執行插入數據:
cursor.execute("insertinto procts(id, name) values ('pyodbc', 'awesome library')")
cnxn.commit()
cursor.execute("insertinto procts(id, name) values (?, ?)", 'pyodbc', 'awesome library')
cnxn.commit()
注意:調用cnxn.commit()。發成錯誤可以回滾。具體需要看資料庫特性支持情況。如果數據發生改變,最好進行commit。如果不提交,則在連接中斷時,所有數據會發生回滾。
更新和刪除數據
更新和刪除工作以同樣的方式:通過特定的SQL來執行。通常我們都想知道更新和刪除的時候有多少條記錄受到影響,可以使用Cursor.rowcount來獲取值:
cursor.execute("deletefrom procts where id <> ?", 'pyodbc')
print('Deleted {}inferior procts'.format(cursor.rowcount))
cnxn.commit()
由於execute 總是返回遊標(允許你調用鏈或迭代器使用),有時我們直接這樣簡寫:
deleted =cursor.execute("delete from procts where id <> 'pyodbc'").rowcount
cnxn.commit()
注意一定要調用commit。否則連接中斷時會造成改動回滾。
技巧和竅門
引號
於單引號SQL是有效的,當值需要使用單引號時,使用用雙引號包圍的SQL:
cursor.execute("deletefrom procts where id <> 'pyodbc'")
如果使用三重引號, 我們可以這樣使用單引號:
cursor.execute(
"""
delete
from procts
where id <> 'pyodbc'
""")
列名稱
Microsoft SQLServer之類的一些資料庫不會產生計算列的列名,在這種情況下,需要通過索引來訪問列。我們也可以使用sql列別名的方式,為計算列指定引用名稱:
row =cursor.execute("select count(*) as user_count fromusers").fetchone()
print('{}users'.format(row.user_count)
當然也可以直接使用列索引來訪問列值:
count =cursor.execute("select count(*) from users").fetchone()[0]
print('{}users'.format(count)
注意,上例的首列不能是Null。否則fetchone方法將返回None並且會報NoneType不支持索引的錯誤。如果有一個默認值,經常可以是ISNULL或合並:
maxid =cursor.execute("select coalesce(max(id), 0) fromusers").fetchone()[0]
自動清理
連接(默認)在一個事務中。如果一個連接關閉前沒有提交,則會進行當前事務回滾。很少需要finally或except 語句來執行人為的清理操作,程序會自動清理。
例如,如果下列執行過程中任何一條SQL語句出現異常,都將引發導致這兩個游標執行失效。從而保證原子性,要麼所有數據都插入發生,要麼所有數據都不插入。不需要人為編寫清理代碼。
cnxn =pyodbc.connect(...)
cursor = cnxn.cursor()
cursor.execute("insertinto t(col) values (1)")
cursor.execute("insertinto t(col) values (2)")
cnxn.commit()

B. python寫的程序怎樣加密

對Python加密時可能會有兩種形式,一種是對Python轉成的exe進行保護,另一種是直接對.py或者.pyc文件進行保護,下面將列舉兩種形式的保護流程。

1、對python轉exe加殼

下載最新版VirboxProtector加殼工具,使用加殼工具直接對demo.exe進行加殼操作

2、對.py/.pyc加密

第一步,使用加殼工具對python安裝目錄下的python.exe進行加殼,將python.exe拖入到加殼工具VirboxProtector中,配置後直接點擊加殼。

第二步,對.py/.pyc進行加密,使用DSProtector對.py/.pyc進行保護。

安全技術:

l虛擬機外殼:精銳5的外殼保護工具,創新性的引入了預分析和自動優化引擎,有效的解決了虛擬化保護代碼時的安全性和性能平衡問題。

l碎片代碼執行:利用自身成熟的外殼中的代碼提取技術,抽取大量、大段代碼,加密混淆後在安全環境中執行,最大程度上減少加密鎖底層技術和功能的依賴,同時大量大段地移植又保證了更高的安全性。

lVirbox加密編譯引擎:集編譯、混淆等安全功能於一身,由於在編譯階段介入,可優化空間是普遍虛擬化技術無法比擬的,對代碼、變數的混淆程度也有了根本的提升。

l反黑引擎:內置R0級核心態反黑引擎,基於黑客行為特徵 的(反黑資料庫)反制手段。精準打擊調試、注入、內存修改等黑客行為,由被動挨打到主動防護。

加密效果:

加密之前

以pyinstall 的打包方式為例,使用pyinstxtractor.py文件對log_322.exe進行反編譯,執行後會生成log_322.exe_extracted文件夾,文件夾內會生成pyc文件。

成功之後會在同目錄下生成一個文件夾

C. 動態Python代碼注入怎麼做才能預防安全性

比如說, 文件處理時, 經常習慣取個變數path, 但又經常from os import path
可以這么用:
import os.path
# import os.path後, 使用時, 需要完整輸入os.path
# 相對於import os總模塊而言, import os.path能避免無用的引入
path = os.path.join("/tmp", filename)

D. Python常見的漏洞都有什麼

首先是解析XML漏洞。如果您的應用程序載入和解析XML文件,那麼您可能正在使用XML標准庫模塊。有一些針對XML的常見攻擊。大多數是DoS風格(旨在破壞系統而不是竊取數據)。這些攻擊很常見,尤其是在解析外部(即不受信任的)XML文件時。一種這樣的攻擊是“十億笑”,因為載入的文件包含許多(十億)“笑”。您可以載入XML實體文件,當XML解析器嘗試將此XML文件載入到內存中時,它將消耗許多GB的內存。

要知道SSTI是ServerSideTemplateInjection,是Web開發中使用的模板引擎。模板引擎可以將用戶界面和業務數據分離,邏輯代碼和業務代碼也可以相應分離,代碼復用變得簡單,開發效率也提高了。模板在伺服器端使用,數據由模板引擎渲染,然後傳遞給用戶,可以為特定用戶/特定參數生成對應的頁面。我們可以對比一下網路搜索,搜索不同詞條得到的結果頁面是不一樣的,但是頁面的邊框基本是一樣的。

E. Python正則表達式問題,為什麼圖中這樣寫會返回字元串中間的部分,不是應該返回整個字元串嗎

作為php程序員,特別是新手,對於互聯網的險惡總是知道的太少,對於外部的入侵有很多時候是素手無策的,他們根本不知道黑客是如何入侵的、提交入侵、上傳漏洞、sql 注入、跨腳本攻擊等等。作為最基本的防範你需要注意你的外部提交,做好第一面安全機制處理防火牆。

規則 1:絕不要信任外部數據或輸入

關於Web應用程序安全性,必須認識到的第一件事是不應該信任外部數據。外部數據(outside data) 包括不是由程序員在PHP代碼中直接輸入的任何數據。在採取措施確保安全之前,來自任何其他來源(比如 GET 變數、表單 POST、資料庫、配置文件、會話變數或Cookie)的任何數據都是不可信任的。

例如,下面的數據元素可以被認為是安全的,因為它們是在PHP中設置的。

清單 1. 安全無暇的代碼
復制代碼 代碼如下:
$myUsername = 『tmyer';
$arrayarrayUsers = array(『tmyer', 『tom', 『tommy');
define(「GREETING」, 『Hello there' . $myUsername);
?>

但是,下面的數據元素都是有瑕疵的。

清單 2. 不安全、有瑕疵的代碼
復制代碼 代碼如下:
$myUsername = $_POST['username']; //tainted!
$arrayarrayUsers = array($myUsername, 『tom', 『tommy'); //tainted!
define(「GREETING」, 『hello there' . $myUsername); //tainted!
?>

為什麼第一個變數$myUsername 是有瑕疵的?因為它直接來自表單 POST。用戶可以在這個輸入域中輸入任何字元串,包括用來清除文件或運行以前上傳的文件的惡意命令。您可能會問,「難道不能使用只接受字母 A-Z 的客戶端(Javascrīpt)表單檢驗腳本來避免這種危險嗎?」是的,這總是一個有好處的步驟,但是正如在後面會看到的,任何人都可以將任何錶單下載到自己的機器上,修改它,然後重新提交他們需要的任何內容。

解決方案很簡單:必須對$_POST['username'] 運行清理代碼。如果不這么做,那麼在使用$myUsername的任何其他時候(比如在數組或常量中),就可能污染這些對象。對用戶輸入進行清理的一個簡單方法是,使用正則表達式來處理它。在這個示例中,只希望接受字母。將字元串限制為特定數量的字元,或者要求所有字母都是小寫的,這可能也是個好主意。

清單 3. 使用戶輸入變得安全
復制代碼 代碼如下:
$myUsername = cleanInput($_POST['username']); //clean!
$arrayarrayUsers = array($myUsername, 『tom', 『tommy'); //clean!
define(「GREETING」, 『hello there' . $myUsername); //clean!
function cleanInput($input){ $clean = strtolower($input);
$clean = preg_replace(「/[^a-z]/」, 「」, $clean);
$clean = substr($clean,0,12);return $clean;
}
?>

規則 2:禁用那些使安全性難以實施的PHP設置

已經知道了不能信任用戶輸入,還應該知道不應該信任機器上配置 PHP 的方式。例如,要確保禁用 register_globals。如果啟用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替換同名的 GET 或 POST 字元串。通過禁用這個設置,PHP 強迫您在正確的名稱空間中引用正確的變數。要使用來自表單 POST 的變數,應該引用 $_POST['variable']。這樣就不會將這個特定變數誤會成 cookie、會話或 GET 變數。

規則 3:如果不能理解它,就不能保護它

一些開發人員使用奇怪的語法,或者將語句組織得很緊湊,形成簡短但是含義模糊的代碼。這種方式可能效率高,但是如果您不理解代碼正在做什麼,那麼就無法決定如何保護它。例如,您喜歡下面兩段代碼中的哪一段?

清單 4. 使代碼容易得到保護
復制代碼 代碼如下:
//obfuscated code
$input = (isset($_POST['username']) ? $_POST['username']:」);
//unobfuscated code
$input = 」;
if (isset($_POST['username'])){
$input = $_POST['username'];
}else{
$input = 」;
}

在第二個比較清晰的代碼段中,很容易看出 $input 是有瑕疵的,需要進行清理,然後才能安全地處理。

規則 4:「縱深防禦」 是新的法寶

本教程將用示例來說明如何保護在線表單,同時在處理表單的 PHP 代碼中採用必要的措施。同樣,即使使用 PHP regex 來確保 GET 變數完全是數字的,仍然可以採取措施確保 SQL 查詢使用轉義的用戶輸入。縱深防禦不只是一種好思想,它可以確保您不會陷入嚴重的麻煩。既然已經討論了基本規則,現在就來研究第一種威脅:SQL 注入攻擊。

◆防止SQL注入攻擊

在SQL注入攻擊中,用戶通過操縱表單或 GET 查詢字元串,將信息添加到資料庫查詢中。例如,假設有一個簡單的登錄資料庫。這個資料庫中的每個記錄都有一個用戶名欄位和一個密碼欄位。構建一個登錄表單,讓用戶能夠登錄。
復制代碼 代碼如下:
<html>
<head>
<title>Login</title>
</head>
<body>
<form action=」verify.php」 method=」post」>
<p><label for='user'>Username</label>
<input type='text' name='user' id='user'/>
</p> <p><label for='pw'>Password</label>
<input type='password' name='pw' id='pw'/>
</p> <p><input type='submit' value='login'/></p>
</form>
</body>
</html>

這個表單接受用戶輸入的用戶名和密碼,並將用戶輸入提交給名為verify.php的文件。在這個文件中,PHP處理來自登錄表單的數據,如下所示:

清單 5. 不安全的 PHP 表單處理代碼
復制代碼 代碼如下:
<?php
$okay = 0;
$username = $_POST['user'];
$pw = $_POST['pw'];
$sql = 「select count(*) as ctr from users where username='
」.$username.」『 and password='」. $pw.」『 limit 1″;
$result = MySQL_query($sql);
while ($data = mysql_fetch_object($result)){
if ($data->ctr == 1){
//they're okay to enter The application!
$okay = 1;
}
}
if ($okay){
$_SESSION['loginokay'] = true;
header(「index.php」);
}else{
header(「login.php」);
}
?>

這段代碼看起來沒問題,對嗎?世界各地成百(甚至成千)的 PHP/MySQL 站點都在使用這樣的代碼。它錯在哪裡?好,記住 「不能信任用戶輸入」。這里沒有對來自用戶的任何信息進行轉義,因此使應用程序容易受到攻擊。具體來說,可能會出現任何類型的SQL注入攻擊。例如,如果用戶輸入 foo 作為用戶名,輸入 『 or '1′='1 作為密碼,那麼實際上會將以下字元串傳遞給 PHP,然後將查詢傳遞給 MySQL:
復制代碼 代碼如下:
<?php
$sql = 「select count(*) as ctr from users where username=
'foo' and password=」 or '1′='1′ limit 1″;
?>

這個查詢總是返回計數值 1,因此 PHP 會允許進行訪問。通過在密碼字元串的末章節附註入某些惡意 SQL,黑客就能裝扮成合法的用戶。解決這個問題的辦法是,將 PHP 的內置 mysql_real_escape_string() 函數用作任何用戶輸入的包裝器。這個函數對字元串中的字元進行轉義,使字元串不可能傳遞撇號等特殊字元並讓 MySQL 根據特殊字元進行操作。清單7展示了帶轉義處理的代碼。

清單7展示了帶轉義處理的代碼
復制代碼 代碼如下:
<?php
$okay = 0;
$username = $_POST['user'];
$pw = $_POST['pw'];
$sql = "select count(*) as ctr from users where username='".mysql_real_
_string($username)."' and password='". mysql_real_escape_string($pw)."'
limit 1";
$result = mysql_query($sql);
while ($data = mysql_fetch_object($result)){
if ($data->ctr == 1){ //they're okay to enter the
application!
$okay = 1;
}
}
if ($okay){
$_SESSION['loginokay'] = true;
header("index.php");
}
else{
header("login.php");
}
?>

使用 mysql_real_escape_string() 作為用戶輸入的包裝器,就可以避免用戶輸入中的任何惡意 SQL 注入。如果用戶嘗試通過 SQL 注入傳遞畸形的密碼,那麼會將以下查詢傳遞給資料庫:
復制代碼 代碼如下:
select count(*) as ctr from users where username='foo' and password=
'\' or \'1\'=\'1′ limit 1″

F. 【Python基礎】django如何防止sql注入

python+Django 防止SQL注入
先看看那種容易被注入的SQL
id = 11001
sql = """
SELECT
id,
name,
age
FROM
student
WHERE
id = """+id+"""
"""
cursor = connection.cursor()
try:
cursor.execute(sql)
result = cursor.fetchall()
for result1 in result:
// 代碼塊
pass
finally:
cursor.close()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
一般來說寫SQL語句在程序中,若有where條件一般都可能會去直接拼接,到那時這種方式容易被SQL注入,首先說明下什麼是SQL的注入,簡單來說就是你寫的SQL被別人在頁面上拼接了SQL。比如拼接1=1這種條件,如果登錄介面被注入1=1那麼就可以隨意進入你的程序了。所以才要防止SQL的注入。
下面再來看看防止SQL的注入
id = 11001
params = []
sql = """
SELECT
id,
name,
age
FROM
student
WHERE
id = %s
"""
params.append(id)
cursor = connection.cursor()
try:
cursor.execute(sql, params)
result = cursor.fetchall()
for result1 in result:
// 代碼塊
pass
finally:
cursor.close()
我們把直接拼接的條件變數放入集合再把集合帶入執行SQL的方法,就可以避免被注入的風險,在SQL的條件中使用%s進行站位,要注意的是這個%s是有順序的,比如說上面這個SQL後面在跟一個條件name=%s那麼下面的params集合也要多加一個元素params.append(name)這個時候name是在id後面的在集合中。這樣可以一一對應,但如果要是把params.append(name)寫在了params.append(id)前面SQL執行就會出現id=name and name = id 的條件就亂了,甚至還會報錯。
使用connection完畢之後一定要記得close,connection是django.db中的,導入不要導入錯了。

G. cmd無法運行python,會被360提醒有遠程線程注入

你是否安裝了editplus?系統是win10 1903?
可能是執行Python時,優先調用了WindowsApps目錄的,導致問題發生。
你可以嘗試修改path環境變數,將Python路徑的放最前面。
執行 where Python.exe查看執行Python時,環境變數順序。

熱點內容
資料庫十張表 發布:2025-01-13 10:41:50 瀏覽:395
仿php 發布:2025-01-13 10:41:40 瀏覽:811
後綴解壓什麼意思 發布:2025-01-13 10:35:17 瀏覽:185
索尼安卓11如何退回安卓10 發布:2025-01-13 10:24:09 瀏覽:127
程序編譯結構 發布:2025-01-13 10:24:08 瀏覽:90
創建郵箱地址伺服器連接錯誤 發布:2025-01-13 09:49:24 瀏覽:723
linux編輯文檔 發布:2025-01-13 09:47:51 瀏覽:435
二手製冷壓縮機 發布:2025-01-13 09:43:59 瀏覽:585
網魚電腦密碼多少 發布:2025-01-13 09:33:46 瀏覽:464
如何取消子賬號密碼 發布:2025-01-13 09:22:41 瀏覽:347